Bearbeitet:
Ich möchte meine Frage erläutern. Angenommen, Sie befinden sich in "Punkt A" und möchten zu "Punkt B" wechseln. Diese Punkte wären nicht in der Tabelle "at_2po_4pgr" enthalten, da es sich nicht um Quell- / Zielknoten handelt. Dann würde ich nach dem nächsten Knoten für die Punkte A und B (grüne Punkte) suchen. Danach könnte ich einen Aufruf mit dem kürzesten Pfad unter Verwendung von grünen Punkt-IDs ausführen und einen "orangefarbenen" Pfad erhalten. Aber um die tatsächlichen Pfadkosten (Distanz) im ersten Fall zu erhalten, müsste ich "offsetA" subtrahieren und im zweiten Fall de "offset B" hinzufügen. Um den Abstand zwischen roten und grünen Punkten zu berechnen, führe ich die folgende Abfrage aus:
SELECT * FROM st_distance(
ST_GeomFromText('POINT(-3.6963314 42.3498066)',4326),
ST_GeomFromText('POINT(-3.6954276 42.3479634)',4326))
.
Woher weiß ich, wann der Offset addiert oder subtrahiert wird?
Entschuldigung für mein Englisch!
Antworten:
Ich glaube nicht, dass man sich auf den nächsten Eckpunkt verlassen kann. Stellen Sie sich vor, Quelle und Ziel befinden sich an derselben Kante in der Nähe desselben Scheitelpunkts.
Du hättest lieber drei in Betracht gezogen! verschiedene Fälle:
quelle
Eine solche Funktion finden Sie hier: https://github.com/pgRouting/pgrouting-contrib/blob/master/wrapper/routing_core_smart.sql#L69
Es wird nach der nächsten Verbindung im Netzwerk gesucht, was normalerweise zu einem besseren Ergebnis führt. Wenn Sie Shooting Star verwenden, können Sie mit dem Routing von / zu diesem Link beginnen. Für A * oder Dijkstra wählen Sie entweder den Start- oder Endpunkt des Links aus oder Sie erstellen einen "virtuellen" Knoten, indem Sie den Link in zwei Teile teilen.
quelle
Ich werde die Lösung erklären, die ich gefunden habe (vielleicht nicht die beste).
Nach Angaben der Post Bild, nehmen wir an , dass wir in sind Punkt A und wir jetzt gehen Punkt B . Wie ich oben erklärt habe, sind diese Punkte kein Eckpunkt (Quelle / Ziele in der Tabelle, die mit dem osm2po-Tool generiert wurde).
Aus diesem Grund müssen wir die Lauf- / Fahrtrichtung kennen. Wenn wir vom nächsten Scheitelpunkt zum Punkt A (Punkt Grün) über einen orangefarbenen Pfad gehen, müssen wir den Versatz zwischen Punkt A und Punkt Grün (nächster Scheitelpunkt) abziehen . Wenn wir jedoch die Straße Calle Almirante Bonifaz durchfahren müssen , müssen wir den Versatz zur Länge dieser Kante addieren (vom grünen Punkt bis zur Kreuzung zwischen Calle Almirante Bonifaz und Calle San Juan ).
Ich führe die folgende Abfrage aus, um den kürzesten Pfad zu ermitteln (Sie benötigen die hier erläuterte Erweiterung pgRouting pgRouting - Installation und Anforderungen hier Installation und Anforderungen ):
Dies führt zu einer Reihe von Kanten, die die gesamte Route darstellen. Eine mögliche Ausgabe für diese Abfrage könnte beispielsweise sein:
Wobei die Feld- GID ( ID in der von osm2po generierten Tabelle) die Kanten- ID darstellt. Nun, wir müssen die Offsets am Anfang und am Ende überprüfen (Punkte A / B).
Wenn wir den Startversatz prüfen, müssen wir prüfen, ob die erste Kante der in der obigen Abfrage erhaltenen Menge von Kanten mit dem Pfad übereinstimmt, der dem Punkt A am nächsten liegt . Stimmen sie überein, werden wir den Offset abziehen. Wenn sie nicht übereinstimmen, addieren wir den Offset. Um den nächsten Link zu einem Punkt zu erhalten, führe ich die folgende Abfrage aus:
Sie müssen diese Funktion anpassen, damit sie die nächste Kante zurückgibt. Zuerst müssen Sie den link_point- Typ ändern ( next_link- Feld hinzufügen ):
Sie müssen auch den find_node_by_nearest_link_within_distance ändern . Füge einfach die letzte Zeile hinzu (ich zeige nur einen Auszug aus der Funktion):
Dann müssen Sie wissen, wie groß der Abstand zwischen Punkt ( Punkt A / Punkt B ) und der nächsten Kante (Versatz) ist. Zu diesem Zweck führe ich diese Abfrage aus:
Wo geom ist das the_geom Feld in osm2po erzeugten Tabelle.
Zu diesem Zeitpunkt hätten wir den Offset, um zu addieren oder zu subtrahieren.
Schließlich müssen Sie die Kantenlänge kennen, um den in der obigen Abfrage erhaltenen Wert anzuwenden und den Realwert anzupassen (wenn Sie mit dem Geometrietyp arbeiten, müssen Sie den erhaltenen Wert auf Meter normieren. Multiplizieren Sie einfach 111000 mit der in erhaltenen Länge die Abfrage):
Wenn wir den Endversatz prüfen würden, müssten wir prüfen, ob der letzte Pfad der in der obigen Abfrage erhaltenen Menge von Pfaden mit dem nächsten Pfad zum Endpunkt ( Punkt B ) identisch ist, und wir würden bei addieren / subtrahieren genauso wie zuvor.
Entschuldige mein Englisch.
quelle
In pgrouting macht pgr_trsp - Turn Restriction Shortest Path (TRSP) genau das, wonach Sie suchen.
Anstatt Quell- und Zielknoten anzugeben, können Sie Quell- und Zielkanten sowie den Bruch entlang der Kante angeben, an der sich Ihr Ursprung und Ihr Ziel befinden.
(Sie können ST_Line_Locate_Point verwenden, um diesen Bruch aus Ihrer Punktgeometrie abzurufen, vorausgesetzt, Sie kennen die nächste Kante.)
Siehe http://docs.pgrouting.org/2.0/en/src/trsp/doc/index.html#trsp
quelle