¿Detectando forma de polígono ramificado?

13

Tengo una capa vectorial con millones de polígonos que hacen una cobertura continua. Necesito clasificarlos según su forma. Ya estoy usando varios índices de formas de la ecología del paisaje como la compacidad ( 4piA / P ^ 2 ), el ancho medio ( 2A / P ), el número de forma ( P / sqrt (A) ), también vi esta respuesta para Calcular la redondez / compacidad de ¿polígono?

Mi problema es que todas estas métricas utilizan solo una proporción de área y perímetro. Incluso el índice de Dimensión Fractal está usando solo área y perímetro ( 2ln (0.25P) / ln (A) ). Pero, ¿cómo puedo distinguir dos polígonos con la misma área y perímetro pero con una forma absolutamente diferente? Como este polígono ramificado A:

polígono ramificado vs tira curva

que traté de dibujar con la misma área y perímetro que la tira curva B. Todos mis índices conocidos serán los mismos para ellos. Pero para mí es muy importante diferenciar las tiras simples (incluidas las curvas como la luna nueva) de las formas ramificadas complejas.

Muestro intencionalmente el polígono B como una franja curva y no una franja recta porque conozco el índice de circunferencia circunscrita que detecta formas alargadas rectas, pero mis polígonos también pueden tener las mismas circunferencias. Incluso si construyo el casco convexo y calculo una proporción de áreas Apolygon / Aconvex , puede ser muy similar aquí.

Entonces, ¿cómo puedo distinguir claramente el polígono A ramificado del polígono B en los datos vectoriales automáticamente? (Convertirlos en ráster requeriría un tamaño de celda extremadamente pequeño, un enorme conjunto de datos y una falta de memoria, por lo que no es posible). ¿Hay otros índices de forma que incluyen otros parámetros? Idealmente, el método distinguiría no solo polígonos claramente ramificados sino incluso C y D:

ingrese la descripción de la imagen aquí

Mi única idea es construir el casco convexo, luego borrar el polígono de su casco convexo y contar el número de piezas (grandes) que deja (borrando polígono por polígono y no toda la capa). Esto podría mostrar la complejidad de la frontera.

Doy la bienvenida a soluciones / algoritmos matemáticos, que luego implementaría en Python.

nadya
fuente
1
No necesitas mucho Python. Tratar ! ¡forma!. convexHull (). symmetricDifference (! shape!) En la calculadora de campo. Intente primero con una pequeña copia de subconjunto. Consulte la ayuda de geometría arcpy para la sintaxis correcta.
FelixIP
Esta podría ser una gran pregunta, pero en este momento está haciendo múltiples preguntas al no anotar si está preguntando sobre QGIS o ArcGIS Desktop y luego también agrega Python. Una vez que especifique con precisión lo que ha intentado, es más fácil que los posibles respondedores lo ayuden a atascarse. Sugiero centrarlo en QGIS para evitar perder su primera respuesta.
PolyGeo
1
Tengo datos en la geodatabase de Esri porque un archivo de forma ya superaba los 2 gb. Podría hacer algo al respecto si hay una solución que funcione en QGIS o en alguna parte. Pero no estoy preguntando dentro de un software específico. Estoy preguntando sobre una métrica, un método para detectar matemáticamente una forma con borde complejo (ramificado). 1 pregunta. El artículo científico con una fórmula también estaría bien, pensaré cómo implementarlo yo mismo.
nadya
1
Mi primer pensamiento fue el mismo que el tuyo, observando las diferencias entre el número y el tamaño de los polígonos que quedan después de restar el original de su casco convexo (o cóncavo) (ver también formas alfa).
user2856
1
Si solo el esqueleto fuera lo suficientemente rápido como para calcularlo, lo haría para calcular 4A / PL, área, perímetro, longitud entre los nodos más lejanos del esqueleto para la compacidad. Lo mismo se aplica al círculo inscrito más grande.
FelixIP

Respuestas:

11

Podrías echar un vistazo al siguiente método: esqueletiza tus polígonos y más bien trabaja en las características de tipo de línea relacionadas con tu polígono original con un ID de polígono de origen único. Supongo que hay algunas conjeturas que hacer (por ejemplo, cuándo considerar una polilínea como una línea central real: longitud mínima para que una polilínea sea elegible para el estado de la línea central). Cuando el número de línea central es más de 1 para un polígono de origen único, entonces se ramifica.

Un polígono ramificado, cuando se limpia hasta una línea central, tendrá líneas múltiples, mientras que un polígono recto podría tener solo una línea grande en el centro (lo mismo que la interpretación humana, de hecho).

Ejemplo:

  • cuando dibuja una letra Y, utiliza al menos 2 trazos continuos (= 2 polilíneas), por lo que se ramifica porque el número mínimo de trazos es> 1.
  • cuando dibujas una letra L, usas al menos 1 trazo continuo. No es ramificado.

Más ejemplos de esta lógica:

  • Cuando dibujas un A: 2 trazos = está ramificado
  • Cuando dibujas un B: 3 golpes = es ramificado
  • cuando dibujas un trazo C: 1 = no está ramificado
  • etc.

No he intentado nada, solo intento la lógica, pero creo que podría funcionar.

Ver: Esqueleto de vectores en QGIS / Python o http://postgis.net/docs/ST_StraightSkeleton.html

O

Ejemplo

Fuente: extracción de la línea central de un polígono complejo en PostGIS / Python

EDITAR: Para los casos C y D, debe tener formas B filtradas (no ramificadas).

  • Asegúrese de que una ID única vincule la línea central y el polígono de origen.
  • Transforma tus polígonos en polilíneas
  • Densifique la polilínea de la línea central y la polilínea del borde con puntos regulares (no demasiado para evitar problemas de memoria más adelante, pero lo suficiente como para "atrapar" los bits irregulares.
  • Cree una matriz de distancia entre los puntos de la línea central y los puntos de la línea fronteriza.
  • Mantenga en las líneas de la matriz solo aquellas donde ID_centerline = ID_borderline
  • Crear estadísticas para tener un valor de desviación estándar
  • Establezca un valor límite para indicar para valores SD altos que es un contorno no regular y cree el indicador requerido, para cada ID único
  • Regrese el indicador al polígono original uniendo el campo en la base de la ID única.
Gisnside
fuente
Gracias por la idea, intentaré crear líneas centrales
nadya
Simplemente, el problema de distinguir mi polígonos C y D se mantendrá
Nadya
Es posible que necesite diferentes métodos para diferentes casos y dividir el trabajo. Una vez que tenga polígonos no ramificados (B), puede refinar B para tratar de encontrar C y D. El problema es que no veo qué lógica usa para distinguir C de D. probablemente tendrá que expresarlo claramente con Criterios
Gisnside
1
La diferencia entre C y D parece ser que en C, los lados del polígono están aproximadamente a una distancia uniforme de la línea central, mientras que en D los lados están a una distancia no uniforme de la línea central.
csk
1
@csk veo eso. Supongo que traducir eso en código sería calcular estadísticas sobre la distancia entre la línea central y la línea de borde. Al densificar la polilínea del borde con más puntos, luego convertir este borde en puntos + hacer una distancia desde el trabajo equivalente en la línea central daría estadísticas sobre este comportamiento. Si la desviación estándar es alta, entonces probablemente la forma será irregular. Sin embargo, es difícil ver cómo hacerlo en miles de polígonos ... es un gran desafío allí
desde el