¿Contando valores de píxeles consecutivos para un conjunto de rásteres utilizando ArcGIS Spatial Analyst?

23

Estoy usando ArcGIS 10 con Spatial Analyst.

Tengo un conjunto de rásteres (8 en total) que solo contienen 1 o 0 para cada celda. Cada ráster representa un año diferente de datos. Por argumentos del año 1 al año 8.

Puedo sumar todos los rásteres juntos, lo que me dará una cuadrícula final con valores que van de 0 a 8. Un 8 indica que la celda era constantemente 1 para el conjunto de rásteres (todos los años).

Me gustaría averiguar para cada celda el número consecutivo más largo de 1.

Entonces, por ejemplo, la cuadrícula total puede registrar para una sola celda un valor de, por ejemplo, 5, pero en las 8 cuadrículas esa celda tiene el mayor número consecutivo de 1 igual a 3. O otra forma de expresar esto es durante 3 años que esa celda fue un 1 luego comenzó a oscilar entre ceros y unos.

Mis habilidades de procesamiento de trama no son tan buenas como mi habilidad de procesamiento de vectores y he echado un buen vistazo al archivo de ayuda de ESRI, pero no puedo entender cómo se lograría esto utilizando herramientas de geo-procesamiento listas para usar.

¿Alguna idea?

    
pregunta Hornbydd 14.06.2012 - 20:01

3 respuestas

14

Debido a que esta es una operación local, vamos a ver cómo hacerlo para una sola celda: Map Algebra se encargará del resto.

Primero, tenga en cuenta que el orden de los rásteres obviamente importa. Por lo tanto, las estadísticas de celda de disparo único, como la suma de una celda, no lo harán.

Si tuviéramos que encontrar una secuencia como 01110101 en una celda determinada, procesaremos esto de principio a fin y

  1. Comience con un conteo en cero.

  2. Incrementa la cuenta cada vez que encontremos un 1.

  3. Reinicie el conteo cada vez que encontremos un 0, después de guardar el último conteo .

  4. Al final, tome el recuento máximo guardado (incluido el recuento final).

El paso 1 se implementa con una cuadrícula de cero constante. Los pasos 2 y 3 dependen de lo que encontremos: por lo tanto, es una operación condicional . El paso 4 claramente es un máximo local. Codificaríamos esto, entonces, un poco más formal como:

count = 0
result = 0
For each value:
    If (value==1):
        count=count+1
    else
        result = max(result, count)
        count=0
result = max(result, count)

Lo mejor es hacerlo con un script de Python cuando tienes muchas cuadrículas, pero con ocho no es complicado desenrollar el bucle y escribir los pasos a mano. Esto revela un pequeño problema: el result=max(longest,count) es una especie de "efecto secundario" que es difícil de codificar con operaciones de ráster. (Pero se puede hacer, como se muestra en la segunda solución a continuación.) También es ineficiente, porque agrega un cálculo adicional en cada paso. Por lo tanto, modificamos un poco el enfoque, con el objetivo de posponer la operación max hasta el final. Esto requerirá guardar un conteo separado en cada etapa.

Al pasar por este proceso también encontré un atajo para el primer paso. Esto conduce a la siguiente solución, que aunque es un poco larga y requiere un uso intensivo de RAM, es simple e implica pasos de ejecución rápida:

result1 = "grid1"
result2 = con("grid2"==1, "result1"+1, 0)
result3 = con("grid3"==1, "result2"+1, 0)
result4 = con("grid4"==1, "result3"+1, 0)
result5 = con("grid5"==1, "result4"+1, 0)
result6 = con("grid6"==1, "result5"+1, 0)
result7 = con("grid7"==1, "result6"+1, 0)
result8 = con("grid8"==1, "result7"+1, 0)
CellStatistics(["result1", "result2", "result3", "result4", "result5", "result6", "result7" "result8"], "max")

La sintaxis real varía con su versión de ArcMap. (Por ejemplo, CellStatistics es nuevo en la versión 10, creo, pero siempre ha estado disponible una operación máxima local).

En el ejemplo con la entrada 01110101, la secuencia de cuadrículas "result *" contendría los valores 0, 1, 2, 3, 0, 1, 0, 1, por lo que al final CellStatistics devolvería 3, el longitud de la cadena más larga de 1.

Si la RAM es escasa, la solución puede modificarse para reutilizar los resultados intermedios, a un costo de aproximadamente el doble del tiempo de ejecución:

result = "grid1"
temp = con("grid2"==1, "result"+1, 0)
result = CellStatistics[["temp", "result"], "max"]
temp = con("grid3"==1, "temp"+1, 0)
result = CellStatistics[["temp", "result"], "max"]
...
temp = con("grid8"==1, "temp"+1, 0)
CellStatistics[["temp", "result"], "max"]

En el ejemplo con la entrada 01110101, los valores ("temp", "result") serían (NoData, 0) después de la primera línea y después de cada par de operaciones ("Con", "CellStatistics") que los valores ser (1, 1), (2, 2), (3, 3), (0, 3), (1, 3), (0, 3), (1, 3). Una vez más, el valor final es 3.

El patrón regular de las expresiones de Álgebra de mapas en cualquiera de las soluciones indica cómo codificar el algoritmo como un bucle en un script, cambiando los índices según sea apropiado con cada iteración.

    
respondido por el whuber 14.06.2012 - 20:42
14

Simplemente converse sobre esto y pregúntese si podría abordar el problema tratando las cuadrículas de entrada como una secuencia binaria. Esto le permitiría combinarlos para obtener un entero de resumen único para la secuencia, es decir, 01110101 = 117. Este valor podría reclasificarse para obtener el número máximo de 1 consecutivos.

Este es un ejemplo que muestra una forma de combinar ocho cuadrículas:

2*(2*(2*(2*(2*(2*(2*"g8" + "g7") + "g6") + "g5") + "g4") + "g3") + "g2") + "g1"

Bitwise las operaciones también pueden ser puestas en servicio para Este paso. Alternativamente, puede usar combine seguido de un cálculo de campo. (El cálculo del campo tendrá una expresión similar a la anterior).

La tabla de reclasificación tiene que proporcionar la longitud máxima de ejecución para todos los valores entre 00000000B = 0 y 11111111B = 255. En orden, aquí están:

0, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 6, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 6, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8

Este enfoque está limitado a aproximadamente 20 cuadrículas en ArcGIS: el uso de más de esto puede crear una tabla de atributos difícil de manejar. ( Combine se limita específicamente a 20 cuadrículas).

    
respondido por el Andy Harfoot 15.06.2012 - 11:09
3

¿Has pensado en cambiar los valores de 0 y 1 a valores con la potencia de 2 (1,2,4,8,16,32). Cuando combine las 8 cuadrículas, obtendrá valores únicos para cada celda que le darán información consecutiva (es decir, un valor de 3 significa el año 1 y el 2, donde un valor de 54 sería de los años 6 a 8).

Sólo un pensamiento

    
respondido por el Ryan Garnett 15.06.2012 - 13:41

Lea otras preguntas en las etiquetas