Dari milis mapserver-id seputar fungsi pgDijkstra untuk routing 2-arah. Udah agak lama juga sih tapi sebenarnya pengen dicoba dulu sebelum diposting di sini. Cuma karena kesibukan yang sangat saat ini, ditumpahkan apa adanya dulu deh ![]()
Sekedar mau menambahkan. pgdijkstra sebenarnya bisa dipakai untuk perhitungan jalan searah.
Caranya field cost dan reverse_cost keduanya diisi.
Untuk arah yang tidak bisa dilalui diberi nilai yang besar, mis. ditambahkan 1000000.
Untuk jelasnya bisa baca di sini
Tutorial dalam link di atas menggunakan pgRouting, tapi cara yang sama bisa diterapkan pada pgdijkstra. Saya sendiri sudah mencoba cara ini pada pgdijkstra. Cuma untuk display pathnya, fungsi shortest_path_as_geometry yang ada pada pgdijkstra perlu sedikit dimodifikasi karena fungsi yang diberikan tidak memperhitungkan reverse_cost untuk menghasilkan pathnya.
Satu hal yg perlu diperhatikan arah arc mengikuti arah digitize. Ini yang agak repot krn adakalanya data jalan tidak di-digitize mengikuti arah jalan sebenarnya. Saya sendiri waktu mau menerapkan jalan 1-arah dg cara di atas, terpaksa mencek arah digitize dari shapefile yang ada. Cukup repot, lebih mudah kalo digitize sendiri datanya mengikuti arah jalan yg benar.
Menyambung posting saya sebelumnya, berikut saya kirimkan fungsi PL/pgSQL untuk menampilkan shortest path dg memperhitungkan reverse_cost. Fungsi-fungsi ini dimodifikasi dari modul pgDijkstra dari Sylvain Pasche. Untuk menampilkan shortest path dg memperhitungkan reverse_cost digunakan fungsi shortest_path_as_geometry_dir(). Penggunaannya sama persis dengan fungsi shortest_path_as_geometry() yang asli (lihat README_dijkstra_pgsq.txt dari paket modul pgDijkstra). Fungsi shortest_path_as_geometry_dir() memanggil fungsi shortest_path_as_geometry_internal_id_dir(), yg merupakan modifikasi dari shortest_path_as_geometry_internal_id(). Di fungsi inilah letak perbedaannya. Dalam fungsi shortest_path_as_geometry_internal_id_dir() fungsi shortest_path(sql text, source_id integer, target_id integer, directed boolean, has_reverse_cost boolean) dipanggil dg argumen directed = true dan has_reverse_cost = true.
Saya rasa cukup penjelasannya. Selanjutnya bisa lihat langsung kedua fungsi di bawah.
Selamat mencoba.
Thanks,
Ardi
-- Function: shortest_path_as_geometry_dir(geom_table “varchar”, geom_source anyelement, geom_target anyelement)
CREATE OR REPLACE FUNCTION shortest_path_as_geometry_dir(geom_table “varchar”, geom_source anyelement, geom_target anyelement)
RETURNS SETOF geoms AS
$BODY$
DECLARE
r record;
source int4;
target int4;
path_result record;
v_id integer;
e_id integer;
geom geoms;
BEGIN
FOR r IN EXECUTE ‘SELECT id FROM ‘ || quote_ident(geom_table) || ‘_vertices WHERE geom_id = ‘ || quote_literal(geom_source) LOOP
source = r.id;
END LOOP;
IF source IS NULL THEN
RAISE EXCEPTION ‘Can”t find source edge’;
END IF;
FOR r IN EXECUTE ‘SELECT id FROM ‘ || quote_ident(geom_table) || ‘_vertices WHERE geom_id = ‘ || quote_literal(geom_target) LOOP
target = r.id;
END LOOP;
IF target IS NULL THEN
RAISE EXCEPTION ‘Can”t find target edge’;
END IF;
FOR geom IN SELECT * FROM shortest_path_as_geometry_internal_id_dir(geom_table, source, target) LOOP
RETURN NEXT geom;
END LOOP;
RETURN;
END;
$BODY$
LANGUAGE ‘plpgsql’ VOLATILE STRICT;
ALTER FUNCTION shortest_path_as_geometry_dir(geom_table “varchar”, geom_source anyelement, geom_target anyelement) OWNER TO postgres;
-- Function: shortest_path_as_geometry_internal_id_dir(geom_table “varchar”, source int4, target int4)
CREATE OR REPLACE FUNCTION shortest_path_as_geometry_internal_id_dir(geom_table “varchar”, source int4, target int4)
RETURNS SETOF geoms AS
$BODY$
DECLARE
r record;
path_result record;
v_id integer;
e_id integer;
geom geoms;
BEGIN
FOR path_result IN EXECUTE ‘SELECT vertex_id, edge_id FROM shortest_path(”SELECT id, source, target, cost, reverse_cost FROM ‘ ||
quote_ident(geom_table) || ‘_edges ”, ‘ || quote_literal(source) || ‘ , ‘ || quote_literal(target) || ‘ , true, true) ‘ LOOP
v_id = path_result.vertex_id;
e_id = path_result.edge_id;
FOR r IN EXECUTE ‘SELECT gid, the_geom FROM ‘ || quote_ident(geom_table) || ‘ WHERE edge_id = ‘ || quote_literal(e_id) LOOP
geom.gid := r.gid;
geom.the_geom := r.the_geom;
RETURN NEXT geom;
END LOOP;
END LOOP;
RETURN;
END;
$BODY$
LANGUAGE ‘plpgsql’ VOLATILE STRICT;
ALTER FUNCTION shortest_path_as_geometry_internal_id_dir(geom_table “varchar”, source int4, target int4) OWNER TO postgres;
Related posts:
1. Comment by satrialogic
7/May/2007 at 18:58
Salam Kenal,
wah mas bole juga ne dicoba codingnya,
btw, kalo coding untuk intersections 2 peta (*.shp) di postgis gimana yaa?? plus coding buffernya, jika datanya polygon, saya kesulitan mencari referensi contoh codingnya,
makasih banyak yaa mass,
saya lagi pusink buat tugas akhirrr,
salam hangat dari jogja
2. Comment by Eric Lontong
10/May/2007 at 05:43
[quote comment="28"]Salam Kenal,
wah mas bole juga ne dicoba codingnya,
btw, kalo coding untuk intersections 2 peta (*.shp) di postgis gimana yaa?? plus coding buffernya, jika datanya polygon, saya kesulitan mencari referensi contoh codingnya,
makasih banyak yaa mass,
saya lagi pusink buat tugas akhirrr,
salam hangat dari jogja[/quote]
mxd intersection dan buffering itu yang gimana ya? sama gak klo diistilahkan dengan JOIN DATABASE/TABLE? klo emang sama, berarti ya sama aja dong dengan sintaks sql biasa. dan jangan lupa database/table pake gid (dan oid) untuk indexing-nya biar agak cepat
3. Comment by angsagd
19/Jul/2008 at 19:32
wow..nice tutorial…
numpang bookmark bro
hehehe…
4. Comment by andre
28/Jul/2009 at 17:10
bos pny peta jakarta pusat.shp
5. Comment by Eric Lontong
6/Sep/2009 at 21:21
@andre ada, buat apa dulu?? kontak lewat email aja ya
6. Comment by demos
22/Mar/2010 at 09:52
ini dia yang saya cari-cari selama 7 bulan…
beuhhh…
mantap…
saya lg mau buat webgis menggunakan analisis djikstra…
bisa minta tutorialnya g mas…
maksudnya step by step pengerjaan dan rumusnya…
pusing saya, ngikutin tutorial ini itu blm jadi2 jg…
mungkin aja, dr mas eric bs berhasil…
nice!
7. Comment by Eric Lontong
26/Mar/2010 at 09:24
demos,
kalau praktisnya kan udah dibikin di sini juga. tapi klo rumus mungkin bisa ditanya di om google ato tante wikipedia.
hanya saja, pgDijkstra saat ini sudah seperti "ditinggalkan" dan dipakai yang lebih mantap lagi (pengembangan metoda dijkstra) dengan A-Star Path. coba maen2 ke postlbs sebagai pengembangnya. ato mau diskusi nih..? Hayo
8. Comment by rian
27/Jun/2010 at 12:20
halo mas eric.. salam kenal..
saya seorang mahasiswa lg nyusun skripsi mas
dan kebetulan topiknya hampir sama yg ad di blog mas..
pencarian rute wisata kota bandung.. cuma klo saya pake algoritma A* untuk pencariannya..
mungkin mas punya contoh kasus yg untuk algoritma A* ?
oh iya.. mas punya peta kota bandung.shp ?
terima kasih mas sebelumnya..
9. Comment by Eric Lontong
28/Jun/2010 at 01:46
halo juga rian, salam kenal.

