Dados múltiples polígonos que se superponen de múltiples maneras, me gustaría exportar de estas características todos los polígonos que no se superponen con otros, de forma iterativa.
El producto sería una serie de características sin solapamiento que, cuando se suman, forman el original.
Los productos podrían utilizarse como entrada para las estadísticas zonales, y esto sería mucho más rápido que iterar estadísticas zonales sobre cada polígono.
He estado tratando de codificar esto en ArcPy sin éxito.
¿El código para hacer esto ya existe?
arcpy
algorithm
overlapping-features
ndimhypervol
fuente
fuente
Respuestas:
Este es un problema de coloración gráfica .
Recuerde que un color de gráfico es una asignación de un color a los vértices de un gráfico de tal manera que no haya dos vértices que compartan un borde también tendrán el mismo color. Específicamente, los vértices (abstractos) del gráfico son los polígonos. Dos vértices están conectados con un borde (no dirigido) cada vez que se cruzan (como polígonos). Si tomamos alguna solución al problema, que es una secuencia de (digamos k ) colecciones disjuntas de los polígonos, y asignamos un color único a cada colección en la secuencia, entonces habremos obtenido una k- coloración del gráfico . Es deseable encontrar una pequeña k .
Este problema es bastante difícil y sigue sin resolverse para gráficos arbitrarios. Considere una solución aproximada que sea simple de codificar. Un algoritmo secuencial debe hacer. El algoritmo galés-Powell es una solución codiciosa basada en un orden descendente de los vértices por grado. Traducido al lenguaje de los polígonos originales, primero ordene los polígonos en orden descendente del número de otros polígonos que se superponen. Trabajando en orden, déle al primer polígono un color inicial. En cada paso sucesivo, intente colorear el siguiente polígono con un color existente: es decir, elija un color que no seaya utilizado por cualquiera de los vecinos de ese polígono. (Hay muchas formas de elegir entre los colores disponibles; pruebe el que menos se haya utilizado o elija uno al azar). Si el próximo polígono no se puede colorear con un color existente, cree un nuevo color y asígnelo.
Una vez que haya logrado una coloración con una pequeña cantidad de colores, realice las zonas zonal color por color: por construcción, se garantiza que no se superponen dos polígonos de un color determinado.
Aquí hay un código de muestra
R
. (El código de Python no sería muy diferente). Primero, describimos las superposiciones entre los siete polígonos mostrados.Es decir, los polígonos 1 y 2 se superponen, y también lo hacen los polígonos 2 y 3, 3 y 4, ..., 1 y 7.
Ordenar los vértices por grado descendente:
Un algoritmo de coloración secuencial (en bruto) utiliza el primer color disponible que no haya sido utilizado por ningún polígono superpuesto:
Inicialice las estructuras de datos (
colors
ycolor.next
) y aplique el algoritmo:Divide los polígonos en grupos según el color:
La salida en este ejemplo usa cuatro colores:
Ha dividido los polígonos en cuatro grupos no superpuestos. En este caso, la solución no es óptima ({{3,6,5}, {2,4}, {1,7}} son tres colores para este gráfico). Sin embargo, en general, la solución que obtiene no debería ser tan mala.
fuente
La metodología recomendada por #whuber me inspiró a tomar una nueva dirección, y aquí está mi solución arcpy, en dos funciones. El primero, llamado countOverlaps, crea dos campos, "overlaps" y "ovlpCount" para registrar para cada poli que polys se superpuso con él y cuántas superposiciones ocurrieron. La segunda función, explodeOverlaps, crea un tercer campo, "expl", que proporciona un número entero único a cada grupo de polys no superpuestos. El usuario puede exportar nuevos fc basados en este campo. El proceso se divide en dos funciones porque creo que la herramienta countOverlaps puede resultar útil por sí misma. Disculpe la descuido del código (y la convención de nomenclatura descuidada), ya que es bastante preliminar, pero funciona. También asegúrese de que el "idName" El campo representa un campo con ID únicos (solo probado con ID enteros). ¡Gracias whuber por proporcionarme el marco necesario para abordar este problema!
fuente
countOverlaps
corresponde a las dos líneasnbrhoods <- sapply(vertices, neighbors); degrees <- sapply(nbrhoods, length)
en mi código:degrees
es el recuento de superposición. Por supuesto, su código es más largo porque refleja la mayor parte del análisis SIG que se da por sentado en mi solución: es decir, que primero identifica qué polígonos se superponen y que al final usa la solución para generar conjuntos de datos de polígonos. Sería una buena idea encapsular los cálculos teóricos de gráficos, por lo que si alguna vez encuentra un algoritmo de coloración mejor, sería fácil de conectar.Ha pasado un tiempo, pero usé este código para mi propia aplicación y ha funcionado muy bien, gracias. Reescribí parte de él para actualizarlo, aplicarlo a las líneas (con tolerancia) y acelerarlo significativamente (a continuación, lo estoy ejecutando en 50 millones de búferes de intersección y solo toma un par de horas).
fuente
En estos casos, generalmente uso el siguiente método:
Creo que el resultado será el que deseabas, e incluso puedes contar el número de superposiciones. No sé si en términos de rendimiento será mejor para usted o no.
fuente