25 votos

Cómo contar consecutivos valores de los píxeles para un conjunto de rásteres?

Estoy usando ArcGIS 10 con Spatial Analyst.

Tengo un conjunto de imágenes rasterizadas (8 en total) que sólo contienen un 1 o un 0 para cada celda. Cada ráster que representa un diferente valor de años de datos. Por el bien de los argumentos del año 1 hasta el año 8.

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

Quisiera averiguar para cada celda, el más largo número consecutivo de 1.

Así por ejemplo, el total de la red pueden registrar para una sola celda un valor de 5, pero más de las 8 rejillas de que el celular tiene el mayor número consecutivo de 1 es igual a 3. O de otra manera de expresar esto es para 3 años que la celda era un 1, a continuación, comenzó a oscilar entre los ceros y los unos.

Mi trama habilidades de procesamiento no está tan caliente como mi vector de procesamiento de habilidad y he tenido una buena mirada en el ESRI archivo de ayuda, pero no puedo averiguar la manera de lograr esto usando fuera de la plataforma de geo-procesamiento de herramientas?

Alguna idea?

15voto

Vlado Klimovský Puntos 196

Charlando acerca de esto y me preguntaba si usted podría abordar el problema mediante el tratamiento de la entrada de las rejillas como una secuencia binaria. Esto permitiría que los combinan para dar un único resumen entero de la secuencia, es decir 01110101 = 117. Este valor podría entonces ser reclasificados a dar el máximo número de 1s consecutivos.

He aquí un ejemplo que muestra una manera de combinar ocho redes:

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

Bit a bit de operaciones también podría ser puestos en servicio para este paso. Como alternativa, puede utilizar combinar seguido por un campo de cálculo. (El cálculo del campo tendrá una expresión similar a la anterior.)

La tabla de reclasificación tiene para ofrecer max run longitudes para todos los valores entre 00000000B = 0 y 11111111B = 255. En fin, 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 se limita a unos 20 cuadrículas en ArcGIS: la utilización de más que esto puede crear una difíciles de manejar la tabla de atributos. (Combine se limita específicamente a 20 cuadrículas.)

14voto

cjstehno Puntos 131

Debido a que esta es una operación local, veamos cómo hacerlo para una sola celda: Mapa de Álgebra se encargará del resto.

En primer lugar observamos que el orden de los rásteres obviamente importa. Por lo tanto, de un solo disparo de la célula de la estadística, tales como una célula suma, no lo va a hacer.

Si tuviéramos que encontrar una secuencia como 01110101 en una célula dada, nos sería de este proceso desde el inicio hasta el final y

  1. Comenzar con una cuenta en cero.

  2. Incremente el contador cada vez que nos encontramos con un 1.

  3. Restablecer el recuento cada vez que nos encontramos con un 0, después de guardar el último recuento.

  4. Al final, tomar la máxima guarda la cuenta (incluyendo el recuento final).

Paso 1 se implementa con un constante cero de la cuadrícula. Los pasos 2 y 3 dependen de lo que nos encontramos: por lo tanto, es un condicional de la operación. Paso 4 claramente es un máximo local. Nos sería de este código, a continuación, un poco más formalmente 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)

Que mejor hace, con una secuencia de comandos de Python cuando tienes muchas redes, pero con ocho no es oneroso para desenrollar el bucle y escriba los pasos con la mano. Esto revela un pequeño problema: el result=max(longest,count) es una especie de "efecto secundario" que es difícil de código con operaciones de mapa de bits. (Pero se puede hacer, como se muestra en la segunda solución de la siguiente). También es ineficiente, ya que añade un extra de cálculo en cada paso. Por lo tanto, modificar el enfoque un poco, con el propósito de poner fuera de la max de la operación hasta el final. Esto requerirá de ahorro de un independiente contar en cada etapa.

Ir a través de este proceso también se encuentra un acceso directo para el primer paso. Esto nos lleva a la siguiente solución, que aunque un poco largo y de uso intensivo de memoria RAM, es simple y consiste rápidamente ejecutado pasos:

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 un máximo local de la operación ha sido siempre disponible).

En el ejemplo que con la entrada de 01110101, la secuencia de "resultado*" contendrá los valores 0, 1, 2, 3, 0, 1, 0, 1, así que al final CellStatistics volvería 3, la longitud de la cadena más larga de 1.

Si la RAM es escasa, la solución puede ser modificado para re-utilizar los resultados intermedios, a un costo de aproximadamente se duplica el 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 que con la entrada de 01110101, la ("temp", "resultado") los valores sería (NoData, 0) después de la primera línea y después de cada par de ("Con", "CellStatistics") de las operaciones de los valores serían (1, 1), (2, 2), (3, 3), (0, 3), (1, 3), (0, 3), (1, 3). Una vez más, el valor final es de 3.

El patrón regular de Mapa de Álgebra expresiones, ya sea en solución indica cómo codificar el algoritmo como un bucle en una secuencia de comandos, el cambio de los índices según corresponda en cada iteración.

3voto

Dave Haynes Puntos 999

¿Has pensado en cambiar los valores de 0 y 1 a los valores con la potencia de 2 (1,2,4,8,16,32). Cuando se combina el 8 cuadrículas usted va a obtener valores únicos para cada celda, el cual le dará consecutivos info (es decir: un valor de 3 años medio 1 y 2, donde un valor de 54 serían años de 6 a 8).

Solo un pensamiento

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