Kürzester Pfad mit interpolierten OSM-Punkten

8

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. Geben Sie hier die Bildbeschreibung ein

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.

  1. Finden Sie den nächstgelegenen Weg zu einem bestimmten GPS-Punkt.
  2. 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?

Fezter
quelle
Klingt für mich so, als würden Sie versuchen, das Problem des Handlungsreisenden zu lösen . In diesem Fall wäre der effizienteste Weg die Verwendung eines TSP-Algorithmus ...
ntg

Antworten:

3

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:

segOffset := line_locate_point(geom(e), Point(coords);

Damit haben wir einen neuen Point () und daraus einen neuen Vertex v_tmp erstellt:

line_interpolate_point(geom(e), segOffset);

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.

Axel Zingsem
quelle
2

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.

winwaed
quelle
(Entschuldigung, irgendwie kann ich "winwaed" nicht kommentieren, also muss ich es mit einer anderen Antwort machen.)> Die Mathematik wäre komplizierter / langsamer, aber Sie könnten dasselbe für Kanten tun, wenn Sie einen pgrouting-Algorithmus verwenden würden arbeitete eher in Bezug auf Kanten als in Bezug auf Knoten. Der Shooting Star-Algorithmus verwendet Kanten anstelle von Knoten.
dkastl
Weder knoten- noch kantenbasierte Prozeduren funktionieren, siehe das folgende Beispiel. dl.dropbox.com/u/11502389/Screenshot2.png Die blauen Linien zeigen die einzelnen grünen Punkte an.
1

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

dkastl
quelle
Die Verwendung der nächstgelegenen Knoten funktioniert nicht. Betrachten Sie das folgende Beispiel.
Diese Matching-Funktion, die ich erwähne, führt eine Kombination aus Matching mit Knoten und Straßensegmenten durch. Dies hängt davon ab, wie nahe Ihr GPS-Punkt an einem Knoten liegt. Wenn Sie sich sehr nahe an einer Kreuzung befinden, befindet sich Ihr GPS-Punkt möglicherweise näher an einer Kante, der er eigentlich nicht zugewiesen werden sollte.
dkastl