Wie berechnet man die Entfernung zu einem Objekt mit gdal_proximity?

28

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?

Nähe zum Fluss

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:

Nähe zum Fluss, keine optionalen Parameter

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?

R Rhodes
quelle
1
Was passiert, wenn Sie Tiled = YES ausschalten? Funktioniert es auch, wenn Sie von GEO zu PIXEL wechseln? (Die Ausgabe ist möglicherweise nicht geeignet, kann aber das Problem
Steven Kay
Vielen Dank für den Vorschlag - habe eine Antwort auf die ursprüngliche Frage hinzugefügt.
R Rhodes
Bei welcher Auflösung ist deine infile.tif?
Shahryar
2
Können Sie versuchen, die Daten mit GDAL stapelweise (zeilenweise) zu lesen und festzustellen, ob das Problem darin besteht, dass die Daten selbst oder QGIS sie nicht visualisieren kann? Ein erster Schritt, um dieses Problem zu finden, besteht darin, die räumliche Ausdehnung auf eine Stichproben-AOI zu reduzieren.
RutgerH

Antworten:

3

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 ByteRaster-Datentyps Ressourcen sparen können . Brennen Sie einen Wert von 1 für Streams und 0 für den Hintergrund:

gdal_rasterize -l streams -burn 1 -tr 50 50 -a_nodata 0 -te -2339101 311625 2227004 3134200 -ot Byte -of GTiff streams.shp streams.tif

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 UInt8und dennoch eine Genauigkeit von ~ 200 m erreichen.

gdal_proximity.bat -srcband 1 -distunits GEO -values 1 -maxdist 50000 -nodata 65535 -ot UInt16 -of GTiff streams.tif proximity.tif

* 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.

gdal_proximity resultiert

Kristalline Einheit
quelle