Ich suche nach einem effizienten Weg, um Leitungen unabhängig von ihrer Richtung zu gruppieren. Das bedeutet, dass eine Linie zwischen New York und Los Angeles im selben Cluster liegen sollte wie eine Linie in der anderen Richtung zwischen Los Angeles und New York. Die Start- / Endpunktpositionen sollten ähnlich sein (dh San Diego nach Long Island sollte sich im selben Cluster wie LA-NY befinden, aber wahrscheinlich nicht von San Francisco nach Boston), und es gibt keine Zwischenpunkte. Eingabedaten ähneln diesem Beispiel:
(Von Cassiopeia sweet in der japanischen Wikipedia GFDL oder CC-BY-SA-3.0 , über Wikimedia Commons)
Ich habe zuvor versucht, die Linien im Voraus zu sortieren, z. B. um sie alle von West nach Ost laufen zu lassen, aber dies löst nicht das Problem für Linien, die von Nord nach Süd und umgekehrt verlaufen.
Kennen Sie einen Algorithmus, der sich mit diesem Problem befasst? Ich habe gesucht, aber abgesehen vom Algorithmus zur Berechnung der durchschnittlichen Richtung ungerichteter Segmente habe ich nichts entfernt hilfreiches gefunden, daher muss ich die falschen Suchbegriffe verwenden.
quelle
Antworten:
Wenn ich Sie richtig verstehe, möchten Sie Linien bündeln, die in etwa gleich sind, ohne Rücksicht auf die Richtung.
Hier ist eine Idee, von der ich denke, dass sie funktionieren könnte.
Teilen Sie die Linien in Start- und Endpunkt
Gruppieren Sie die Punkte und erhalten Sie die Cluster-ID
Suchen Sie nach Zeilen mit derselben Cluster-ID-Kombination. Das sind ein Cluster
Dies sollte in PostGIS (natürlich :-)) Version 2.3 möglich sein
Ich habe die ST_ClusterDBSCAN-Funktion nicht getestet, sie sollte jedoch funktionieren.
Wenn Sie eine Linientabelle wie diese haben:
Und Sie möchten den Cluster erstellen, bei dem Start- und Endpunkt maximal 10 km voneinander entfernt sind. Und es müssen mindestens 2 Punkte vorhanden sein, um ein Cluster zu sein, dann könnte die Abfrage ungefähr so lauten:
Durch die Verbindung mit erhalten
a.cluster_id<b.cluster_id
Sie eine vergleichbare Cluster-ID unabhängig von der Richtung.quelle
Möchten Sie wirklich nur nach Richtung gruppieren, ohne Rücksicht auf Herkunft oder Ziel? Wenn ja, gibt es einige sehr einfache Möglichkeiten. Am einfachsten ist es vielleicht, die Peilung jeder Linie zu berechnen, zu verdoppeln und als Punkt auf einem Kreis zu zeichnen. Da sich die Vorwärts- und Rückwärtslager um 180 Grad unterscheiden, unterscheiden sie sich nach dem Verdoppeln um 360 Grad und zeichnen daher genau an der gleichen Stelle. Nun gruppieren Sie die Punkte in der Ebene mit einer beliebigen Methode.
Hier ist ein Arbeitsbeispiel
R
, dessen Ausgabe die Linien zeigt, die gemäß jedem der vier Cluster gefärbt sind. Natürlich würden Sie wahrscheinlich ein GIS verwenden, um die Lager zu berechnen - ich habe der Einfachheit halber euklidische Lager verwendet.quelle
Ihre Klärung der Frage zeigt an, dass Sie möchten, dass die Gruppierung auf den tatsächlichen Liniensegmenten basiert , in dem Sinne, dass zwei beliebige Ursprungs-Ziel-Paare (OD-Paare) als "nahe" betrachtet werden sollten, wenn beide Ursprünge nahe und beide Ziele nahe sind , unabhängig davon , welchen Punkt Ursprung oder Ziel betrachtet .
Diese Formulierung deutet darauf hin, dass Sie bereits einen Eindruck von der Entfernung d zwischen zwei Punkten haben: Es kann sich um die Entfernung während des Fluges, die Entfernung auf der Karte, die Hin- und Rückfahrt oder eine andere Metrik handeln, die sich nicht ändert, wenn O und D gleich sind geschaltet. Die einzige Komplikation besteht darin, dass die Segmente keine eindeutigen Darstellungen haben: Sie entsprechen ungeordneten Paaren {O, D}, müssen jedoch als geordnete Paare (O, D) oder (D, O) dargestellt werden. Wir können daher den Abstand zwischen zwei geordneten Paaren (O1, D1) und (O2, D2) als eine symmetrische Kombination der Abstände d (O1, O2) und d (D1, D2) wie ihre Summe oder das Quadrat ansehen Wurzel aus der Summe ihrer Quadrate. Schreiben wir diese Kombination als
Definieren Sie einfach den Abstand zwischen ungeordneten Paaren als den kleineren der beiden möglichen Abstände:
An dieser Stelle können Sie jede Clustering-Technik anwenden, die auf einer Distanzmatrix basiert.
Als Beispiel habe ich alle 190 Punkt-zu-Punkt-Entfernungen auf der Karte für 20 der bevölkerungsreichsten US-Städte berechnet und acht Cluster mithilfe einer hierarchischen Methode angefordert. (Der Einfachheit halber habe ich Euklidische Entfernungsberechnungen verwendet und die Standardmethoden in der von mir verwendeten Software angewendet: In der Praxis werden Sie geeignete Entfernungen und Clustering-Methoden für Ihr Problem auswählen wollen.) Hier ist die Lösung, wobei die Cluster durch die Farbe jedes Liniensegments angezeigt werden. (Die Farben wurden den Clustern zufällig zugewiesen.)
Hier ist der
R
Code, der dieses Beispiel erzeugt hat. Die Eingabe erfolgt in einer Textdatei mit den Feldern "Längengrad" und "Breitengrad" für die Städte. (Um die Städte in der Abbildung zu kennzeichnen, enthält sie auch ein Feld "Schlüssel".)quelle