Ich versuche, die Wendepunkte herauszufinden, dh Punkte, an denen die Kurven in einer Linie beginnen und enden. Wenn Sie sich das Bild ansehen, ist die grüne Linie möglicherweise eine Straße oder ein Bach, und die schwarzen Punkte sind die Punkte, an denen die Kurven beginnen und enden.
Was wären die übergeordneten Schritte, um die Generierung dieser Punkte zu automatisieren? Ich habe ArcGIS-Desktop und bin mit ArcObjects recht praktisch.
arcobjects
algorithm
Devdatta Tengshe
quelle
quelle
Antworten:
Wenn die Kurve aus Liniensegmenten besteht, sind alle inneren Punkte dieser Segmente Wendepunkte, was nicht interessant ist. Stattdessen sollte die Kurve als durch die Scheitelpunkte dieser Segmente angenähert angesehen werden . Indem wir eine stückweise doppelt differenzierbare Kurve durch diese Segmente splitten, können wir die Krümmung berechnen. Ein Wendepunkt ist dann genau genommen ein Ort, an dem die Krümmung Null ist.
Im Beispiel gibt es längere Strecken, in denen die Krümmung nahezu Null ist. Dies legt nahe, dass die angezeigten Punkte die Enden solcher Strecken von Regionen mit niedriger Krümmung approximieren sollten.
Ein effektiver Algorithmus wird daher die Eckpunkte splitten, die Krümmung entlang eines dichten Satzes von Zwischenpunkten berechnen, Bereiche mit einer Krümmung nahe Null identifizieren (unter Verwendung einer vernünftigen Schätzung dessen, was es bedeutet, "nahe" zu sein) und die Endpunkte dieser Bereiche markieren .
Im folgenden Arbeitscode
R
werden diese Ideen veranschaulicht. Beginnen wir mit einer Zeilenfolge, die als eine Folge von Koordinaten ausgedrückt wird:Spline die x- und y- Koordinaten getrennt , um eine Parametrisierung der Kurve zu erreichen. (Der Parameter wird aufgerufen
time
.)Interpolieren Sie die Splines zum Zeichnen und Berechnen:
Wir benötigen eine Funktion, um die Krümmung einer parametrisierten Kurve zu berechnen . Es muss die erste und die zweite Ableitung des Splines geschätzt werden. Bei vielen Splines (z. B. kubischen Splines) ist dies eine einfache algebraische Berechnung.
R
Liefert die ersten drei Ableitungen automatisch. (In anderen Umgebungen kann es sinnvoll sein, die Ableitungen numerisch zu berechnen.)Ich schlage vor, eine Schwelle für die Krümmung Null in Bezug auf die Ausdehnung der Kurve zu schätzen . Dies ist zumindest ein guter Ausgangspunkt; es sollte entsprechend der Tortuosität der Kurve angepasst werden (dh für längere Kurven erhöht). Dies wird später zum Färben der Diagramme entsprechend der Krümmung verwendet.
Nachdem die Scheitelpunkte gekerbt und die Krümmung berechnet wurden, müssen nur noch die Wendepunkte gefunden werden . Um sie zu zeigen, können wir die Eckpunkte zeichnen, den Spline zeichnen und die Wendepunkte darauf markieren.
Die offenen Punkte sind die ursprünglichen Eckpunkte in
xy
und die schwarzen Punkte sind die Wendepunkte, die mit diesem Algorithmus automatisch identifiziert werden. Da die Krümmung an den Endpunkten der Kurve nicht zuverlässig berechnet werden kann, sind diese Punkte nicht besonders markiert.quelle
Sie können das Verdichtungswerkzeug verwenden . In diesem Fall wählen Sie die Verdichtung nach Winkel. Wählen Sie anschließend den maximalen Winkel, der in einer geraden Linie zulässig ist. Dann auf die Ergebnislinie auf das Werkzeug Linie an Scheitelpunkten teilen anwenden . Löschen Sie abschließend die Linien, deren shape_length kleiner als die minimale Straßenlänge ist.
In diesem Bild sehen wir drei Schritte:
1- Verdichten Sie die Linie mit Winkel. Ich habe 10 Grad als Parameter verwendet, und wir haben splitline verwendet. Im Bild befindet sich die gekrümmte Linie in ihrer Anfangsphase.
2- Wählen Sie die Segmente aus, bei denen shape_length nicht redundant ist. Wie wir in der Tabelle sehen, habe ich diese redundanten Längen nicht ausgewählt. Dann wähle ich sie in einer neuen Feature-Class aus.
3- Wir haben die Eckpunkte an den Kanten der Linien extrahiert, die Wendepunkte sind.
quelle
Sie können das Werkzeug " Generalisieren" verwenden, das den maximalen Versatz von der ursprünglichen Linie als Parameter hat, damit Sie den Versatz auswählen können, der zu Ihrem Fall passt.
Wenn wir die ursprüngliche Zeile "line_cur" und die verallgemeinerte Zeile "line_gen" nennen, könnten wir "line_cur" durch "line_gen" abschneiden. Das Ergebnis ist das gerade Segment von "line_cur". Dann könnten wir einige sehr kurze Segmente bereinigen, indem wir sie mit einer SQL-Abfrage löschen, die die Shape_Länge auswählt, die größer als die minimale Straßenlänge ist.
quelle