Lassen Sie den nächsten Teil eines Diagramms:
Wenn ich die Funktion shortest_path zwischen den Punkten A und B verwende, habe ich den blauen Pfad erhalten. Warum passiert das?
postgis
postgresql
pgrouting
José Alejandro
quelle
quelle
Antworten:
So verhält sich shortest_path (Dijkstra-Algorithmus) in pgRouting. Wenn es zwei Kanten mit derselben Quelle und demselben Ziel gibt, wird eine zufällige (um genau zu sein: die erste, die aus der Datenbank stammt) verwendet. Ich kenne keine Lösung dafür, aber es gibt einige Problemumgehungen.
Wenn möglich, sollten Sie eine dieser Kanten in zwei teilen. Ich habe es nicht getestet, aber es sollte dieses Verhalten beheben.
Eine andere Lösung für den Fall, dass Sie Ihren Datensatz nicht ändern können. Fügen Sie Ihrer Tabelle das Feld 'kürzer_alternativ' hinzu. Beispielabfrage, ändern Sie sie an Ihre Bedürfnisse. Ich hoffe es erklärt die Idee:
Jetzt enthält die Kante '0.098' die ID der Kante '0.011'. Alle anderen Kanten haben im Feld kürzer_alternativ null. Nachdem Sie die Abfrage "kürzester Pfad" durchgeführt haben, überprüfen Sie das zurückgegebene Dataset. Wenn für eine Zeile das Feld "kürzer_alternativ" festgelegt ist, ändern Sie es.
quelle
Das Problem wurde bereits in der vorherigen Antwort beschrieben. Es ist ein Problem von "vertexbasierten" Algorithmen für kürzeste Wege, die sich nur um Quelle und Ziel kümmern.
Der Issue-Tracker enthält ein Ticket und eine mögliche Lösung zum Ändern der Algorithmusimplementierung: https://github.com/pgRouting/pgrouting/issues/34 (Wäre schön, wenn jemand dies ausprobieren und eine Pull-Anfrage senden könnte; - )
Eine andere Möglichkeit besteht darin, "parallele Straßenverbindungen" wie zuvor erwähnt aufzuteilen. Oder Sie können den Shooting Star-Algorithmus verwenden, der von Kante zu Kante verläuft, damit er beide Straßenverbindungen "kennt".
Oder Sie können versuchen, das Straßennetz nach Kosten zu ordnen und dann nur unterschiedliche Kombinationen von Quelle und Ziel auswählen:
Dies setzt voraus, dass Sie nach der günstigsten Route suchen. Sonst musst du
ORDER BY ... DESC
.Sie müssen ausprobieren, ob dies die Leistung beeinträchtigt.
quelle
Ich habe tatsächlich einen Patch für pgRouting erstellt, der das Problem behebt: https://github.com/pgRouting/pgrouting/issues/78
quelle