tapi mintanya jangan banyak2 langsung. ato mau aku yg kerjain skripsi loe sekalian?
hehe… canda…
mending coba jalan2 dulu ke postlbs, google, dan cari contoh2 nya dari mereka.
udah lengkap kok. ntar klo ada masalah, bisa diskusi lagi
utk data sih ada.
terima kasih juga sesudahnya…
10. Comment by rian
28/Jun/2010 at 02:00
hehe.. maaf mas klo kebanyakan minta.. !!
ok.. ok.. saya coba cari contoh"nya dlu.. dari mbah google..
nanti klo ada kesulitan dan kendala saya minta pencerahan ke mas ok..
saya hrap mas ga keberatan.. hehe..
11. Comment by Eric Lontong
28/Jun/2010 at 02:26
siap!!
kontak2 aja ato langsung ketemu jg oke.
selalu siap klo diskusi soal2 gini. nambah ilmu…
12. Comment by rian
23/Oct/2010 at 09:10
mas akhirnya berhasil jg saya nerapin yang buat jalan searah ini.. di algoritma A*..
skripsi beres.. tinggal nunggu sidang aja.. hhe..
berkat postingan mas eric nih.. thanks ya mas.. !!
cm saya mau nanya nih mas.. buat yg reverse_cost kan itu saya isi nilainya 1000000 buat jln yg 1 arah, nah saya msh bingung buat penjelasannya.. knp klo kita isi nilainya dgn 1000000 si jalan jd ga bisa dilewatin.. ?
soalnya link penjelasan yg diatas http://pgrouting.postlbs.org/postlbs-cms/en/node/…
udh error mas..
13. Comment by Eric Lontong
23/Oct/2010 at 15:27
Jalur terpendek (tercepat) dihitung berdasarkan nilai terkecil antar verteks garis. Kalau dibuat sangat besar, brarti nilainya tidak akan termasuk dari terkecil lagi bukan?
Wow, selamat! selamat!
Ditunggu update-an post blognya ya. Langsung spesifik detail teknisnya aja. penjelasan lainnya link ke post ini aja kalau mau.
Ditunggu ya