Saya memiliki satu set skrip postgis yang menghasilkan dua tabel - satu dari set poin dan yang kedua set jalan yang mengelilinginya. Semua data dalam proyeksi yang sama dan kedua output disimpan dalam tabel postgres 9.2 dengan postgis 2.1
Topologi pgrouting dari jaringan jalan telah dibuat dan tabel poin memiliki kolom yang berisi segmen jalan terdekat.
Saya ingin menghasilkan subset dari jaringan jalan yang mewakili jaringan terkecil yang menghubungkan semua titik menggunakan sesuatu seperti pohon spanning minimum. Jaringan jalan tidak diarahkan, dan biaya hanyalah panjang rute.
Saya bisa melakukan ini di QGIS / Grass menggunakan keluarga modul v.net tetapi idealnya saya ingin menjaga langkah terakhir ini dalam SQL juga.
Saya telah melihat fungsi postgis apspWarshall baru tapi saya bingung bagaimana hal itu dapat didorong untuk memfokuskan energinya pada menghubungkan titik-titik dan bukan seluruh jaringan.
Ini adalah skrip pendek yang saya kumpulkan dalam upaya untuk membuat kerangka kerja untuk menyelesaikan ini, tetapi saya tidak bisa melihat di mana dimungkinkan untuk memfokuskan fungsi untuk memulai dengan subset dari tepi.
SELECT seq, id1 AS node, id2 AS edge, cost, the_geom
FROM pgr_apspWarshall('SELECT gid AS id,
source,
target,
st_length(the_geom) AS cost
FROM road_network
',
false, false
) AS tree
JOIN road_network As roads
ON tree.id2 = roads.gid
Dalam jalur tunggal masalah jalur terpendek fungsi meminta awal dan akhir tetapi tampaknya tidak di semua titik masalah. Sama di Grass, v.net.spanningtree dan v.net.steiner mengharapkan satu set poin dan garis sebagai jaringan gabungan untuk bekerja dengannya.
Adakah yang punya saran untuk melakukan ini di PostGIS?
Jawaban:
Jawaban ini tidak lengkap atau diuji, tetapi coba sesuatu seperti ini:
menurut pertanyaan / 39210 :
Saya pikir ini sangat tidak efisien.
sumber
@Adrian, saya benar-benar tidak terbiasa dengan hasil pgrouting, namun dokumentasinya sangat rinci. Jawaban saya didasarkan pada fungsi dua langkah, yang akan sangat tidak efisien dalam SQL tetapi [kemungkinan] menghasilkan hasilnya. Solusi [yang belum diuji] ini TIDAK akan mengoptimalkan yang merupakan titik awal terbaik, tetapi akan mengurangi seluruh jaringan rute menjadi hanya tepi yang menghubungkan semua halte, kemudian rute secara efisien ke semua halte.
Langkah 1 (sub-pemilihan subset jaringan jalan yang menghubungkan semua halte) Ini menggunakan fungsi rute multi-tujuan (jalur K Dijkstr) untuk mengembalikan kumpulan jalur yang (saat biaya <> -1) benar-benar menghubungkan semua berhenti.
Langkah 2 (pemilihan akhir dari lintasan minimum berdasarkan lintasan jaringan jalan subset di atas yang menghubungkan semua pemberhentian) Ini pada dasarnya adalah apa yang Anda mulai, tetapi saya mengusulkan agar Anda bergabung dengan jaringan jalan Anda ke hasil awal pada id1 (jalur) sehingga hanya subset jalan yang digunakan dalam routing Field-Warshal terakhir :
Jadi, dalam ringkasan ... kueri perutean k_dijkstra_path internal mengurangi jaringan jalan total menjadi hanya jalur yang menghubungkan semua perhentian Anda, maka perutean fField_Warshal luar hanya menggunakan id tepi itu untuk menyelesaikan permintaan optimasi jalur .... mungkin.
sumber