Ich habe eine Vektorebene mit Millionen von Polygonen, die eine kontinuierliche Abdeckung ermöglichen. Ich muss sie nach ihrer Form klassifizieren. Ich verwende bereits mehrere Formindizes aus der Landschaftsökologie wie Kompaktheit ( 4piA / P ^ 2 ), mittlere Breite ( 2A / P ), Formzahl ( P / sqrt (A) ), diese Antwort habe ich auch bei Berechnung der Rundheit / Kompaktheit von gesehen Polygon?
Mein Problem ist, dass alle diese Metriken nur ein bestimmtes Verhältnis von Fläche und Umfang verwenden. Sogar der fraktale Dimensionsindex verwendet nur Fläche und Umfang ( 2 ln (0,25 P) / ln (A) ). Aber wie kann ich zwei Polygone mit gleicher Fläche und Umfang, aber absolut unterschiedlicher Form unterscheiden? Wie dieses verzweigte Polygon A:
Ich habe versucht, mit der gleichen Fläche und dem gleichen Umfang wie der gebogene Streifen B zu zeichnen. Alle meine bekannten Indizes sind für sie gleich. Aber für mich ist es sehr wichtig, einfache Streifen (einschließlich gebogen wie Neumond) von komplexen verzweigten Formen zu unterscheiden.
Ich zeige das Polygon B absichtlich als gekrümmten Streifen und nicht als geraden Streifen, da mir der Index "Verwandter Kreis" bekannt ist , der gerade längliche Formen erkennt, aber meine Polygone können auch die gleichen Umkreise aufweisen. Auch wenn ich einen konvexen Rumpf konstruiere und ein Flächenverhältnis Apolygon / Akonvex berechne , kann es hier sehr ähnlich sein.
Also, wie kann ich eine klare Unterscheidung verzweigte Polygon A von Polygon B in Vektordaten automatisch? (Das Konvertieren in ein Raster würde eine extrem kleine Zellengröße, einen enormen Datensatz und einen Mangel an Speicher erfordern, daher ist dies nicht möglich.) Gibt es andere Formindizes, die andere Parameter enthalten? Idealerweise würde die Methode nicht nur klar verzweigte Polygone, sondern auch C und D unterscheiden:
Meine einzige Idee ist es, den konvexen Rumpf zu konstruieren, dann das Polygon von seinem konvexen Rumpf zu löschen und die Anzahl der (großen) Teile zu zählen, die er hinterlässt (Löschen von Polygon für Polygon und nicht der gesamten Ebene). Dies könnte die Grenzkomplexität aufzeigen.
Ich begrüße mathematische Lösungen / Algorithmen, die ich später in Python implementieren würde.
Antworten:
Sie können sich die folgende Methode ansehen: Skelettieren Sie Ihre Polygone und bearbeiten Sie stattdessen Linientyp-Features, die sich auf Ihr ursprüngliches Polygon beziehen, mit einer eindeutigen Quellpolygon-ID. Ich denke, es gibt einige Ratschläge (zum Beispiel, wenn eine Polylinie als eine echte Mittellinie betrachtet werden soll: minimale Länge, damit eine Polylinie für den Mittellinienstatus in Frage kommt). Wenn die Anzahl der Mittellinien für ein einzelnes Quellpolygon größer als 1 ist, wird verzweigt.
Ein verzweigtes Polygon hat, wenn es bis zu einer Mittellinie aufgeräumt wird, mehrere Linien, wohingegen ein gerades Polygon möglicherweise nur eine große Linie in der Mitte hat (genau wie die menschliche Interpretation).
Beispiel:
Weitere Beispiele für diese Logik:
Ich habe nichts ausprobiert, nur Logik ausprobiert, aber ich denke, es könnte funktionieren.
Siehe: Skelettieren von Vektoren in QGIS / Python oder http://postgis.net/docs/ST_StraightSkeleton.html
Oder
Quelle: Extrahieren der Mittellinie eines komplexen Polygons in PostGIS / Python
BEARBEITEN: Für Fälle C & D müssen Sie bereits B-Formen gefiltert haben (nicht verzweigt).
quelle