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?
os.system
en 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.)
os.system
a subprocess
que es el módulo más moderno y contiene una serie de mejoras (de seguridad).
-ot Float32
o algo similar para la máscara de calidad, porque no puede representar fracciones con un ráster entero.