Home > Geo > pgDIJKSTRA 2-way

pgDIJKSTRA 2-way

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;
Bookmark and Share
banner1
  1. satrialogic
    May 7th, 2007 at 11:58 | #1

    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. May 9th, 2007 at 22:43 | #2

    [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. angsagd
    July 19th, 2008 at 12:32 | #3

    wow..nice tutorial…
    numpang bookmark bro
    hehehe…
    :)

  4. andre
    July 28th, 2009 at 10:10 | #4

    bos pny peta jakarta pusat.shp

  5. September 6th, 2009 at 14:21 | #5

    @andre ada, buat apa dulu?? kontak lewat email aja ya

  6. demos
    March 22nd, 2010 at 02:52 | #6

    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. March 26th, 2010 at 02:24 | #7

    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. June 27th, 2010 at 05:20 | #8

    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. June 27th, 2010 at 18:46 | #9

    halo juga rian, salam kenal.
    tapi mintanya jangan banyak2 langsung. ato mau aku yg kerjain skripsi loe sekalian? :-P
    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. June 27th, 2010 at 19:00 | #10

    hehe.. maaf mas klo kebanyakan minta.. !! :D
    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.. :)

Comment pages
1 2 31
  1. No trackbacks yet.

Switch to our mobile site