Lissage / interpolation de raster en Python avec GDAL?

20

Je développe en Python et j'utilise GDAL d'OSGEO pour manipuler et interagir avec les rasters et les fichiers de formes.

Je veux prendre un fichier de formes qui a des entités ponctuelles et l'interpoler dans un raster de surface. En ce moment, j'utilise la méthode 'RasterizeLayer' qui brûle une valeur de l'entité ponctuelle dans le raster (qui est définie avec toutes les valeurs nodata) mais laisse tous les pixels intacts comme valeur 'nodata'. Je me retrouve donc avec un raster de type damier.

Ce que j'ai après avoir utilisé RasterizeLayer:

[Raster utilisant gdal.rasterizelayer]

Ce que je veux pour un produit final:

entrez la description de l'image ici

Je crois que la fonction que je recherche est connue sous le nom de «Spline_sa ()» à partir de l'importation arcgisscripting.

GDAL a-t-il une fonction similaire ou existe-t-il une méthode différente pour obtenir la sortie souhaitée?

Doug
la source

Réponses:

18

Je voudrais jeter un œil à NumPy et Scipy - il y a un bon exemple d'interpolation de données de points dans le livre de recettes SciPy en utilisant scipy.interpolate.griddata fonction . Évidemment, cela nécessite que vous ayez les données dans un tableau numpy;

  • En utilisant les liaisons python GDAL, vous pouvez lire vos données dans Python en utilisant gdal.Dataset.ReadAsArray() d'un raster.
  • Avec OGR, vous parcourez la couche d'entités et extrayez les données de points du fichier de formes (ou mieux encore, écrivez le fichier de formes dans un fichier CSV à l'aide de GEOMETRY=AS_XYZ[voir le format de fichier OGR CSV] et lisez le csv dans Python).

Une fois que vous avez une sortie maillée, vous pouvez ensuite utiliser GDAL pour écrire le tableau numpy résultant dans un raster.

Enfin, si vous n'avez pas de chance avec la bibliothèque d'interpolation Scipy, vous pouvez également essayer scipy.ndimage .

om_henners
la source
Merci pour l'aide! Je donne un tourbillon à l'approche Scipy.interpolate.griddata. Je publierai mes résultats.
Doug
1
Je m'excuse d'avoir mis autant de temps à revenir sur ce post. La réponse ci-dessus est essentiellement ce que j'ai fait pour résoudre mon problème. J'ai utilisé la bibliothèque d'interpolation Scipy pour remplir ces espaces nodata, puis je l'ai réécrite dans la bande raster. Merci pour l'aide les gars!
Doug
@Doug Pas de soucis - heureux de guérir!
om_henners
1
Quelle est la vitesse de cette solution? Peut-il être utilisé pour une grille 10k x 10k où seule chaque 100x100 est une valeur connue? J'ai essayé gdal_fillnodata qui est incroyablement rapide par rapport à n'importe quelle interpolation mais cela ne fonctionne pas bien pour les points trop clairsemés. En ce moment, j'utilise la triangulation de Saga, mais elle est très lente pour les tableaux moyens et échoue avec les grands.
Miro
12

Jetez un œil à l' API de maillage GDAL . Je ne sais pas si cela est exposé dans les liaisons Python, mais sinon, vous appelez l'appel à l' utilitaire gdal_grid via le module de sous processus .

L'API de grille GDAL utilise uniquement la pondération de distance inverse, la moyenne mobile et le plus proche voisin, elle n'implémente pas de splines. Une autre option consiste à utiliser Scipy .

user2856
la source
1

Un peu vieux pour ce fil mais j'ai écrit un module simple qui utilise l'algorithme KNN de sklearn appelé skspatial.

https://github.com/rosskush/skspatial

Vous pouvez importer un fichier de formes à l'aide de géopandas et sélectionner une colonne et elle interpolera une surface qui peut être exportée vers un raster. C'est très basique et probablement pas la meilleure façon de le faire, mais il garde au moins tout en python pur.

Rosskush
la source