Ich habe GDAL mit dem Osgeo-Installationsprogramm installiert. Wie kann ich programmgesteuert eine Rasterebene mit einer Vektorebene beschneiden? Gibt es eine GDAL-API, die mir dabei helfen kann? Ich benutze Python.
26
Ich bin mir nicht sicher, was die GDAL-API angeht, da void* GDALWarpOptions::hCutline
in den Warp-Optionen auf das Warp-API-Tutorial verwiesen wird , aber keine expliziten Beispiele. Sind Sie sicher, dass Sie eine programmatische Antwort benötigen? Die Befehlszeilen-Dienstprogramme können dies sofort tun:
ogrinfo
diese Option, um das Ausmaß des Clipping-Shapefiles zu bestimmengdal_translate
diese Taste, um die Ausmaße der Form anzupassengdalwarp
mit -cutline
ParameterDie Schritte 2 und 3 dienen der Optimierung gdalwarp -cutline ...
.
Weitere Informationen finden Sie unter Ausschneiden von Rastern mit GDAL mithilfe von Polygonen von Linfinity für linuxbasierte Lösungen, die alle in einem Skript zusammengefasst sind. Ein weiteres Beispiel für eine Schnittlinie ist in Michael Coreys Tutorial zu sehen, in dem Sie für Mapnik Schattierungen erstellen .
Joel Lawhead von GeospatialPython hat ein vollständiges Python-Beispiel in Clip-Raster mit Shapefile , einem gut geschriebenen Tutorial. Sie müssen die Python Image Library (PIL) installieren, die nicht in Osgeo4W enthalten ist (für die Sie möglicherweise o4w Python zur Windows-Registrierung hinzufügen müssen , damit das Installationsprogramm funktioniert).
quelle
Es scheint, dass dieses Thema immer wieder auftaucht. Ich selbst wusste nicht, dass GDAL> 1.8 so weit fortgeschritten ist, dass Sie für diese Aufgabe bereits eine faire Befehlszeilensteuerung haben.
Der Kommentar von Mike Toews ist ziemlich nützlich, aber Sie könnten einfach zum Beispiel tun:
Sie können diesen Befehl in ein Python-Skript mit dem hervorragenden Unterprozessmodul einbinden.
Eine Sache, die für mich wirklich problematisch war, war, dass ich eine minimale Lösung für dieses Problem liefern musste, was bedeutet, dass es so einfach wie möglich ist und nicht viele externe Abhängigkeiten erfordert. Die Verwendung der Python-Imaging-Bibliothek wie im Tutorial von Joel Lawhead ist ordentlich, aber ich habe die folgende Lösung gefunden: Verwenden von Numpy-maskierten Arrays.
Ich weiß nicht, ob es besser ist, aber das war es, was ich damals wusste (vor 3 Jahren ...).
Ursprünglich habe ich einen gültigen Datenbereich innerhalb des ursprünglichen Rasters erstellt (z. B. das Ausmaß des Ausgabe-Rasters, in dem es dasselbe ist), aber ich mochte die Idee, das Raster auch kleiner zu machen (z. B. -crop_to_cutline), also habe ich
world2Pixel
von Joel Lawhead übernommen. Hier ist meine eigene Lösung:Eine vollständige Beschreibung der
class MaskRaster
und ihrer Methoden finden Sie im Github meines Projekts .Mit diesem Code müssen Sie weiterhin GDAL verwenden. Der Plan ist jedoch, in Zukunft reines Python zu verwenden, wo ich kann, da die Zielgruppe meiner Software Schwierigkeiten mit zu vielen Abhängigkeiten hat (ich benutze Debian, um die Software zu entwickeln, und die Clients verwenden Windows 7 ...).
quelle