Ich habe Daten von Punkten entlang der Straßen, ich möchte diese Punkte in einfache farbige Linien verwandeln. Gibt es Hinweise, wie dieses Problem genannt werden kann, oder Algorithmen, die mir bei der Lösung dieses Problems helfen können?
Ich hatte gehofft, PostGIS
Funktionen zu verwenden, aber ich bin offen für Vorschläge, dies sind Daten aus einer .shp
Datei.
Bearbeiten1: Das Bild wurde aktualisiert, um die ideale Lösung dieses Problems zu demonstrieren.
Das Zeichnen der Linie basiert ausschließlich auf dem Abstand zwischen diesen Punkten. Es gibt nichts anderes, nach dem ich sie gruppieren kann. Idealerweise sind dies Punkte mit maximaler spezifizierter Entfernung entlang der projizierten Linie? Und mit projizierter Linie meine ich, finde den ersten Punkt und dann den nächstgelegenen, projiziere dann eine Linie und überprüfe, ob es auf dieser Linie Punkte in maximaler Entfernung zu denen gibt, die bereits auf der Linie sind.
Antworten:
.
Sie können eine rekursive Abfrage verwenden , um den nächsten Nachbarn jedes Punkts beginnend mit jedem erkannten Ende der Linien zu untersuchen, die Sie erstellen möchten.
Voraussetzungen : Bereiten Sie eine Postgis-Ebene mit Ihren Punkten und eine weitere mit einem einzelnen mehrzeiligen Objekt vor, das Ihre Straßen enthält. Die beiden Schichten müssen sich auf demselben CRS befinden. Hier ist der Code für den von mir erstellten Testdatensatz. Bitte ändern Sie ihn nach Bedarf. (Getestet auf Postgres 9.2 und Postgis 2.1)
Hier sind die Schritte :
Generieren Sie für jeden Punkt die Liste aller Nachbarn und ihrer Entfernung, die diese drei Kriterien erfüllen.
Die Entfernung darf ein benutzerdefiniertes Verhältnis der Entfernung zum nächsten Nachbarn nicht überschreiten (dies sollte einer unregelmäßigen Digitalisierung besser Rechnung tragen als eine feste Entfernung).Dieser Teil war tatsächlich zu schwer zu implementieren und hielt sich an einen festen SuchradiusNennen wir diese Tabelle "das Diagramm".
Wählen Sie das Ende des Linienpunkts aus, indem Sie es mit dem Diagramm verbinden und nur Punkte beibehalten, die genau einen Eintrag im Diagramm haben.
Nennen wir diese Tabelle "eol" (Zeilenende)
einfach? dass die Belohnung für das Erstellen eines großartigen Diagramms, aber des Festhaltens, im nächsten Schritt verrückt wird
Richten Sie eine rekursive Abfrage ein, die ab jedem Eol von Nachbarn zu Nachbarn wechselt
Nennen wir diese Tabelle "recurse_eol".
Behalten Sie für jeden Startpunkt nur die längste Linie bei und entfernen Sie jeden exakten doppelten Pfad. Beispiel: Die Pfade 1, 2, 3, 5 und 5, 3, 2, 1 sind dieselbe Linie, die durch ihre zwei unterschiedlichen "Zeilenende" entdeckt wird.
Überprüft manuell verbleibende Fehler (isolierte Punkte, überlappende Linien, seltsam geformte Straße)
Wie versprochen aktualisiert, kann ich immer noch nicht herausfinden, warum rekursive Abfragen manchmal nicht genau dasselbe Ergebnis liefern, wenn sie von der gegenüberliegenden EOL derselben Zeile ausgehen, sodass möglicherweise ab sofort ein Duplikat in der Ergebnisebene verbleibt.
Fühlen Sie sich frei zu fragen, ich verstehe total, dass dieser Code mehr Kommentare benötigt. Hier ist die vollständige Abfrage:
quelle
Wie @FelixIP hervorhebt, besteht der erste Schritt darin, die Punkte zu finden, aus denen jede Linie besteht. Sie können dies tun, indem Sie ST_ClusterWithin mit Ihrem maximalen Abstand aufrufen :
Anschließend müssen Sie eine Heuristik verwenden, um eine Linie durch alle Punkte in jedem Cluster zu erstellen. Wenn Sie beispielsweise annehmen können, dass die gewünschten Linien Y-monoton sind, können Sie die Punkte in jedem Cluster sortieren und in ST_MakeLine einspeisen . Das alles zusammen zu kombinieren würde so aussehen:
quelle