Ich muss Bushaltestellen (Punkte) mit einer Netzwerkschicht (OSM-Daten) verbinden. Diese Bushaltestellen liegen weder direkt auf den Linien (siehe Screenshot) noch sollten ihre Position verschoben werden. Ich verwende PostGIS, pgrouting und QGIS und das Netzwerk ist bereits mit Quell- und Zielspalten usw. routbar.
Hauptsächlich möchte ich danach zwei Dinge tun:
- Ermitteln der Entfernungen zwischen den Bushaltestellen mithilfe der Analyse des kürzesten Pfades.
- Erstellen von Isochronen mit Gehentfernung von der Bushaltestelle über das OSM-Netzwerk.
Um genaue Werte zu erhalten, muss das Routing am nächsten an den Bushaltestellen beginnen und anhalten. In vielen Fällen ist der nächstgelegene vorhandene Knoten zu weit entfernt, um genaue Werte zu erhalten. Es sollte jedoch keine Weiterleitung zum tatsächlichen Punkt der Bushaltestelle geben. In meinem Beispiel auf dem Bild sehen Sie, wie das Routing zwischen Stopps aussehen sollte.
Gibt es eine Möglichkeit, neue Knoten automatisch in das Netzwerk (LINESTRING) einzufügen, die den Bushaltestellen am nächsten liegen, oder ist es möglich, das Routing auf einer Art "Dummy-Punkt" zu starten, der nur für die Abfrage festgelegt wurde (ähnlich wie auf der Straße) Graph Plugin in QGIS macht)?
Dies ist meine vollständige Lösung. Es ist eine Art Hack, um die Aufteilung durchzuführen: Ich erhalte die Punkte auf den Linien (Möglichkeiten, die OSM-Terminologie zu verwenden)
ST_ClosestPoint
und puffere sie dann um einen sehr kleinen Abstand, damit die Aufteilung tatsächlich funktioniert. Andernfalls verhinderten Ungenauigkeiten / Rundungsfehler die Aufteilung.Dies hat das Problem, dass auf jeder Linie pro Punkt zwei Teilungen erzeugt werden (aufgrund der Pufferung). Für meinen Gebrauch war dies in Ordnung, da ich später zwischen den Teilungspunkten geroutet habe, die den ursprünglichen Punkten am nächsten waren, die außerhalb der Linie lagen, und es könnte einer der beiden Teilungspunkte der Linienpufferkreuzung sein.
Ich habe zunächst OSM-Daten heruntergeladen und in Postgres übernommen:
Aufteilen der Wege mithilfe eines Puffers:
Erstellen Sie die für das Routing mit pgrouting erforderliche Topologie:
quelle
Da ich an einer ähnlichen Aufgabe arbeite, wollte ich nur über den Ansatz berichten, den ich derzeit verwende. Dies nutzt GRASS GIS, aber was meine Experimente mit PostGIS angeht, ist es ziemlich kompliziert, vorhandenen LineStrings mehrere neue Punkte hinzuzufügen, indem diese LineStrings an den jeweiligen Standorten aufgeteilt werden - obwohl ich sicher bin, dass es eine bequeme Lösung gibt.
Ich habe jetzt die GRASS GIS-
v.net
Funktion mit der Option verwendetconnect
. Wählen Sie einfachinput vector line layer
undpoints layer
. Es besteht die Möglichkeit, die Punkte entweder am nächsten Punkt auf den Linien zu fangen oder neue Verbindungen zwischen dem nächsten Punkt auf den Linien und dem neuen Punkt herzustellen.Hier ist ein Vorher- und Nachher-Bild. Auf der rechten Seite wurde für jeden Punkt der Punktebene ein Knoten im Straßennetz hinzugefügt:
..._vertices_pgr
Weisen Sie anschließend in PostGIS nach dem Erstellen Ihrer Tabelle aus dem Straßennetz Ihre Punkte dem nächstgelegenen Scheitelpunkt zu, damit Sie sie in Ihren Routing-Anforderungen verwenden können. Für diese Aufgabe können Sie dieST_ClosestPoint
Funktion verwenden, die @Setraworks in seiner Antwort ausgeführt hat.Nachteile dieses Ansatzes sind:
Dieser Ansatz funktioniert einwandfrei, wenn Sie eine definierte Anzahl von Punkten zum Straßennetz hinzufügen müssen (wie im Beispiel der Frage mit Bushaltestellen).
Wenn jemand mit PostGIS ein funktionierendes Beispiel liefern kann, würde ich gerne darüber lesen!
quelle
Es gibt einen Beitrag, in dem ein ähnliches Problem behandelt wird. Sie können diesen Beitrag an folgender Stelle sehen: http://osdir.com/ml/qgis-user-gis/2011-11/msg00220.html
quelle