¿Cómo calcular la distancia a una entidad con gdal_proximity?

28

Estoy usando gdal_proximity para encontrar la distancia al río principal más cercano a través de los EE. UU. (48 estados más bajos). Proyecté las líneas de flujo de la red NHD + a Conus Albers (epsg: 5070), seleccioné ríos con un orden de flujo> 5 y rasterizados, ríos ardientes como 255, sin río como 0. Esto está bien, pero ahora necesito encontrar la distancia al río más cercano para sitios dentro de 50 km. El archivo de entrada tiene una resolución de 30 m en escala continental, por lo que es muy grande, pero la conversión debe ser un simple 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

Esto parece funcionar casi, pero está produciendo un patrón geométrico extraño en la salida (ver imagen). Los datos que están presentes en la salida se han procesado correctamente. ¿Alguien puede sugerir por qué falta tanto producto?

Proximidad al rio

Editar: para probar si esto fue causado por alguno de los parámetros opcionales, ejecuté gdal_proximity nuevamente en esta configuración:

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

Lo que produjo esencialmente el mismo resultado:

Proximidad al río, sin parámetros opcionales.

Mi único pensamiento es que puede estar relacionado con el tamaño del ráster (~ 100 gb sin comprimir. Por lo que sé, no hay un límite para el tamaño de un BigTiff, pero tal vez haya un límite para lo que el gdal puede analizar de manera efectiva?

R Rodas
fuente
1
¿Qué sucede si apaga mosaico = SÍ? Además, ¿funciona si cambia de GEO a PIXEL? (La salida puede no ser adecuada, pero podría reducir el problema)
Steven Kay
Gracias por la sugerencia: he agregado una respuesta a la pregunta original.
R Rhodes
¿En qué resolución está tu infile.tif?
shahryar
2
¿Puede intentar leer los datos usando GDAL en lotes (líneas) y ver si el problema son los datos en sí mismos o QGIS no puede visualizarlos? Un primer paso para encontrar este problema es reducir la extensión espacial a un AOI de muestra.
RutgerH

Respuestas:

3

Sospecho que está alcanzando un límite de memoria en algún lugar, posiblemente cuando la RAM se agota y el sistema operativo se vuelca en un archivo de paginación. Monitoree los recursos de su sistema durante el proceso. No tengo claro por qué sus resultados ocurren en franjas curvas, pero asegúrese de haber proyectado (guardado) todos los datos en el mismo sistema de coordenadas.

Echemos un vistazo a los tipos de datos numéricos para ayudar a este algoritmo. La red de flujo rasterizada solo necesita contener valores binarios, por lo que podemos ahorrar recursos utilizando un Bytetipo de datos ráster. Grabe un valor de 1 para las transmisiones y 0 para el fondo:

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

Luego, la proximidad que nos interesa es positiva y menor o igual a 50,000m. Un tipo de datos apropiado es un entero de 16 bits sin signo UInt16. Además, si establecemos el 'sin datos' al máximo 65535, podemos retener un valor 0 para las celdas de flujo.

Si es necesario, también puede bajar a un entero sin signo de 8 bits UInt8y aún tener una precisión de proximidad de ~ 200m.

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

* Tenga en cuenta que he usado un tamaño de celda de 50 m. Gdal_proximity consumió ~ 20 GB de RAM y tardó ~ 5 minutos en mi máquina. Si tiene RAM limitada, divida el ráster de entrada en tamaños manejables, como otros han señalado.

Resultados de gdal_proximity

Entidad cristalina
fuente