Ich möchte eine Reihe von Polylinien (schwarze Linien im Bild unten) an der Außengrenze eines Polygons befestigen. Alle Hohlräume innerhalb des Polygons sollten ignoriert werden. Meine ideale Ausgabe sind die gestrichelten gelben Linien. Die Anfangslinien können gerade sein oder nicht. Das Bild ist ein vereinfachtes Beispiel, in Wirklichkeit ist das Polygon viel komplexer und es gibt Hunderte von Linien. Ich glaube nicht, dass eine konvexe Hülle funktionieren würde (aber ich könnte mich irren). Ich bin offen für Lösungen in Arcgis, QGIS, Arcpy, Shapely usw. Die Codierung erfolgt vorzugsweise in Python, da ich bei Bedarf für andere Optionen offen bin. Arcgis wäre auch vorzuziehen, um meinen Mitarbeitern das Teilen des Tools zu erleichtern, ist jedoch keine Voraussetzung.
Das Beste, was ich mir derzeit vorstellen kann, ist, eine einzelne Linie mit dem Polygon zu schneiden und an allen Grenzüberschneidungen eine Reihe von Punkten zu erstellen. Sortieren Sie die Punkte nach Abstand zum Zeilenanfang. Der am weitesten und am nächsten gelegene Punkt (FAC) ist die äußere Grenze des Polygons. Verwenden Sie dann die FAC-Punkte, um die richtigen Scheitelpunkte aus der ursprünglichen Linie auszuwählen und die gelbe gestrichelte Linie aus den entsprechenden Punkten zu erstellen. Es sollte funktionieren, scheint aber komplizierter als nötig.
Ein paar zusätzliche Gedanken:
- Die Linien sind "genug" linear, damit eine einfache Abstandsberechnung zwischen Punkten funktioniert. Eine lineare Referenzierung sollte nicht erforderlich sein.
- Dies wäre in arcpy einfach, wenn es ein Werkzeug zum Teilen einer Linie an einem Punkt gäbe, aber ich kann keine finden.
Gedanken jemand?
quelle
Antworten:
Ich möchte meine pyQGIS-Lösung einwerfen, sonst nichts.
Mein Testfall - vor dem Clipping:
Nach dem Abschneiden:
Um die vollständigen Attribute der ursprünglichen Zeilen zu erhalten, ist es meiner Meinung nach am besten, sie mit dem Ergebnis zu verbinden. Andernfalls müssen die im Vorbereitungsabschnitt erstellt und in die innerste Schleife gesetzt werden. Aber ich habe nicht getestet, ob sie den Auflösungsprozess bestehen oder ob sie verloren gehen, weil sie im Prinzip unterschiedliche Werte haben könnten.
quelle
Wenn Sie Integrieren mit den Polygonen und Linien als Eingaben ausführen, wird jedem, an dem sie sich schneiden, ein Scheitelpunkt hinzugefügt. (Vorsicht, da Integrate Eingaben ändert, anstatt neue Ausgaben zu erzeugen.)
Sobald Sie sicher sind, dass es übereinstimmende Scheitelpunkte gibt, können Sie über die Scheitelpunkte der Linie iterieren und testen, ob jeder das andere Merkmal berührt. Nehmen Sie aus der geordneten Liste der Scheitelpunkte, die sich berühren, das Minimum und das Maximum aus der Menge. Machen Sie dann zwei Zeilen aus jedem Feature, A: (Start, ..., Min) und B: (Max, ..., Ende).
Eine andere Option, obwohl ich nicht sicher bin, ob ArcPy die Reihenfolge der Feature-Teile basierend auf der Reihenfolge der Scheitelpunkte im Eingabeobjekt beibehält, besteht darin, den Clip unverändert auszuführen. Für die mittlere Zeile in Ihrem Beispiel sollte sich eine mehrteilige Funktion mit drei Teilen ergeben. Abhängig von der Reihenfolge können Sie jede von Clip erzeugte mehrteilige Zeile durchlaufen und alle bis auf den ersten und letzten Teil der mehrteiligen Out-Funktion entfernen.
quelle
In diesem Fall gibt es drei Probleme:
Löcher
Entfernen Sie Löcher aus Polygonen, da jede Linie innerhalb eines Lochs beibehalten wird. Im folgenden Skript verwende ich Cursor und Geometrien.
Linien zwischen Polygonen
Linien, die zwei Polygone berühren, müssen entfernt werden. Im folgenden Skript führe ich dazu eine räumliche Verknüpfung von durch
one to many
, wobei meine Linien als Eingabe-Feature-Class und meine Polygone als Join-Feature-Class dienen. Jede Linie, die zweimal generiert wird, berührt zwei Polygone und wird entfernt.Endzeilen
Um Linien zu entfernen, die nur ein Polygon an einem Ende berühren, konvertiere ich Linien in Endpunkte. Ich benutze dann Feature-Layer und Auswahlen, um zu bestimmen, welche Endpunkte Floater sind. Ich wähle die Endpunkte aus, die die Polygone schneiden. Ich wechsle dann meine Auswahl. Dadurch werden Endpunkte ausgewählt, die Polygone nicht schneiden. Ich wähle eine Linie aus, die diese ausgewählten Punkte schneidet, und lösche sie.
Ergebnis
Annahmen
erase
und afeature vertices to points
).Skript
Das folgende Skript gibt eine Feature-Class mit dem Namen Ihrer Line-Feature-Class plus
_GreedyClip
in derselben Geodatabase wie Ihre Line-Feature-Class aus. Ein Arbeitsbereich wird ebenfalls benötigt.quelle