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

27

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). He proyectado las líneas de flujo de la red NHD + en Conus Albers (epsg: 5070), ríos seleccionados con orden de arroyos > 5, y rasterizado, quema ríos como 255, no hay 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 de la salida?

Editar:Paraprobarsiestofuecausadoporalgunodelosparámetrosopcionales,ejecutégdal_proximitynuevamenteenestaconfiguración:

gdal_proximity.batH:\data\tmp\NHDplus_network_flowline_SO6plus.tifH:/data/tmp/NHDplus_network_flowline_SO6plus_proximity.tif-values255-maxdist50000-ofGTiff

Loqueprodujoesencialmenteelmismoresultado:

Mi único pensamiento es que puede estar relacionado con el tamaño de la trama (~ 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 ¿Qué gdal puede analizar efectivamente?

    
pregunta R Rhodes 04.07.2017 - 11:14

1 respuesta

2

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

Echemos un vistazo al numérico datatypes para ayudar a este algoritmo. La red de flujo rasterizado solo necesita contener valores binarios, por lo que podemos ahorrar recursos utilizando un tipo de datos ráster Byte . Grabe un valor de 1 para las secuencias 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

A continuación, la proximidad en la que estamos interesados es positiva y menor o igual a 50,000 m. Un tipo de datos apropiado es un entero de 16 bits sin signo UInt16 . Además, si configuramos 'no data' en el máximo de 65535 podemos retener un valor de 0 para las celdas de transmisión.

Si es necesario, también podría pasar a un entero sin signo de 8 bits UInt8 y seguir teniendo una precisión de proximidad de ~ 200 m.

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. La gdal_proximity consumió ~ 20GB de RAM y tomó ~ 5min en mi máquina. Si tiene un límite de RAM, divida el ráster de entrada en tamaños manejables, como han indicado otros.

    
respondido por el CrystallineEntity 12.10.2018 - 20:01

Lea otras preguntas en las etiquetas