Ich benutze gdal_proximity, um die Entfernung zum nächsten großen Fluss in den USA (untere 48 Staaten) zu ermitteln. Ich habe die Flusslinien des NHD + -Netzwerks auf Conus Albers (epsg: 5070) projiziert, Flüsse mit einer Flussreihenfolge> 5 ausgewählt und gerastert, wobei Flüsse mit 255 und kein Fluss mit 0 verbrannt wurden. Dies ist in Ordnung, aber jetzt muss ich die Entfernung finden zum nächsten Fluss für Standorte innerhalb von 50 km. Die Eingabedatei hat auf kontinentaler Ebene eine Auflösung von 30 m, ist also sehr groß, aber die Konvertierung sollte ein einfacher Befehl gdal_proximity sein:
gdal_proximity.bat -values 255 -distunits GEO -maxdist 50000 -nodata -999 infile.tif outfile.tif -co COMPRESS=DEFLATE -co BIGTIFF=YES -co TILED=YES
Dies scheint fast zu funktionieren, erzeugt jedoch ein seltsames geometrisches Muster in der Ausgabe (siehe Bild). Die in der Ausgabe vorhandenen Daten wurden korrekt verarbeitet. Kann jemand vorschlagen, warum so viel von der Ausgabe fehlt?
Bearbeiten: Um zu testen, ob dies durch einen der optionalen Parameter verursacht wurde, habe ich gdal_proximity in dieser Konfiguration erneut ausgeführt:
gdal_proximity.bat H:\data\tmp\NHDplus_network_flowline_SO6plus.tif H:/data/tmp/NHDplus_network_flowline_SO6plus_proximity.tif -values 255 -maxdist 50000 -of GTiff
Was im Wesentlichen das gleiche Ergebnis erbrachte:
Mein einziger Gedanke ist, dass es mit der Größe des Rasters zusammenhängt (~ 100 GB unkomprimiert). Soweit ich weiß, gibt es keine Begrenzung für die Größe eines BigTiff, aber vielleicht gibt es eine Begrenzung für das, was gdal kann effektiv analysieren?
quelle
Antworten:
Ich vermute, dass Sie irgendwo ein Speicherlimit erreichen, möglicherweise, wenn der Arbeitsspeicher erschöpft ist und das Betriebssystem eine Auslagerungsdatei erstellt. Überwachen Sie Ihre Systemressourcen während des Vorgangs. Es ist mir unklar, warum Ihre Ergebnisse in gekrümmten Schwaden auftreten, aber stellen Sie sicher, dass Sie alle Daten in dasselbe Koordinatensystem projiziert (gespeichert) haben.
Schauen wir uns numerische Datentypen an, um diesen Algorithmus zu unterstützen. Das gerasterte Stream-Netzwerk muss nur Binärwerte enthalten, sodass wir durch die Verwendung eines
Byte
Raster-Datentyps Ressourcen sparen können . Brennen Sie einen Wert von 1 für Streams und 0 für den Hintergrund:Als nächstes ist die Nähe, an der wir interessiert sind, positiv und beträgt höchstens 50.000 m. Ein geeigneter Datentyp ist eine vorzeichenlose 16-Bit-Ganzzahl
UInt16
. Darüber hinaus können wir den Wert 0 für die Stream-Zellen beibehalten, wenn wir das 'no data' auf das Maximum von 65535 setzen.Bei Bedarf können Sie auch auf eine 8-Bit-Ganzzahl ohne Vorzeichen zurücksetzen
UInt8
und dennoch eine Genauigkeit von ~ 200 m erreichen.* Beachten Sie, dass ich eine Zellengröße von 50 m verwendet habe. Die gdal_proximity verbrauchte ~ 20 GB RAM und benötigte ~ 5 Minuten auf meinem Computer. Wenn Sie über begrenzten Arbeitsspeicher verfügen, teilen Sie das Eingabe-Raster, wie bereits erwähnt, in verwaltbare Größen auf.
quelle