Imposible sumar rásteres debido a píxeles de nodata


11

Tengo un conjunto de rásteres (.vrt) con datos diarios de humedad del suelo. Quiero sumar los píxeles de todos los rásteres para tener una medida por mes. Sin embargo, el mundo entero no está cubierto todos los días, lo que da como resultado valores de nodatos en lugares donde existen medidas para los otros días.

Lo que quiero hacer es sumar los valores de cada ráster. Sin embargo, parece que cada vez que un píxel de nodata está en la suma, el píxel resultante se clasifica directamente como nodata. Me gustaría tener lo contrario: ignorar todos los valores de nodata y sumar el resto.

Pensé en 2 formas de resolver el problema:

  1. sumando rásteres ignorando valores de nodata
  2. convertir píxeles de nodata al valor 0, luego sumar todos los rásteres

ingrese la descripción de la imagen aquí

Desafortunadamente, no puedo encontrar ninguna herramienta para hacer esto.

¿Alguien puede ayudarme?


Me pregunto qué tan interpretable será el resultado: después de todo, las sumas no incluirán los valores para los días que faltan, lo que indica que estarán sesgados en varias cantidades dependiendo de la cantidad de datos faltantes. Si hay una cantidad apreciable de datos faltantes, entonces debería considerar en su lugar imputar o predecir los valores en las celdas faltantes y luego realizar la suma.
whuber

1
Gracias por este comentario Pregunté a los gerentes de los datos y me dijeron que calcularon el valor medio sumando todos los datos disponibles, luego dividieron por la cantidad de días dentro del mes en que las observaciones están disponibles en ese píxel.
Damien

2
Eso es idéntico a la media local de una pila de rásteres donde se instruye al SIG solo para ignorar todas las celdas NoData, lo que sugiere otra forma de ir. Por cierto, este procedimiento todavía está potencialmente sesgado cuando las observaciones faltantes están correlacionadas con los valores. Por ejemplo, cuando faltan datos debido a la cubierta de nubes, es posible que en esos días la humedad del suelo sea mayor (en promedio) de lo normal.
whuber

1
Muy bien, acabo de probar la herramienta de estadísticas de celda con la opción 'ignorar nodata' marcada y hace exactamente lo que quería. Soy consciente de las deficiencias de dicho método. Sin embargo, mi trabajo es a gran escala, tanto en el espacio como en el tiempo, por lo que supongo que tales sesgos serán menos importantes. De todos modos, realmente no tengo tantas opciones de datos.
Damien

La escala no estará relacionada con la cantidad de sesgo. La importancia del sesgo depende de su tamaño y de la sensibilidad de su aplicación. Aunque es posible que no pueda hacer nada con respecto a los datos, tiene control sobre los procedimientos para analizarlos. Hay muchas maneras de mejorar en este caso. Entre sus opciones están la interpolación con el tiempo y la regresión contra covariables que podrían estar correlacionadas con la humedad del suelo y están disponibles incluso en las fechas faltantes. (Hay toda una rama de estadísticas dedicadas a "imputar" valores perdidos.)
whuber

Respuestas:


1

Si tiene acceso a ArcGIS, la herramienta Estadísticas de celda tiene la opción de ignorar los nodos que suma \ mean \ min \ max sus rásteres.


Si modifica esta respuesta para reemplazar "suma" por "promedio", será correcta: vea el hilo de comentarios a la pregunta por la razón.
whuber

Sumar fue solo una parte de mi problema, ya que quiero obtener el valor medio. Acabo de comprobarlo, y la herramienta de estadísticas de celda también es la forma más fácil de sumar rásteres sin tener en cuenta los píxeles de nodata.
Damien

11

En primer lugar, puede usar gdal_calc.py para cambiar todo -9999 a 0 y establecer el valor NoData en 0.

Por ejemplo:

gdal_calc.py -A input.tif --outfile=input_with_NoData.tif --calc="A+9999*(A==-9999)" --NoDataValue=0

Luego, puede ignorar el valor NoData usando gdal_translate con la opción -a_nodata seguida de none .

-a_nodata value :

Asigna un valor de nodata especificado a las bandas de salida. A partir de GDAL 1.8.0, se puede establecer en none para evitar establecer un valor de nodata en el archivo de salida si existe uno para el archivo de origen

Ejemplo:

gdal_translate -a_nodata none input_with_NoData.tif output_without_NoData.tif

Gracias por el consejo. Jugué un poco con el parámetro -a_nodata y logré tener el valor de -9999 en lugar de NULL. Sin embargo, todavía necesito cambiar todos los -9999 píxeles a 0
Damien

1
Puede usar gdal_calc.py para cambiar todo -9999 a 0 antes de aplicar gdal_translate -a_nodata none .... Por ejemplo: gdal_calc.py -A input.tif --outfile=input_with_NoData.tif --type=Int16 --calc="A+9999*(A==-9999)" --NoDataValue=0
Antonio Falciano

