Mehr

Finden Sie die untere linke Ecke eines gedrehten Polygons


Ich kämpfe derzeit mit einem mathematischen Problem und bekomme es anscheinend nicht gelöst.

Ich habe eine Reihe von gedrehten rechteckigen Polygonen (die Lösung sollte auch für nicht rechteckige Polygone funktionieren) in verschiedenen Shapefiles. Ich möchte (automatisch) die untere linke Ecke jedes der Polygone mit Python (Arcpy) finden.

Zuerst habe ich versucht, einfach die Ausdehnung zu verwenden, aber da sie gedreht sind, führt die Ausdehnung zu falschen Ergebnissen. Wie gehe ich das an? Ich habe stundenlang gegoogelt und das einzige, was mir eingefallen ist, ist, den Mittelpunkt des Polygons irgendwie zu berechnen oder es irgendwie vorübergehend auf 180 Grad zu drehen und dann xmin und ymin zu verwenden. Hier sind ein paar Bilder, die helfen können, die Aufmerksamkeit von meinem schlechten Englisch abzulenken (sorry für das btw)

Ich hatte keine Probleme beim Exportieren der Koordinaten der Polygone, indem ich das Werkzeug "Feature-Scheitelpunkte in Punkte" verwendet habe. Bisher habe ich sie einmal in einer Liste von Tupeln extrahiert und einmal in zwei verschiedenen Listen (eine für x-Koordinaten und eine für y-Koordinaten).

Hier sind ein paar Koordinaten, um das Testen zu erleichtern:

Tupel-Format:

tupelList=[[1792398.680577231, 4782539.85121522], [1792173.0363913027, 4780368.293228334], [1788935.7990357098, 4780713.732859781], [1789162.9530321995, 4782885.332685629], [1792398.680577231, 4782539.851

x-Listen-/y-Listenformat:

xListe= [1792398.680577231, 1792173.0363913027, 1788935.7990357098, 1789162.9530321995, 1792398.680577231] yListe=[4782539.85121522, 4780368.293228334, 4780713.732859781, 4782885.33268562922, 4782539.851

Ich verwende derzeit ArcGIS 10.3.1-Breitenverbündete-Erweiterungen und eine erweiterte Lizenz. Version von Python ist 2.7.something


Hier ist ein sehr einfacher Ansatz, der die gesamte Verarbeitung in das Sort GP-Tool auslagert. Da Sie Zugriff auf eine Advanced-Lizenz haben, führt die Sortierung nach Form und beginnend in der unteren linken Ecke zu schnellen Ergebnissen.

import os, arcpy arcpy.env.overwriteOutput = True inFC = r''outFC = r'' # Ausgabe-FC erstellen, um Punkte und Feld zum Verknüpfen von OIDs zu speichern spatref = arcpy.Describe(inFC).spatialReference arcpy.CreateFeatureclass_management(*os.path.split(outFC), Geometrie_type="POINT", Spatial_reference=spatref) arcpy.AddField_management (outFC, "ID", "LONG") mit arcpy.da.SearchCursor(inFC, ["[email protected]", "[email protected]"]) als sCursor: mit arcpy.da.InsertCursor(outFC, ["ID", " [email protected]"]) as iCursor: for oid, poly in sCursor: # Die Verwendung von Geometry-Objekten ist sehr schnell und hat den zusätzlichen Vorteil, # Listen von Geometrien zurückzugeben # Da wir die Scheitelpunkte nach LL sortieren, ist der erste die Antwort verts = arcpy.FeatureVerticesToPoints_management(poly, arcpy.Geometry()) sort = arcpy.Sort_management(verts, arcpy.Geometry(), [["SHAPE", "ASCENDING"]], "LL")[0] iCursor.insertRow ([oid, sortieren])

Aus der Erläuterung zur räumlichen Sortierung sehen wir, dass N/S Vorrang vor E/W hat:

Beachten Sie, dass U Vorrang vor R erhält. R wird nur berücksichtigt, wenn sich einige Features auf derselben horizontalen Ebene befinden.


Angesichts der Beispiele der Rechtecke und Parallelogramme und wenn ich Ihre Formulierung von "unten links" (d. h. "im Südwesten") richtig verstehe, eine naive Lösung:

Sie können die vier Scheitelpunkte nach aufsteigender Breite sortieren (d. h. der südlichste ist der erste, der nördlichste ist der letzte). Wenn zwei Breitengrade gleich sind, spielt ihre Reihenfolge keine Rolle. Wählen Sie dann unter den beiden südlichsten Punkten den weiter westlich liegenden aus. Dies würde Ihnen die grün gepunkteten Ecken in dieser Abbildung ergeben:

Die folgenden Fälle können seltene oder nicht vorhandene Fälle sein, aber die oben genannten Fälle fallen mit einem Viereck auseinander, bei dem die beiden Scheitelpunkte zwischen dem südlichsten und dem nördlichsten den gleichen Breitengrad haben, z , oder sogar wenn ein perfektes Rechteck nur so gedreht wird:

Um mit diesen Fällen robust umzugehen, könnten Sie einen Ansatz verwenden, der die mediale Achse der Form berechnet (https://en.wikipedia.org/wiki/Medial_axis), ihre Neigung mit 45 und 135 Grad vergleicht und die "unten" bestimmt " und "oben" der Form im Vergleich dazu. Gehen Sie dann wie oben vor, wobei der westlichste Punkt der beiden "untersten" Punkte der zu wählende Punkt ist. Das würde in zwei der oben dargestellten Fälle funktionieren. Bei einem perfekten Quadrat in der "Diamant"-Rotation würde es immer noch fehlschlagen - aber dann gibt es keine "natürliche" untere linke Ecke dieser Form. Eine andere Möglichkeit, mit diesen Fällen umzugehen, in denen die Punkte 2 und 3 in der vertikalen Folge auf gleichem Breitengrad liegen, besteht darin, tatsächlich Punkt 1 zu nehmen, den südlichsten Punkt; oder der westlichste Punkt zwischen 2 und 3.