#1 Fri 12 February 2010 11:49
- yteb
- Participant occasionnel
- Date d'inscription: 25 Jun 2007
- Messages: 22
pgrouting dijkstra avec boucle sur table
Bonjour à tous,
je travaille actuellement sur la creation d'un reseau cyclable sur un territoire. J'ai des sections de rue avec des points précédemment calculés. Et je souhaiterais relier mes polylignes entre elles en fonction de leur poids et de plusieurs origine-destination. J'ai donc essayé de creuser un peu et j'essaye d'utiliser pgrouting pour relier mes sections non pas en fonction de leur longueur mais en remplacant cette valeur par mes poids. Voila pour le contexte, maintenant mon pb :-(...
En utilisant cet outil sur la donnee test, pas de probleme. J'obtiens bien mon trace de chemin le plus court. Par contre j'essaye d'utiliser la fonction pgrouting de dijkstra en donnant non plus deux valeurs origine / destination, mais en lui demandant de realiser la procedure sur une table contenant plusieurs origine destination...Et la je bloque completement...
En fait au debut je pensais faire un simple :
Code:
CREATE TABLE dijsktra_result(gid int4) with oids; SELECT AddGeometryColumn('dijsktra_result', 'the_geom', '2276', 'MULTILINESTRING', 2); INSERT INTO dijsktra_result(the_geom) SELECT the_geom FROM dijkstra_sp('edges', ID_origine, ID_destination);
Avec une requete qui bouclait sur la table qui contenait mes identifiants ID_origine et ID_destination mais je ne sais pas du tout par ou commencer et ou je peux intervenir (avec access par exemple j'aurais juste boucler en vba...)
Merci d'avance pour le coup de main
Hors ligne
#2 Wed 17 February 2010 11:17
- yteb
- Participant occasionnel
- Date d'inscription: 25 Jun 2007
- Messages: 22
Re: pgrouting dijkstra avec boucle sur table
OK j'ai trouvé. La solution est en fait assez simple. Il suffit de modifier legerement la fonction dijkstra_sp en remplaçant les variables quote_literal par les valeurs de la table dans une boucle for. Je vous poste le code pour ceux que ca interesserait :
Code:
DECLARE r record; path_result record; v_id integer; e_id integer; geom geoms; id integer; t record; BEGIN id :=0; FOR t IN SELECT * FROM ttt LOOP FOR path_result IN EXECUTE 'SELECT gid,the_geom FROM ' || 'shortest_path(''SELECT gid as id, source::integer, target::integer, ' || 'length::double precision as cost FROM ' || quote_ident(geom_table) || ''', ' || t.id_o || ' , ' || t.id_d || ' , false, false), ' || quote_ident(geom_table) || ' where edge_id = gid ' LOOP geom.gid := path_result.gid; geom.the_geom := path_result.the_geom; id := id+1; geom.id := id; RETURN NEXT geom; END LOOP; END LOOP; RETURN; END;
J'ai juste ajoute "FOR t IN SELECT * FROM ttt LOOP" en debut de code et remplacé les valeurs "sources" et "target" par le resultat de ma requete.
Peut etre que ca pourra interesser quelqu'un un jour!
A bientot
Dernière modification par yteb (Thu 18 February 2010 18:03)
Hors ligne