gdalwarp produce rásteres vacíos cuando se llama desde un script de Python, pero no a través de la línea de comando

8

Estoy tratando de agregar algunos datos ráster (todos .tif) hasta una resolución más gruesa (de .05 grados a .25 grados) usando gdalwarp en python, pero el comando no funciona. En lugar de obtener una salida con una amplia gama de valores, todos los valores de la salida son 0. La resolución y la profundidad / tipo de píxeles son correctos, pero los valores no lo son.

Aquí está la documentación del comando gdalwarp: http://www.gdal.org/gdalwarp.html

Tengo dos archivos de entrada que deseo agregar hasta una resolución de .25 grados, produciendo varias salidas:

  • 'NDVI_raster': la primera entrada es un ráster con signo de 16 bits que representa NDVI, con valores que van desde -10,000 a 10,000 y valores de nodata de -15,000.

  • 'nodata_mask': la segunda es una máscara NoData, flotante de 32 bits, donde 1 = valores de datos "buenos" y 0 = NoData.

Con 'NDVI_raster' como entrada, quiero producir 7 salidas diferentes, cada una representando una estadística diferente. Hago esto llamando a gdalwarp 7 veces, cada vez configurando el método de remuestreo (-r) a uno de los siguientes: promedio, modo, máximo, mínimo, mediana, q1, q2. Llamaré a las salidas NDVI_ave.tif, NDVI_mode.tif, etc. En este momento, estoy usando GDAL 1.10.1, que solo permite el promedio y el modo, así que estoy probando con estas dos estadísticas ahora.

Usando 'nodata_mask' como entrada, en última instancia, quiero producir una QAL (capa de garantía de calidad). Para hacer esto, uso gdalwarp, con el modo de remuestreo configurado en 'promedio' para agregar hasta .25 grados. Esto da como resultado que cada píxel represente la proporción de píxeles buenos / píxeles totales de la entrada. Llamemos a la salida QAL.

Aquí está lo que hay en mi código (usando el modo como ejemplo para la primera entrada):

os.system('gdalwarp -tr .25 .25 -r mode -srcnodata -15000 %s %s' % (NDVI_raster, NDVI_mode))

Y para la capa de control de calidad:

os.system('gdalwarp -tr .25 .25 -r average -srcnodata -15000 %s %s' % (nodata_mask, QAL))

Los resultados son rásteres con la resolución, proyección y profundidad de píxeles correctas, pero los valores de píxeles son todos 0.

¿Alguien familiarizado con python / gdal sabe lo que está pasando?


Cuando llamo al comando gdalwarp desde la línea de comando (linux), obtengo el resultado deseado. Cuando uso os.system para llamar a gdalwarp desde python, obtengo rasters vacíos. Entonces, ¿tal vez algo está mal con mis enlaces gdal / python?


En lugar de llamar al comando a través de os.system, utilicé el subproceso. La herramienta a través de este método también parece funcionar sin problemas, pero el resultado es el mismo: una trama llena de ceros.


Intenté poner la llamada de gdalwarp en un script de shell bash y llamar a ese script de shell desde python, pero el resultado es un montón de -1s en lugar de 0s. Por extraño que parezca, lo había probado antes y estoy bastante seguro de que funcionó, pero la prueba se eliminó de mi servidor y ahora no puedo volver a crearla por alguna razón.


Poner el comando gdalwarp en un script de shell bash y luego llamar a ese script de shell desde la línea de comando me da el resultado deseado. Sin embargo, llamar al mismo script de shell desde python no lo hace. Parece que algo está mal con Python, pero ¿qué y cómo lo soluciono?

usuario20408
fuente
2
No puede ser un problema vinculante, no los usaste. Ejecutas el comando gdalwarp. Debe verificar el estado de error del comando gdalwarp, consulte: stackoverflow.com/questions/3791465/…
Zoltan
2
Para ampliar lo que dice Zoltan, esencialmente está llamando al mismo programa (gdalwarp). os.systemen realidad inicia un shell y ejecuta el comando dado. Además del valor de retorno, probablemente debería verificar las variables que está tratando de pasar (es decir, ¿algún problema de cotización? Etc.)
Evil Genius
También debe considerar moverse de os.systema subprocessque es el módulo más moderno y contiene una serie de mejoras (de seguridad).
Kersten
@Zoltan qué mensaje de error? No recibí un mensaje de error porque el comando técnicamente funcionó, solo que la salida no era correcta (valores de 0) .plz vea mi actualización. ¡Gracias!
user20408
2
Un problema es que creo que necesitará especificar -ot Float32o algo similar para la máscara de calidad, porque no puede representar fracciones con un ráster entero.
Nat Wilson

Respuestas:

2

No dices cómo comienzas tu script python / gdalwarp. Descubrí que un cronjob no siempre tendrá el mismo entorno que mi entorno de línea de comandos. Tuve que comenzar a crear entornos de tiempo de ejecución para este tipo de scripts. Dicho esto, si inicia su script desde, digamos, un icono en su escritorio, entonces puede que no tenga el mismo entorno de tiempo de ejecución que su entorno de línea de comandos. "PYTHONPATH" puede ser una de las variables de entorno que debe establecer. Además, es posible que deba establecer variables para gdalwarp. Finalmente, sus archivos de datos pueden no estar en la ubicación correcta. Puede que tenga que establecer una ruta absoluta como / xxx / xxxx / NDVI_raster o usar tilda ~ / NDVI_raster. Al igual que PYTHONPATH, es posible que también deba configurar PATH y otras variables de entorno."exporta u origina" la configuración de sames al comienzo de tu script.

Greg
fuente
1

Yo tuve este problema también. Finalmente descubrí en mi caso que era porque acababa de crear la imagen en el disco usando gdalenlaces de Python , pero no había cerrado el gdal.Datasetobjeto en memoria, por lo que la escritura en el disco solo se había completado parcialmente. Curiosamente, la única forma que puedo encontrar para cerrar un gdal.Dataseten Python es: ¡ del variable_name_of_datasettan feo!

En Chay un GDALClose()método que por el momento no se implementa mediante la API de Python GDAL, pero Rasteriohace: https://github.com/sgillies/rasterio/blob/876b9a1e2bf04e349b485e05ebc4a8674ace3cf0/rasterio/_io.pyx#L1463

Ver también: ¿Por qué cerrar un conjunto de datos en GDAL Python?

Hazzles
fuente