Jak dodać odsunięcia do trasy?


13

Edytowane:

próba

Chcę zilustrować moje pytanie. Załóżmy, że jesteś w „Punkcie A” i chcesz przejść do „Punktu B”. Te punkty nie byłyby w tabeli „at_2po_4pgr”, ponieważ nie są węzłami źródłowymi / docelowymi. Następnie szukałem najbliższego węzła dla punktów A i B (zielone punkty). Następnie mogę wykonać wywołanie shortest_path przy użyciu identyfikatorów zielonych punktów i uzyskać ścieżkę „pomarańczową”. Ale aby uzyskać rzeczywisty koszt ścieżki (odległość) w pierwszym przypadku musiałbym odjąć „offsetA”, a w drugim przypadku dodać de „offset B”. Aby obliczyć odległość między czerwonymi i zielonymi punktami, uruchamiam następujące zapytanie:

SELECT * FROM st_distance( ST_GeomFromText('POINT(-3.6963314 42.3498066)',4326), ST_GeomFromText('POINT(-3.6954276 42.3479634)',4326)).

Skąd mam wiedzieć, czy dodać lub odjąć przesunięcie?

Przepraszam za mój angielski!


1
Witamy w gis.stackexchange. To jest strona pytań i odpowiedzi, w której każdy wątek powinien zawierać dokładnie jedno pytanie i odpowiedzi. Otwórz osobny wątek na pytanie nr 3. Odpowiedź na nr 2 znajduje się w gis.stackexchange.com/questions/33471/...
podmroku

1
Mam ten sam problem. znalazłeś jakieś rozwiązanie? Wielkie dzięki
Robert

1
Proszę zamieścić swoje rozwiązanie w sekcji odpowiedzi. Następnie można go poddać ocenie.
podmrok

Odpowiedzi:


2

Nie sądzę, że można polegać na najbliższym wierzchołku. Wyobraź sobie, że źródło i cel znajdują się na tej samej krawędzi blisko tego samego wierzchołka.

Wolisz rozważyć trzy! różne przypadki:

  1. wierzchołek jest najbliższym punktem.
  2. węzeł formy krawędzi jest właściwy
  3. sama linia krawędzi jest bliżej. (prostokątny)

Przepraszam, ale to nie jest poprawna odpowiedź. pgr_trsp - Ograniczenie najkrótszej ścieżki skrętu (TRSP) ma przesunięcie jak pokazano dla odpowiedzi @amball.
Juan Carlos Oropeza,


1

Wyjaśnię rozwiązanie, które znalazłem (być może nie będzie najlepsze).

Zgodnie z tym stanowiskiem obrazu, załóżmy, że jesteśmy w punkcie A i zamierzam iść do punktu B . Jak wyjaśniłem powyżej, punkty te nie są wierzchołkami (źródło / cele w tabeli generowane za pomocą narzędzia osm2po).

Z tego powodu musimy znać kierunek marszu / jazdy. Jeśli przejdziemy od najbliższego wierzchołka do punktu A (punkt zielony) przez pomarańczową ścieżkę, musielibyśmy odjąć przesunięcie między punktem A i punktem zielonym (najbliższy wierzchołek). Ale gdybyśmy musieli przejść ulicą Calle Almirante Bonifaz , powinniśmy dodać przesunięcie do długości tej krawędzi (od punktu zielonego do przecięcia między Calle Almirante Bonifaz i Calle San Juan ).

Uruchomiam następujące zapytanie, aby uzyskać najkrótszą ścieżkę (potrzebujesz wyjaśnienia rozszerzenia pgRouting tutaj pgRouting - instalacja i wymagania tutaj instalacja i wymagania ):

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

W rezultacie powstaje zestaw krawędzi reprezentujących pełną trasę. Na przykład jednym z możliwych wyników tego zapytania może być:

możliwa wydajność

Gdzie pole gid ( id w tabeli generowanej przez osm2po) reprezentuje identyfikator krawędzi. Cóż, musimy sprawdzić przesunięcia na początku i na końcu (punkty A / B).

Jeśli sprawdzimy początek offset, musimy sprawdzić, czy pierwsza krawędź zestawu krawędzi uzyskanych w powyższym zapytaniu jest taka sama do najbliższej drogi do punktu A . Jeśli się zgadzają, odejmiemy przesunięcie. Jeśli się nie zgadzają, dodamy przesunięcie. Aby uzyskać najbliższe łącze do punktu, uruchamiam następujące zapytanie:

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

Musisz dostosować tę funkcję, aby zwracała najbliższą krawędź. Najpierw musisz zmodyfikować typ linku (dodaj pole najbliższego linku ):

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

Musisz także zmodyfikować find_node_by_nearest_link_with_distance . Wystarczy dodać ostatni wiersz (pokazuję tylko wyciąg z funkcji):

-- 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;

Następnie musisz wiedzieć, jaka jest odległość między punktem ( Punkt A / Punkt B ) a najbliższą krawędzią (odsunięcie). W tym celu uruchamiam to zapytanie:

SELECT ST_Line_Locate_Point(geom , point)as offset; 

Gdzie geom jest the_geom pola w osm2po generowanej tabeli.

W tym momencie będziemy mieli przesunięcie do dodania lub odjęcia.

Na koniec musisz znać szerokość krawędzi, aby zastosować wartość uzyskaną w powyższym zapytaniu i dostosować wartość rzeczywistą (jeśli pracujesz z typem geometrii, będziesz musiał znormalizować do liczników uzyskaną wartość. Wystarczy pomnożyć 111000 przez długość uzyskaną w Zapytanie):

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

Gdybyśmy sprawdzili przesunięcie końcowe, musielibyśmy sprawdzić, czy ostatnia ścieżka zestawu ścieżek uzyskana w powyższym zapytaniu jest taka sama jak najbliższa ścieżka do punktu końcowego ( punkt B ) i dodalibyśmy / odejmowali w tak samo jak poprzednio.

Wybacz mój angielski.


1

W pgrouting pgr_trsp - Najkrótsza ścieżka ograniczenia ruchu (TRSP) robi dokładnie to, czego szukasz.

Zamiast określać węzły źródłowy i docelowy, można określić krawędzie źródłowe i docelowe oraz ułamek wzdłuż krawędzi, w której znajduje się miejsce początkowe i docelowe.

(Możesz użyć ST_Line_Locate_Point, aby uzyskać ten ułamek z geometrii punktu, zakładając, że znasz najbliższą krawędź.)

Zobacz http://docs.pgrouting.org/2.0/en/src/trsp/doc/index.html#trsp

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.