Come calcolare la distanza da una funzione con gdal_proximity?


28

Sto usando gdal_proximity per trovare la distanza dal fiume principale più vicino negli Stati Uniti (48 stati inferiori). Ho proiettato le linee di flusso della rete NHD + su Conus Albers (epsg: 5070), selezionato fiumi con ordine di flusso> 5 e rasterizzato, bruciando fiumi come 255, nessun fiume come 0. Questo va bene, ma ora devo trovare la distanza al fiume più vicino per siti entro 50km. Il file di input ha una risoluzione di 30 m su scala continentale, quindi è molto grande, ma la conversione dovrebbe essere un semplice comando gdal_proximity:

gdal_proximity.bat -values 255 -distunits GEO -maxdist 50000 -nodata -999 infile.tif outfile.tif -co COMPRESS=DEFLATE -co BIGTIFF=YES -co TILED=YES

Questo sembra funzionare quasi, ma sta producendo uno strano motivo geometrico nell'output (vedi immagine). I dati presenti nell'output sono stati elaborati correttamente. Qualcuno può suggerire perché manca così tanto dell'output?

Vicinanza al fiume

Modifica: per verificare se ciò è stato causato da uno qualsiasi dei parametri opzionali, ho eseguito di nuovo gdal_proximity in questa configurazione:

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

Che ha prodotto essenzialmente lo stesso risultato:

Vicinanza al fiume, nessun parametro opzionale

Il mio unico pensiero è che potrebbe essere correlato alla dimensione del raster (~ 100 gb non compresso. Per quanto ne so non c'è un limite alla dimensione di un BigTiff, ma forse c'è un limite a ciò che gdal può analizzare in modo efficace?


1
cosa succede se si spegne piastrellato = SÌ? Inoltre, funziona se si passa da GEO a PIXEL? (L'output potrebbe non essere adatto, ma potrebbe restringere il problema)
Steven Kay

Grazie per il suggerimento: ho aggiunto una risposta alla domanda originale.
R Rodi,

A che risoluzione è il tuo infile.tif?
Shahryar

2
Puoi provare a leggere i dati usando GDAL in batch (righe) e vedere se il problema è che i dati stessi o QGIS non sono in grado di visualizzarli? Un primo passo per trovare questo problema è ridurre l'estensione spaziale ad un AOI campione.
RutgerH

Risposte:


3

Ho il sospetto che tu stia colpendo un limite di memoria da qualche parte, possibilmente quando la RAM è esaurita e il sistema operativo scarica in un file di paging. Monitora le risorse del tuo sistema durante il processo. Non mi è chiaro il motivo per cui i risultati si verificano in curve curve, ma assicurati di aver proiettato (salvato) tutti i dati nello stesso sistema di coordinate.

Diamo un'occhiata ai tipi di dati numerici per aiutare questo algoritmo. La rete di stream rasterizzata deve contenere solo valori binari, quindi possiamo risparmiare sulle risorse utilizzando un Bytetipo di dati raster. Masterizza un valore di 1 per i flussi e 0 per lo sfondo:

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

Successivamente, la vicinanza a cui siamo interessati è positiva e inferiore o uguale a 50.000 m. Un tipo di dati appropriato è un numero intero a 16 bit senza segno UInt16. Inoltre, se impostiamo "nessun dato" al massimo 65535, possiamo mantenere un valore 0 per le celle del flusso.

Se necessario, è anche possibile passare a un numero intero senza segno a 8 bit UInt8e avere comunque una precisione di prossimità di ~ 200 m.

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

* Nota che ho usato una dimensione di cella di 50m. Gdal_proximity ha consumato ~ 20 GB di RAM e ha impiegato circa 5 minuti sulla mia macchina. Se hai una RAM limitata, dividi l'input raster in dimensioni gestibili, come altri hanno notato.

risultati di gdal_proximity

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.