5 votos

¿Dividir la capa de polilíneas en grupos con requisitos específicos en ArcGIS for Desktop?

Para mi trabajo en ArcGIS 10.2 for Desktop necesito dividir las capas de líneas en clusters/grupos. Actualmente lo hago manualmente, pero me gustaría automatizarlo. Las capas de líneas pueden constar de 50 a 2500 segmentos (líneas más pequeñas). Lo que necesito conseguir es que la capa de líneas se divida en un n de clusters (donde n puede ser fijado por el usuario) que cumplan los siguientes requisitos. Por orden de importancia:

  1. El primer requisito es que un grupo siempre debe estar formado por 8 o más segmentos.
  2. La segunda es que los segmentos deben estar cerca unos de otros.
  3. La tercera es que las agrupaciones deben tener un n de segmentos.

Así que para explicar este orden de importancia un poco más tengo que ejemplos con imágenes:

Primer ejemplo de una capa de líneas que se divide en 24 clusters con una media de 20 segmentos por cluster. La flecha roja es una parte de la capa de líneas que consta de 4 segmentos. Por lo tanto, esto debe formar 1 cluster con varios segmentos de la parte con la flecha verde, de modo que es al menos 8 segmentos, pero preferiblemente 20 segmentos.

enter image description here

Segundo ejemplo. En el caso de que toda la capa de líneas tenga 60 segmentos que se dividan en 3 capas, la situación ideal sería 3 clusters con cada uno de los 20 segmentos que están conectados entre sí. Pero si hay una parte aislada de la capa de línea que consta de 10 segmentos (1), ésta debería ser un cluster y la otra parte, que consta de 50 segmentos, debería dividirse en 2 clusters (2 y 3) de 25 segmentos (ver imagen)

enter image description here

He intentado realizar esta tarea buscando en algunas herramientas de arcgis pero no he encontrado todavía una solución. Por ejemplo la herramienta de análisis de agrupación, pero hasta ahora no he podido personalizarla lo suficiente como para satisfacer mis necesidades. También encontré este post que es más o menos lo que estoy buscando pero no completamente: dividir los polígonos en igual número de grupos . Pero por lo que entiendo esto no cumple completamente mis requisitos, especialmente el orden de importancia. Por lo tanto, la solución de FelixIP es difícil de entender para mí y por lo tanto no soy capaz de juzgar si puedo usar esto.

Así que, en este punto, me parece que mi problema es un problema matemático difícil de resolver, especialmente con las herramientas estándar de Arc. Pero tal vez alguien tiene algunas buenas ideas/métodos (tal vez con un python personalizado script) para conseguir esta tarea o al menos me puede poner en el camino correcto?

0 votos

Echa un vistazo a sDNA Si el sistema genera varias métricas, es posible que haya una combinación de valores que pueda ayudar. Que conste que no he utilizado este software, así que no puedo opinar sobre él.

0voto

FelixIP Puntos 4035

He publicado varias veces en esta Q, por ejemplo aquí . Parece que no he explicado bien cómo funciona mi método de agrupación, porque muchos usuarios tienen dificultades para entenderlo. Este es otro intento basado en el más básico de todos los ejemplos que se me ocurren.

Pongamos 6 puntos en la línea recta:

enter image description here

y tratar de crear 3 grupos con igual número de miembros en cada uno.

Para ello, iteraremos por todas las combinaciones de nodos de dos en dos, por ejemplo (0,1), (0,2), (0,3)...(3,4),(3,5),(4,5). Para cada combinación, comprobaremos los nodos/candidatos restantes y asumiremos que el candidato pertenece al grupo del primer nodo si su distancia al primer nodo de la combinación es menos que al 2º nodo en combinación. En caso contrario, este candidato pertenece al grupo del 2º nodo. Romperemos cuando el 2º grupo (grande) sea el doble de grande que el 1º grupo (pequeño), es decir

RATIO de los tamaños de los grupos = 3 -1 = 2.

Nuestro primer grupo (pequeño) se convertirá en nuestra primera agrupación.

La siguiente tabla muestra los resultados de las iteraciones

enter image description here

Como se puede ver, llegamos a la solución (RATIO de 2º/1º = 2) en el paso 13 y los nodos [3,2] son nuestro primer cluster.

Volvemos a empezar recorriendo los nodos restantes [4,5,0,1] esta vez intentando conseguir RATIO= 2 -1=1. Cuando se alcance el RATIO de 1, obtendremos el cluster nº 2. El resto es el cluster No 3.

Tenga en cuenta que si fuéramos menos inflexibles y simplemente calculáramos la proporción de tamaños de grupos grandes/pequeños, alcanzaríamos la solución en la segunda iteración con el primer clúster=[2,3].

Por lo tanto, lo único que se necesita para implementar este método es la capacidad de calcular la distancia más corta entre dos nodos cualesquiera A y B. Además, ni siquiera es necesario calcular la distancia real, basta con establecerla igual a 1 entre todos los vecinos inmediatos, por lo que la longitud del viaje será igual al número de enlaces pasados mientras se viaja de A a B. Hay un montón de algoritmos más cortos disponibles como funciones separadas de Python. Yo prefiero usar networkx simplemente porque hace el código más corto. Cualquier geometría (puntos, polilíneas y polígonos) puede representar nodos .

Lo único que se requiere es la definición de los vecinos y en cualquier SIG decente la unión espacial (nodos a sí mismo) con la opción de uno a muchos lo hace, es decir, crea un par de vecinos conectados. Los registros de esta tabla son enlaces .

Creo que el método explicado anteriormente puede ser fácilmente adaptado para resolver la pregunta en OP. Sólo hay que añadir un paso: combinar los segmentos que se cruzan y tratar cada uno de esos grupos de forma individual, por ejemplo, definiendo el número de subgrupos por

N=int(recuento total de segmentos en el clúster/20)

Si el cluster individual contiene << 20 segmentos, déjelo para un análisis posterior, con diferente tipo de relación de unión espacial (dentro de la distancia de).

0 votos

Gracias por tu explicación, ahora me queda más claro el método. Tengo que sumergirme en él ahora para ver si lo consigo. Sobre todo el 1 paso a añadir y donde añadirlo no me queda del todo claro todavía.

0 votos

Es una pregunta aparte que tienes que hacer

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