8 votos

gdalwarp produce raster vacíos cuando se llama desde script python, pero no a través de la línea de comandos

Estoy tratando de agregar algunos datos raster (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 de píxeles / tipo 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 0,25 grados, produciendo varias salidas:

  • 'NDVI_raster': La primera entrada es una trama con signo de 16 bits que representa NDVI, con valores que van de -10.000 a 10.000 y valores nodata de -15.000.

  • 'nodata_mask': La segunda es una máscara NoData, float 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. Lo hago llamando a gdalwarp 7 veces, cada vez ajustando el método de remuestreo (-r) a uno de los siguientes: media, modo, máx, mín, mediana, q1, q2. Llamaré a las salidas NDVI_ave.tif, NDVI_mode.tif, etc. En este momento, estoy usando GDAL 1.10.1, que sólo permite media y modo, así que estoy probando con sólo estas dos estadísticas ahora.

Utilizando 'nodata_mask' como entrada, quiero producir en última instancia una QAL (capa de garantía de calidad). Para ello, utilizo gdalwarp, con el modo de remuestreo establecido en "promedio" para agregar hasta 0,25 grados. El resultado es que cada píxel representa la proporción de píxeles buenos/píxeles totales de la entrada. Llamemos a la salida QAL.

Esto es lo que hay en mi código (usando mode 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ásters con la resolución, proyección y profundidad de píxel correctas, pero los valores de píxel son todos 0.

¿Alguien familiarizado con python/gdal sabe qué está pasando?


Al llamar al comando gdalwarp desde la línea de comandos (linux), obtengo el resultado deseado. Cuando uso os.system para llamar a gdalwarp desde python, obtengo rásters vacíos. Así que tal vez algo está mal con mi gdal / python enlaces?


En lugar de llamar al comando a través de os.system, he utilizado 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 0's.


He intentado poner la llamada a 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 borró de mi servidor y ahora no puedo volver a crearlo 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 comandos me da el resultado deseado. Llamar al mismo script de shell desde python, sin embargo, no lo hace. Parece que algo va mal con python, pero ¿qué y cómo lo arreglo?

3voto

JarandRam Puntos 1

Yo también tuve este problema. Finalmente descubrí que en mi caso se debía a que acababa de crear la imagen en disco utilizando Python gdal bindings, pero no había cerrado el gdal.Dataset en memoria, por lo que la escritura en disco sólo se había completado parcialmente. Por extraño que parezca, la única manera que pude encontrar para cerrar un gdal.Dataset en Python es: del variable_name_of_dataset - ¡Qué feo!

En C hay un GDALClose() que por el momento no está implementado por la API GDAL de Python, pero Rasterio lo hace: https://github.com/sgillies/rasterio/blob/876b9a1e2bf04e349b485e05ebc4a8674ace3cf0/rasterio/_io.pyx#L1463

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

2voto

ane Puntos 116

No dices como inicias tu script python/gdalwarp. Descubrí que un cronjob no siempre tendrá el mismo entorno que mi entorno de línea de comandos. Tuve que empezar a crear entornos de ejecución para este tipo de scripts. Dicho esto, si inicias tu script desde, digamos, un icono en tu escritorio, entonces puede que no tenga el mismo entorno de ejecución que tu entorno de línea de comandos. "PYTHONPATH" puede ser una de las variables de entorno que tienes que configurar. Además, puede que tengas que establecer variables para gdalwarp. Por último, 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 utilizar tilda ~/NDVI_raster. Al igual que PYTHONPATH, es posible que también tenga que configurar SENDERO y otras variables de entorno. Asegúrese de "exportación o fuente" la misma configuración al principio del script.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X