Erkennen Sie verzweigte Polygonformen?

13

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:

verzweigtes Polygon gegen gekrümmten Streifen

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:

Bildbeschreibung hier eingeben

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.

Nadya
quelle
1
Du brauchst nicht viel Python. Versuchen ! gestalten!. convexHull (). symmetricDifference (! shape!) Im Feldrechner. Versuchen Sie es zuerst mit einer kleinen Teilmenge. Informationen zur korrekten Syntax finden Sie in der Hilfe zur Arcpy-Geometrie.
FelixIP
Dies könnte eine großartige Frage sein, aber im Moment stellen Sie mehrere Fragen, indem Sie nicht festlegen, ob Sie Fragen zu QGIS oder ArcGIS Desktop stellen und dann auch Python verwenden. Sobald Sie genau angegeben haben, was Sie versucht haben, können potenzielle Antwortende leichter feststellen, wo Sie stecken. Ich schlage vor, es auf QGIS zu konzentrieren, um zu vermeiden, dass Ihre erste Antwort verloren geht.
PolyGeo
1
Ich habe Daten in der Esri-Geodatabase, da ein Shapefile bereits größer als 2 GB war. Ich könnte etwas dagegen tun, wenn es eine funktionierende Lösung in QGIS oder irgendwo gibt. Aber ich frage nicht in einer bestimmten Software. Ich frage nach einer Metrik, einer Methode zur mathematischen Erkennung einer Form mit komplexem Rand (verzweigt). 1 Frage. Ein wissenschaftlicher Artikel mit einer Formel wäre auch in Ordnung, ich werde mir überlegen, wie ich es selbst umsetzen kann.
Nadya
1
Mein erster Gedanke war derselbe wie Ihr, als ich die Unterschiede zwischen der Anzahl und Größe der Polygone betrachtete, die nach dem Subtrahieren des Originals von seiner konvexen (oder konkaven) Hülle übrig waren (siehe auch Alpha-Formen).
user2856
1
Wenn nur das Skelett schnell genug wäre, um zu berechnen, würde ich es verwenden, um 4 A / PL, Fläche, Umfang und Länge zwischen den Farmost-Skelettknoten zu berechnen, um die Kompaktheit zu gewährleisten. Gleiches gilt für den größten Beschriftungskreis.
FelixIP

Antworten:

11

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:

  • Wenn Sie einen Y-Buchstaben zeichnen, verwenden Sie mindestens 2 fortlaufende Striche (= 2 Polylinien), sodass er verzweigt ist, da die minimale Anzahl von Strichen> 1 ist.
  • Wenn Sie einen L-Buchstaben zeichnen, verwenden Sie mindestens einen kontinuierlichen Strich. Es ist nicht verzweigt.

Weitere Beispiele für diese Logik:

  • Wenn Sie ein A zeichnen: 2 Striche = es ist verzweigt
  • Wenn Sie ein B dämmern: 3 Striche = es ist verzweigt
  • Wenn Sie einen C: 1-Strich zeichnen, ist dieser nicht verzweigt
  • etc

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

Beispiel

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).

  • Stellen Sie sicher, dass eine eindeutige ID die Mittellinie und das Quellpolygon verknüpft.
  • Verwandeln Sie Ihre Polygone in Polylinien
  • Verdichten Sie die Mittellinien-Polylinie und die Grenzlinien-Polylinie mit regelmäßigen Punkten (nicht zu viel, um später Speicherprobleme zu vermeiden, aber genug, um die unregelmäßigen Bits zu "fangen".
  • Erstellen Sie eine Abstandsmatrix zwischen den Punkten der Mittellinie und den Punkten der Grenzlinie
  • Behalten Sie in der Matrix nur die Zeilen bei, bei denen ID_centerline = ID_borderline
  • Erstellen Sie Statistiken mit einem Standardabweichungswert
  • Legen Sie einen Grenzwert fest, um für hohe SD-Werte anzuzeigen, dass es sich um eine nicht reguläre Kontur handelt, und erstellen Sie für jede eindeutige ID den erforderlichen Indikator
  • Stellen Sie den Indikator auf das ursprüngliche Polygon zurück, indem Sie das Feld auf der Basis der eindeutigen ID verbinden.
gisnside
quelle
Vielen Dank für die Idee, ich werde versuchen, Mittellinien zu erstellen
Nadya
Nur, das Problem, meine Polygone C und D zu unterscheiden, bleibt
Nadya
Möglicherweise benötigen Sie unterschiedliche Methoden für unterschiedliche Fälle und teilen die Arbeit auf. Wenn Sie nicht verzweigte Polygone (B) haben, können Sie B verfeinern, um C und D zu finden. Das Problem ist, dass ich nicht sehe, mit welcher Logik Sie C von D unterscheiden. Sie müssen es wahrscheinlich klar formulieren Kriterien.
gisnside
1
Der Unterschied zwischen C und D scheint darin zu liegen, dass in C die Seiten des Polygons ungefähr einen gleichmäßigen Abstand von der Mittellinie haben, während in D die Seiten einen ungleichmäßigen Abstand von der Mittellinie haben.
Csk
1
@csk das sehe ich. Ich denke, das in Code zu übersetzen, würde Statistiken über den Abstand zwischen Mittellinie und Grenzlinie berechnen. Indem Sie die Randpolylinie mit mehr Punkten verdichten und dann diesen Rand in Punkte konvertieren + einen Abstand zum entsprechenden Job auf der Mittellinie herstellen, erhalten Sie Statistiken zu diesem Verhalten. Wenn die Standardabweichung hoch ist, ist die Form wahrscheinlich unregelmäßig. Schwer zu sehen, wie man das auf tausenden von Polygonen macht ... nette Herausforderung dort
gisnside