Raster in Python mit GDAL glätten / interpolieren?

20

Ich entwickle in Python und verwende GDAL von OSGEO, um Raster und Shapefiles zu manipulieren und mit ihnen zu interagieren.

Ich möchte ein Shapefile mit Punkt-Features in ein Oberflächen-Raster interpolieren. Im Moment verwende ich die Methode 'RasterizeLayer', die einen Wert aus dem Punkt-Feature in das Raster (das mit allen Knotendatenwerten festgelegt ist) brennt, aber alle unberührten Pixel als 'Knotendaten'-Wert zurücklässt. Ich habe also ein Schachbrettmuster.

Was ich nach der Verwendung von RasterizeLayer habe:

[Raster von der Verwendung von gdal.rasterizelayer]

Was ich mir für ein Endprodukt wünsche:

Bildbeschreibung hier eingeben

Ich glaube, die gesuchte Funktion ist aus dem ArcGisscripting-Import als "Spline_sa ()" bekannt.

Hat GDAL eine ähnliche Funktion oder gibt es eine andere Methode, um die gewünschte Ausgabe zu erhalten?

Doug
quelle

Antworten:

18

Ich würde einen Blick auf NumPy und Scipy werfen - es gibt ein gutes Beispiel für die Interpolation von Punktdaten im SciPy-Kochbuch mit der Funktion scipy.interpolate.griddata . Dies setzt natürlich voraus, dass Sie die Daten in einem numpy-Array haben.

  • Mit den GDAL-Python-Bindungen können Sie Ihre Daten in Python einlesen und gdal.Dataset.ReadAsArray()für ein Raster verwenden.
  • Mit OGR würden Sie die Feature-Ebene durchlaufen und Punktdaten aus dem Shapefile extrahieren (oder noch besser, Sie schreiben das Shapefile in eine CSV mit GEOMETRY=AS_XYZ[siehe das OGR-CSV-Dateiformat] und lesen die CSV in Python).

Sobald Sie eine gerasterte Ausgabe erhalten haben, können Sie das resultierende Numpy-Array mit GDAL in ein Raster schreiben.

Wenn Sie mit der Scipy-Interpolationsbibliothek kein Glück haben, können Sie auch scipy.ndimage ausprobieren .

om_henners
quelle
Danke für die Hilfe! Ich gebe der Annäherung von Scipy.interpolate.griddata einen Wirbel. Ich werde meine Ergebnisse zurückschicken.
Doug
1
Ich entschuldige mich dafür, dass ich so lange gebraucht habe, um auf diesen Beitrag zurückzukommen. Die obige Antwort ist im Grunde das, was ich getan habe, um mein Problem zu lösen. Ich habe die Scipy-Interpolationsbibliothek verwendet, um diese Knotendatenbereiche auszufüllen, und habe sie dann zurück in das Rasterband geschrieben. Danke für die Hilfe Jungs!
Doug
@Doug Keine Sorge - glücklich zu heilen!
Om_henners
1
Wie schnell ist diese Lösung? Kann es für ein 10k x 10k-Raster verwendet werden, bei dem nur alle 100x100 Werte bekannt sind? Ich habe gdal_fillnodata ausprobiert, was im Vergleich zu jeder Interpolation unglaublich schnell ist, aber bei zu spärlichen Punkten funktioniert es nicht gut. In diesem Moment verwende ich Triangulation von Saga, aber es ist für mittlere Arrays sehr langsam und scheitert mit großen.
Miro
12

Schauen Sie sich die GDAL-Gridding-API an . Ich weiß nicht, ob dies in den Python-Bindungen enthalten ist, aber wenn nicht, rufen Sie das Dienstprogramm gdal_grid über das Subprozessmodul auf .

Die GDAL-Raster-API verwendet nur Inverse Distance Weighting, Moving Average und Nearest Neighbor. Splines werden nicht implementiert. Eine andere Möglichkeit ist die Verwendung von Scipy .

user2856
quelle
1

Ein bisschen alt für diesen Thread, aber ich habe ein einfaches Modul geschrieben, das den KNN-Algorithmus von sklearn namens skspatial verwendet.

https://github.com/rosskush/skspatial

Sie können ein Shapefile mithilfe von Geopandas importieren und eine Spalte auswählen. Dadurch wird eine Oberfläche interpoliert, die in ein Raster exportiert werden kann. Es ist sehr einfach und wahrscheinlich nicht der beste Weg, es zu tun, aber es hält zumindest alles reine Python.

rosskush
quelle