¿Error importante en las estadísticas zonales de ArcGIS?


25

Actualización: el error se ha corregido en la versión ArcGIS 10.4

Estoy usando ArcGIS 10.2.2 para determinar estadísticas zonales para varias zonas. Si hay algún NoData en el ráster de valor, quiero que los resultados de la zona sean "NoData", precisamente como lo anuncia la descripción de las herramientas. Esta descripción de la herramienta dice:

DATOS: dentro de cualquier zona en particular, solo las celdas que tienen un valor en el ráster de Valor de entrada se usarán para determinar el valor de salida para esa zona. Las celdas NoData en el ráster Value se ignorarán en el cálculo estadístico.

NODATA: dentro de cualquier zona en particular, si existen celdas NoData en el ráster Value, se considera que no hay información suficiente para realizar cálculos estadísticos para todas las celdas en esa zona; por lo tanto, toda la zona recibirá el valor NoData en el ráster de salida.

Por favor, eche un vistazo a mi configuración en esta imagen: ingrese la descripción de la imagen aquí

Estoy usando la opción NODATA con un ráster de valor que tiene un píxel NoData y, por lo tanto, espero que el valor de la zona resultante (zona 61154) sea 'NoData'. En cambio, obtengo un valor de 12.74 (redondeado a 13 en la imagen), lo que me confunde en dos niveles: primero, esperaba 'NoData', y segundo, el valor resultante de 12.74 es matemáticamente imposible, porque la media no puede ser mayor que el valor máximo en el ráster de valor, que es 10 en este caso.

Si estoy usando la opción DATOS, obtengo un valor de aproximadamente 9.1, lo cual tiene sentido. Probamos esto en diferentes conjuntos de datos, computadoras y versiones de ArcGIS.

¿Que me estoy perdiendo aqui?

Editar / Comentario adicional: acabo de notar que el atributo 'Contar' también es incorrecto para esa zona en particular. De hecho, hay 421 celdas en esa zona, pero la herramienta solo contó 297. Calcular 421 menos 297 da como resultado 124 - por extraño que parezca, esta es la "posición" donde se encuentra el píxel NoData, si se cuentan los píxeles desde la parte superior izquierda a la inferior Justo en la zona. La herramienta podría estar haciendo que el recuento de células sea incorrecto (demasiado bajo), lo que podría explicar el aumento del promedio.

Editar: Aquí hay un enlace a los datos que estoy usando.

Editar: Dan Patterson y yo hicimos un poco más de depuración aquí en el foro de ESRI.


1
Sí, produce algo loco. En mi caso, MEDIA = 537 para el ráster en el rango (16,86). No es gracioso
FelixIP

¿Qué valor se usa para representar NoData en este ráster?
Jezibelle

@Jezibelle: Buena pregunta, ¿dónde encuentro una respuesta confiable? Si exporto como Ascii, es -9999. Si utilizo la función de exportación desde el menú contextual, el campo "NoData as:" del diálogo de exportación se rellena previamente con 2147483647. ¿Eso levanta una bandera?
G-wizard


1
Hice otra edición al final de mi publicación, donde hago un enlace a una publicación similar en el foro de ESRI. Error confirmado (con un giro). Calcular "MEDIA" solo produce resultados diferentes / peores que calcular estadísticas "TODAS".
G-wizard

Respuestas:


9

Hay un error que parece corresponder a lo que está experimentando: está registrado como BUG-000084883 - La opción 'Ignorar NoData en los cálculos' en la herramienta Estadística zonal como tabla {y la herramienta Estadística zonal} no se respeta cuando está desactivada, produciendo resultados incorrectos

Ocurre con 10.3 y 10.2.2 pero no con 10.1. ¿Probaste la herramienta con esta versión?


Esto suena como un buen enfoque, aunque personalmente no sé cómo ejecutar versiones anteriores de la herramienta. ¿Alguien sabe dónde señalarme para intentar esta solución?
UdderlyAstray

Gracias @GISGe. ¿Dónde encontraste esto? ¿Hay un enlace donde se documenta este error?
G-wizard

1
@ G-wizard: agregué el enlace en mi respuesta. Como personal internacional de Esri, tengo acceso a una descripción más detallada de lo que puede ver, así es como puedo decirle que el error también se aplica a la herramienta de Estadísticas zonales y no se encuentra en 10.1.
GISGe

@UdderlyAstray: si desea ejecutar una versión anterior de la herramienta, debe instalar esa versión anterior de ArcGIS.
GISGe

1
Gracias de nuevo, @GISGe, ya que esto es lo que estoy buscando (error confirmado oficialmente), estoy marcando esta respuesta como la correcta, aunque otros también lo han confirmado haciendo pruebas.
G-wizard

9

Es un error Algo terriblemente mal con el recuento celular.

La media correcta (9.0452380952381) veces el número correcto de celdas no vacías (420) dividido por 297 (que es un recuento de celdas reportado por la herramienta ) da como resultado 12.7912457912458. Ese es un promedio incorrecto reportado por la herramienta.

Resultados de mi propia prueba de cuadrículas de tamaño de juguete:

ingrese la descripción de la imagen aquí


1
Confirmo que tengo el mismo problema con 10.3, NODATA y "MEAN"
radouxju

Gracias a ambos por confirmar esto. Pero dejando de lado las diferencias en el valor medio, ¿me equivoco al suponer que el resultado en realidad no debería ser ningún valor, sino 'NODATA'? La descripción de la herramienta me lleva a creer eso. Dice: "NODATA: dentro de cualquier zona en particular, si existen celdas NoData en el ráster Value, se considera que no hay información suficiente para realizar cálculos estadísticos para todas las celdas en esa zona; por lo tanto, toda la zona recibirá el valor NoData en el ráster de salida ". Como hay un píxel con "NODATA", las estadísticas zonales también deberían ser "NODATA '. ¿Correcto?
G-wizard

2
@ G-wizard, tienes razón, como se indica en la Descripción de la herramienta. algo análogo al # DIV / 0! en excel.
c0ba1t

1

Similar a otra respuesta , mueva los datos ráster a matrices enmascaradas NumPy para calcular sus estadísticas. Suponiendo dos rásteres superpuestos con la misma forma, esto es simple:

import numpy as np
zones = arcpy.RasterToNumPyArray("zones")
value = np.ma.masked_equal(arcpy.RasterToNumPyArray("value"),
                           arcpy.Raster("value").noDataValue)
print("Zone\tCount\tNoData\tMean")
for z in np.unique(zones):
    sel = (zones == z)
    print z, sel.sum(), value.mask[sel].sum(), value[sel].mean()

Muestra:

Zone    Count   NoData  Mean
61131   53   0   8.92452830189
61154   421   1   9.04523809524
61207   1   0   8.0
61317   35   0   7.2
61644   644   0   7.90838509317
61677   12   0   7.41666666667
61789   7   0   9.0
61871   193   0   7.98445595855
187472   349   0   8.5787965616
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.