Bagaimana cara menambahkan offset ke rute?


13

Diedit:

Sampel

Saya ingin menggambarkan pertanyaan saya. Misalkan Anda berada di "Titik A" dan ingin pergi ke "Titik B". Poin ini tidak akan berada di tabel "at_2po_4pgr" karena bukan merupakan sumber / target node. Kemudian, saya akan mencari titik terdekat untuk titik A dan B (titik hijau). Setelah ini, saya mungkin melakukan panggilan shortest_path menggunakan id poin hijau dan saya akan mendapatkan jalur "oranye". Tetapi untuk mendapatkan biaya jalur nyata (jarak) dalam kasus pertama saya harus mengurangi "offsetA" dan dalam kasus kedua tambahkan de "offset B". Untuk menghitung jarak antara titik merah dan titik hijau, saya menjalankan kueri berikut:

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

Bagaimana saya tahu kapan menambah atau mengurangi offset?

Maaf untuk bahasa inggris saya!


1
Selamat datang di gis.stackexchange. Ini adalah situs tanya jawab di mana setiap utas harus berisi tepat satu pertanyaan dan jawabannya. Silakan buka utas terpisah untuk pertanyaan # 3. # 2 dijawab di gis.stackexchange.com/questions/33471/…
underdark

1
Saya memiliki masalah yang sama. apakah Anda menemukan solusi? Terima kasih banyak
Robert

1
Silakan kirim solusi Anda di bagian jawaban. Maka itu bisa diputuskan.
underdark

Jawaban:


2

Saya tidak berpikir bahwa Anda dapat mengandalkan vertex terdekat. Bayangkan sumber dan target terletak di tepi yang sama dekat dengan titik yang sama.

Anda lebih suka dianggap tiga! kasus yang berbeda:

  1. titik adalah titik terdekat.
  2. bentuk simpul tepi adalah yang benar
  3. garis tepi itu sendiri lebih dekat. (ortogonal)

Maaf tapi ini bukan jawaban yang benar. pgr_trsp - Turn Restriction Shortest Path (TRSP) telah diimbangi sebagai show for @amball answer.
Juan Carlos Oropeza


1

Saya akan menjelaskan solusi yang saya temukan (mungkin tidak menjadi yang terbaik).

Menurut gambar postingan, misalkan kita berada di Point A dan kita akan pergi ke Point B . Seperti yang saya jelaskan di atas, ini bukan titik (sumber / target dalam tabel yang dihasilkan dengan alat osm2po).

Karena itu, kita perlu mengetahui arah berjalan / mengemudi. Jika kita pergi dari titik terdekat ke titik A (titik hijau) melalui jalur oranye kita harus mengurangi offset antara titik A dan titik hijau (titik terdekat). Tetapi jika kita harus melalui jalan Calle Almirante Bonifaz , maka kita harus menambahkan offset ke panjang tepi ini (dari titik hijau ke persimpangan antara Calle Almirante Bonifaz dan Calle San Juan ).

Saya menjalankan kueri berikut untuk mendapatkan jalur terpendek (Anda memerlukan ekstensi pgRouting dijelaskan di sini pgRouting - instalasi dan persyaratan di sini instalasi & persyaratan ):

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

Ini menghasilkan seperangkat tepi yang mewakili rute lengkap. Misalnya, satu kemungkinan keluaran untuk kueri ini mungkin:

kemungkinan keluaran

Di mana gid bidang ( id dalam tabel yang dihasilkan osm2po) mewakili pengidentifikasi tepi. Nah, kita harus memeriksa offset di awal dan di akhir (Poin A / B).

Jika kita memeriksa awal offset, kita harus memeriksa apakah tepi pertama set dari tepi diperoleh di query di atas adalah sama untuk jalan terdekat ke Point A . Jika cocok, maka kami akan mengurangi offset. Jika tidak cocok, kami akan menambahkan offset. Untuk mendapatkan tautan terdekat ke suatu titik, saya menjalankan kueri berikut:

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

Anda harus menyesuaikan fungsi ini sehingga mengembalikan tepi terdekat. Pertama, Anda harus mengubah link_point jenis (add nearest_link lapangan):

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

Anda juga harus memodifikasi find_node_by_nearest_link_within_distance . Cukup tambahkan baris terakhir (saya hanya menunjukkan ekstrak dari fungsi):

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

Maka Anda perlu tahu berapa jarak antara titik ( Titik A / Titik B ) dan tepi terdekat (offset). Untuk tujuan ini saya menjalankan kueri ini:

SELECT ST_Line_Locate_Point(geom , point)as offset; 

Dimana GEOM adalah the_geom lapangan di osm2po tabel yang dihasilkan.

Pada titik ini, kita memiliki offset untuk ditambahkan atau dikurangi.

Terakhir, Anda perlu mengetahui leg edge untuk menerapkan nilai yang diperoleh dalam kueri di atas dan menyesuaikan real (jika Anda bekerja dengan tipe geometri, Anda harus menormalkan ke meter nilai yang diperoleh. Cukup kalikan 111000 dengan panjang yang diperoleh dalam kueri):

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

Jika kita akan memeriksa end offset, maka kita harus memeriksa apakah path terakhir dari set path yang diperoleh dalam query di atas sama dengan path terdekat ke titik akhir ( Point B ) dan kita akan menambahkan / mengurangi pada dengan cara yang sama seperti sebelumnya.

Maafkan bahasa Inggris saya.


1

Dalam pgrouting, pgr_trsp - Turn Restriction Shortest Path (TRSP) melakukan apa yang Anda cari.

Alih-alih menentukan sumber dan target node, Anda dapat menentukan sumber dan target tepi, dan fraksi sepanjang tepi tempat asal dan tujuan Anda berada.

(Anda dapat menggunakan ST_Line_Locate_Point untuk mendapatkan pecahan itu dari geometri titik Anda, dengan asumsi Anda tahu tepi terdekat.)

Lihat http://docs.pgrouting.org/2.0/id/src/trsp/doc/index.html#trsp

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.