Diedit:
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!
Jawaban:
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:
sumber
Anda dapat menemukan fungsi seperti ini di sini: https://github.com/pgRouting/pgrouting-contrib/blob/master/wrapper/routing_core_smart.sql#L69
Ia mencari tautan terdekat di jaringan, yang biasanya memberikan hasil yang lebih baik. Jika Anda menggunakan Bintang Tembak, Anda dapat mulai merutekan dari / ke tautan ini. Untuk A * atau Dijkstra Anda memilih titik awal atau akhir tautan, atau Anda membuat simpul "virtual" dengan memisahkan tautan menjadi dua.
sumber
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 ):
Ini menghasilkan seperangkat tepi yang mewakili rute lengkap. Misalnya, satu kemungkinan keluaran untuk kueri ini mungkin:
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:
Anda harus menyesuaikan fungsi ini sehingga mengembalikan tepi terdekat. Pertama, Anda harus mengubah link_point jenis (add nearest_link lapangan):
Anda juga harus memodifikasi find_node_by_nearest_link_within_distance . Cukup tambahkan baris terakhir (saya hanya menunjukkan ekstrak dari fungsi):
Maka Anda perlu tahu berapa jarak antara titik ( Titik A / Titik B ) dan tepi terdekat (offset). Untuk tujuan ini saya menjalankan kueri ini:
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):
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.
sumber
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
sumber