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:
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:
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.
Respuestas:
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:
Más ejemplos de esta lógica:
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
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).
fuente