Los píxeles a la izquierda representan ubicaciones de árboles y sus radios de copa asociados (es decir, valores de píxeles que van de 2 a 5). Me gustaría amortiguar estos píxeles de trama por su valor de radio de corona. La imagen a la derecha es lo que espero lograr usando solo métodos de procesamiento de ráster .
Inicialmente, pensaría usar una suma focal circular en ArcGIS, aunque la configuración de vecindario es un valor fijo, que no tendría en cuenta el radio de corona de tamaño variable.
¿Cuál es un buen método para "almacenar" los píxeles por sus valores?
Respuestas:
Aquí hay una solución raster pura para
Python 2.7
usarnumpy
yscipy
:Entrada:
Salida:
fuente
Enfoque basado en vectores
Esta tarea se puede realizar en tres pasos:
Raster To Point
;Buffer
(utilizando elVALUE
campo como campo de búfer );Feature To Raster
.Nota: el uso del campo de búfer evita el cálculo de un búfer para cada valor de radio de corona.
Enfoque basado en ráster
Al evitar la solución basada en vectores, este problema sugiere utilizar un tipo de autómatas celulares basados en los vecinos más cercanos. Suponiendo que todos los píxeles negros son ceros, los píxeles son cuadrados y su tamaño es igual a 1 (o, alternativamente, están escalados oportunamente), las reglas a adoptar son muy simples:
VALUE
) es mayor que 1, su valor se convierteVALUE-1
y luego considera sus píxeles circundantes. Si sus valores son menores queVALUE-1
, estos píxeles nacen o crecen y su valor se vuelveVALUE-1
. De lo contrario, estos píxeles sobreviven y no se modifican.VALUE<=1
no hace nada (¡el píxel está muerto!).Estas reglas deben aplicarse hasta que todos los píxeles estén muertos, es decir, sus valores son iguales a 0 o 1. Entonces
N-1
, ¿dóndeN
está el valor máximo que tiene en el ráster de entrada? Este enfoque se puede implementar fácilmente con un poco de Python y numpy.fuente
Otra opción sería crear rásteres separados para cada valor de píxel, en este caso 4 rásteres, con una condición. Luego expanda los rásteres por un recuento de píxeles correspondiente al valor del ráster (posiblemente iterando sobre una lista de valores). Por último, une los rásteres (algebraicos o espaciales) para crear un ráster binario para las coronas de los árboles.
fuente
Es una pregunta difícil hacer esto en la trama porque no tiene la oportunidad de usar el valor del píxel para definir el tamaño del búfer. Por lo tanto, necesitaría hacer el filtro focal para cada valor, como ya dijo.
Aquí hay una posible respuesta para hacerlo con solo 3 filtros (no pude encontrar menos), pero no perfectamente como lo mencionó Whuber: sus amortiguadores se truncarán cuando los árboles estén cerca unos de otros.
1) EDITAR: asignación euclidiana (esto no resuelve completamente el problema, ya que corta los amortiguadores en la vecindad de árboles más pequeños, pero es mejor que los artefactos de mi primera solución).
2) distancia euclidiana alrededor de cada píxel
3) calculadora ráster (álgebra de mapas) con una declaración condicional
Tenga en cuenta que puede ajustar la condición según sus necesidades en términos de radio (con o sin el píxel central)
fuente
¿Me pregunto por qué no usas la herramienta de expansión de ArcGIS ?
En caso de superposición: el último
expand
comando cubrirá los anteriores.fuente
Si tiene la posición del píxel, el radio y el algoritmo del círculo del punto medio (una variante del Bresenham Alg.) Le dan una pista. En mi opinión, es fácil crear un polígono a partir de este enfoque y creo que es fácil implementarlo en Python. Una unión de este conjunto de polígonos le proporciona el área de cobertura.
fuente