Intenté varios comandos, pero realmente creo que tengo un problema con gdal_calc.py. Por ejemplo, solo intenté agregar 1 al ráster completo ( i.imgur.com/WiZG7MC.png ) y obtuve este error Maxrepeat. No entiendo, ejecuté el comando directamente desde el shell OSGeo, y este módulo parece estar instalado correctamente, ya que aparece en la lista cuando abro el shell ( i.imgur.com/fgtMZQZ.png ). ¿Mi instalación está rota?
Damien el

Parece un problema de expresiones regulares ... Intente cambiar su directorio de trabajo usando el cdcomando y vuelva a intentarlo para tener solo -A test.tif.
Antonio Falciano

1
A mí me funciona, pero he instalado todo esto a través del instalador OSGeo4W . En cambio, veo que ha instalado QGIS a través del instalador independiente. Así que intente actualizar / actualizar su configuración.
Antonio Falciano

5

En R:

library(raster)
s <- stack('file1', 'file2', ...)
ss <- sum(s, na.rm=TRUE)

¿Podría agregar una explicación a este código (si lo escribió) o un enlace a donde lo encontró, con un breve resumen del sitio?
Paul

1
Lo anterior primero carga el paquete ráster, luego crea una "pila" (una matriz tridimensional de archivos ráster de idéntica extensión y resolución, donde cada archivo se convierte en una porción de esta pila) que comprende los archivos indicados por los nombres de archivo separados por comas . La línea final realiza sumas en forma de celda en todos los segmentos de la pila s, con el argumento que na.rm=TRUEda como resultado NAque se ignoren los valores. El objeto de salida sses un rasterobjeto que se puede exportar con writeRaster(ver ?writeRaster). (@RobertH es el creador del rasterpaquete R ).
jbaums

1

La herramienta condicional en Spatial Analyst es una manera fácil de convertir valores nulos a ceros. Luego, tomar las sumas debe ser fácil.


Gracias por su respuesta. Seguí esta publicación: support.esri.com/fr/knowledgebase/techarticles/detail/34932 y pude convertir todos los píxeles nulos a 0. Sin embargo, me hubiera gustado poder hacer esta operación para todos los rásteres dentro de un directorio. El 'Reclasificar valores de cuadrícula' en QGIS parece ser capaz de hacer esto, pero no sé cómo funciona. Elijo el método de "tabla simple" y le pido que establezca nulo en 0, y no cambie otros valores, pero el ráster resultante varía de -0,99 a 0,08, mientras que originalmente abarca de 428 a 3491
Damien

¿Puedes publicar un extracto de tu ráster original en alguna parte para que podamos echarle un vistazo?
til_b

2
Si hace clic con el botón derecho en la herramienta, puede ejecutar un proceso por lotes en tantos archivos como desee, es decir, en un directorio completo.
Brock

Gracias por tu respuesta. Sin embargo, puedo convertir todos los NULL a 0 para un solo archivo usando 'analista espacial / álgebra de mapas / calculadora ráster'. Si hago clic con el botón derecho en esta herramienta, puedo agrupar un directorio, pero ¿cuál será la sintaxis para tener en cuenta cada archivo automáticamente? ( i.imgur.com/aYaUCzz.png )
Damien el

Eché un vistazo a la herramienta 'analista espacial / Reclasificar / Reclasificar' y hace exactamente lo que quiero. Logré usar la ventana por lotes para procesar varios archivos a la vez. Tengo un último problema: si hago clic con el botón derecho / relleno el 'ráster de salida', copia los mismos archivos de salida para todos los rásteres de entrada. ¿Cómo puedo hacer para que cree una salida diferente para cada entrada? ( i.imgur.com/jzTI2x9.png )
Damien el

1

Tuve el mismo problema hace un tiempo y logré resolverlo.

Solo como una nota sobre la visualización de valores de nodata en QGIS: los valores de nodata siempre se muestran como valores de nodata en la ventana del mapa y cuando se usa la herramienta "información de objeto", sin importar si realmente tienen el valor -9999, 0, NULL, etc. Entonces, después de la reclasificación de los valores de nodata a 0, si va a la configuración de la capa, encontrará en los Metadatos que los nodata tienen el valor 0.

Finalmente encontré la herramienta perfecta para la búsqueda, la HIERBA r.series. Con la configuración de "operación agregada" "máxima" y los "NULOS de propagación" desmarcados, la herramienta creará una capa que se ajuste a sus necesidades.


0

Recuerdo haber tenido este problema hace un tiempo. Como solución, creo que hice +1 a todas las celdas en el ráster, agregué los rásteres juntos, luego hice una resta final (de los muchos +1 que haya agregado). Es bastante crudo, pero si hace el trabajo ...!

Alternativamente, use 'Reclasificar valores de cuadrícula' en la caja de herramientas Procesamiento en QGIS para convertir sus valores nulos a cero.


Hola, probé muchas formas de usar la herramienta 'reclasificar valores de cuadrícula' sin éxito. Comencé en un ráster donde convertí todos los píxeles NULL a -9999. Intenté reclasificar usando el método [0] single, y establecí 'old value = -9999', 'new value = 0.0', 'operator: [0] =', pero todo lo que obtengo es una trama llena de 'nan' píxeles ¿Qué estoy haciendo mal?
Damien
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.