J'ai une couche vectorielle avec des millions de polygones assurant une couverture continue. J'ai besoin de les classer selon leur forme. J'utilise déjà plusieurs indices de forme de l'écologie du paysage comme la compacité ( 4piA / P ^ 2 ), la largeur moyenne ( 2A / P ), le numéro de forme ( P / sqrt (A) ), j'ai également vu cette réponse à Calcul de la rondeur / compacité de polygone?
Mon problème est que toutes ces mesures utilisent uniquement un certain rapport de surface et de périmètre. Même l' indice de dimension fractale utilise uniquement l'aire et le périmètre ( 2ln (0,25 P) / ln (A) ). Mais comment distinguer deux polygones ayant la même surface et le même périmètre mais une forme absolument différente? Comme ce polygone ramifié A:
que j'ai essayé de dessiner avec la même surface et le même périmètre que la bande courbe B. Tous mes index connus seront les mêmes pour eux. Mais pour moi, il est très important de différencier les bandes simples (y compris incurvées comme la nouvelle lune) des formes ramifiées complexes.
Je montre intentionnellement le polygone B sous forme de bande incurvée et non de bande droite parce que je connais l' indice de cercle circonscrit qui détecte les formes allongées droites, mais mes polygones peuvent également avoir les mêmes cercles. Même si je construis une coque convexe et calcule un ratio de zones Apolygone / Aconvex , cela peut être très similaire ici.
Alors, comment puis-je distinguer clairement le polygone ramifié A du polygone B dans les données vectorielles automatiquement? (Les convertir en raster nécessiterait une taille de cellule extrêmement petite, un énorme ensemble de données et un manque de mémoire, donc ce n'est pas possible). Existe-t-il d'autres indices de forme qui incluent d'autres paramètres? Idéalement, la méthode distinguerait non seulement des polygones clairement ramifiés, mais même C et D:
Ma seule idée est de construire la coque convexe puis d'effacer le polygone de sa coque convexe et de compter le nombre de (gros) morceaux qu'elle laisse (effacer polygone par polygone et non la couche entière). Cela pourrait montrer la complexité de la frontière.
Je me réjouis des solutions / algorithmes mathématiques, que je mettrais plus tard en œuvre en Python.
Réponses:
Vous pouvez jeter un œil à la méthode suivante: squelette vos polygones et plutôt travailler sur des entités de type ligne liées à votre polygone d'origine avec un ID de polygone source unique. Je suppose qu'il y a quelques suppositions à faire (par exemple, quand considérer une polyligne comme une vraie ligne médiane: longueur minimale pour qu'une polyligne soit éligible au statut de ligne centrale). Lorsque le nombre d'axes est supérieur à 1 pour un seul polygone source, il est ramifié.
Un polygone ramifié, lorsqu'il est nettoyé jusqu'à une ligne médiane, aura plusieurs lignes alors qu'un polygone droit peut n'avoir qu'une seule grande ligne au centre (identique à l'interprétation humaine en fait).
Exemple :
Plus d'exemples de cette logique:
Je n'ai rien essayé, juste essayer la logique, mais je pense que cela pourrait fonctionner.
Voir: Skeletonize vecteurs dans QGIS / Python ou http://postgis.net/docs/ST_StraightSkeleton.html
Ou
Source: Extraction de la ligne centrale d'un polygone complexe dans PostGIS / Python
EDIT: Pour les cas C & D, vous devez déjà avoir filtré les formes B (non ramifiées).
la source