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?
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:
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?
fuente
Respuestas:
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
Byte
tipo de datos ráster. Grabe un valor de 1 para las transmisiones y 0 para el fondo: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
UInt8
y aún tener una precisión de proximidad de ~ 200m.* 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.
fuente