Ich habe eine Reihe von GPS-Punkten, die ich an das OSM-Netzwerk angeschlossen habe. Im folgenden Screenshot sind GPS-Punkte rot, Fangpunkte grün.
Ich möchte den kürzesten Weg berechnen, der alle diese grünen Wegpunkte enthält. Meine Lösung besteht darin, den kürzesten Weg zwischen jedem Punktepaar zu berechnen und schließlich die Ergebnisse zu verketten.
Mein Problem ist, dass dijkstra_sp keine beliebigen Punkte im OSM-Netzwerk akzeptiert. Meine Fangpunkte befinden sich nicht unbedingt in der Wegetabelle, da sie mit der folgenden Logik berechnet wurden.
- Finden Sie den nächstgelegenen Weg zu einem bestimmten GPS-Punkt.
- Suchen Sie mithilfe der Interpolation den nächstgelegenen Punkt auf diesem Weg zum GPS-Punkt.
Die Fangpunkte befinden sich nicht in der Way-Tabelle, da sie durch Interpolation abgeleitet wurden.
Meine Frage lautet also: Wie berechne ich den kürzesten Weg zwischen zwei Punkten im OSM-Netzwerk, die nicht unbedingt in der Wegetabelle enthalten sind?
quelle
Antworten:
Wir haben das gleiche Problem mit temporären Kanten und Eckpunkten gelöst. Wir haben unsere GPS-Koordinaten an einer Kante e von v1 bis v2 befestigt und einen Versatz zwischen 0 und 1 erhalten:
Damit haben wir einen neuen Point () und daraus einen neuen Vertex v_tmp erstellt:
Wir teilen dann unsere Kante e1 in zwei neue Kanten e_tmp1 von v1 nach v_tmp und e_tmp2 von v_tmp nach v2. (Möglicherweise müssen Sie es in 4 temporäre Enden aufteilen ...)
Mit unserem Ziel haben wir dasselbe gemacht. Dann haben wir angefangen, mit unseren neuen Eckpunkten v_tmp_source, v_tmp_dest zu pgroutieren und das wars.
quelle
Ich stimmte mit den nächstgelegenen Knoten überein und verwendete pgrouting, um die Route zwischen diesen Knoten zu finden. Ich war nach der Gesamtentfernung, also habe ich dann die beiden Punkt-Knoten-Entfernungen hinzugefügt.
Ich hatte eine Obergrenze dafür, wie nahe ein Knoten sein musste, um akzeptabel zu sein.
Die Mathematik wäre komplizierter / langsamer, aber Sie könnten dasselbe für Kanten tun, wenn Sie einen pgrouting-Algorithmus verwenden, der eher in Bezug auf Kanten als in Bezug auf Knoten funktioniert.
quelle
Ihr Problem erinnert mich an einen ähnlichen Fall, den wir vor einigen Jahren lösen mussten: Jemand zeichnet einen Pfad (Linestring) auf eine Rasterkarte und wir mussten diesen Pfad mit dem darunter liegenden Straßennetz abgleichen.
Dies scheint Ihren roten GPS-Punkten ähnlich zu sein. Und genau wie Sie haben wir angenommen, dass wir den kürzesten Weg zwischen diesen Punkten suchen können.
Weil das so lange her ist, erinnere ich mich nicht mehr an Details. Wir haben die Funktion (en) jedoch in "match.sql" veröffentlicht, was bereits Teil von pgRouting ist. Es gibt jedoch keine Dokumentation. Das tut mir leid. Aber vielleicht gibt Ihnen das Lesen der SQL-Quelle eine Vorstellung davon, wie es funktioniert: https://github.com/pgRouting/pgrouting/blob/master/core/sql/matching.sql
quelle