Wie füge ich der Route Offsets hinzu?

13

Bearbeitet:

Stichprobe

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!

Iñigo
quelle
1
Willkommen bei gis.stackexchange. Dies ist eine Q & A-Site, auf der jeder Thread genau eine Frage und ihre Antworten enthalten sollte. Bitte öffnen Sie einen separaten Thread für Frage 3. # 2 wird in gis.stackexchange.com/questions/33471/…
underdark
1
Ich habe das gleiche Problem. hast du eine lösung gefunden Vielen Dank
Robert
1
Bitte posten Sie Ihre Lösung im Antwortbereich. Dann kann es upvoted werden.
Underdunkel

Antworten:

2

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:

  1. Ein Scheitelpunkt ist der nächste Punkt.
  2. Ein Formknoten der Kante ist der richtige
  3. Die Kantenlinie selbst ist näher. (senkrecht)
Carsten
quelle
Sorry, aber das ist nicht die richtige Antwort. pgr_trsp - Die TRSP-Werte (Turn Restriction Shortest Path) werden für die @ amball-Antwort als Versatz angezeigt.
Juan Carlos Oropeza
7

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.

dkastl
quelle
1

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 ):

SELECT gid, cost, st_astext(the_geom) as the_geom FROM dijkstra_sp_delta('xx_2po_4pgr', source_vertex, target_vertex, 0.1);

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:

mögliche Ausgabe

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:

SELECT * FROM find_node_by_nearest_link_within_distance(point, 0.1, 'xx_2po_4pgr') as id;

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 ):

CREATE TYPE link_point AS
   (id integer,
    name character varying,
    nearest_link integer);
ALTER TYPE link_point
  OWNER TO postgres;

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):

-- Searching for a nearest link

    FOR row in EXECUTE 'select id from find_nearest_link_within_distance('''||point||''', '||distance||', '''||tbl||''') as id'
    LOOP
    END LOOP;
    IF row.id is null THEN
        res.id = -1;
        RETURN res;
    END IF;
    link:=row.id;
    res.nearest_link:=link;

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:

SELECT ST_Line_Locate_Point(geom , point)as offset; 

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):

select st_length(the_geom) from (select ST_ASTEXT(the_geom) as the_geom FROM dr_2po_4pgr WHERE id= edge_identifier)t";

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.

Iñigo
quelle
1

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

Amball
quelle