Pages: 1
- Sujet précédent - Itinéraire à multiples destinations sans connaitre id_node[pg_routing] - Sujet suivant
#1 Tue 23 January 2018 15:42
- bruhnild
- Participant actif
- Lieu: Lyon
- Date d'inscription: 7 Jun 2014
- Messages: 130
Itinéraire à multiples destinations sans connaitre id_node[pg_routing]
Bonjour à toutes et à tous,
Je cherche à réaliser des itinéraires de courtes distances à destination multiples avec la fonction pg routing pgr_kdijkstraPath.
Pour un point de départ connu (BPE) et les points d’arrivée connus également (SITE RACCORDABLE), j’arrive sans problème à dessiner mes itinéraires, voir capture d’écran en PJ.
Code:
SELECT id1 AS path, st_linemerge(st_union(b.geom)) as geom FROM pgr_kdijkstraPath ( 'SELECT edge_id as id, start_node as source, end_node as target, tps_distance as cost FROM routing_mdz14.edge_data', 47, array[ 1192,1193,1215], false, false )a, routing_mdz14.edge_data b WHERE a.id3=b.edge_id GROUP by id1 ORDER by id1;
J’ai environ 500 sites à raccorder par zone PBO. Chaque zone PBO dispose d’un point BPE. L'information de l'id BPE a été reportée dans la table node.
L’idée est de ne pas écrire à chaque fois la requête par zone PBO (comme celle plus haut) car cela impliquerait de connaitre l’id node du BPE en question et de ses sites raccordables. J’ai plus d’une centaine de BPE et environ 500 sites raccordables.
J’ai dans l’idée qu’une boucle serait un bon moyen de réaliser ce traitement, mais je ne sais pas par où la commencer.
J’ai trouvé sur stackoverflow https://gis.stackexchange.com/questions … -pgroutingun sujet similaire mais je n’ai pas réussi à faire fonctionner la fonction pour la faire correspondre à mes besoins.
Je travaille avec :
postgres 9.6
postgis 2.4
pgRouting 2.5
OS: Win 7 64bit
Je vous remercie d’avance pour votre aide.
Marine.
Hors ligne
#2 Tue 23 January 2018 17:55
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: Itinéraire à multiples destinations sans connaitre id_node[pg_routing]
Salut,
si j'ai bien compris, vous n'avez pas besoin de passer par une fonction.
Il vous suffit de constituer vos données de départ en amont.
Exemple ici, dans le bloc WITH, une CTE renvoie, pour chaque zone,
l'id du PBE et un tableau contenant les id des sites raccordables.
Vous utilisez ensuite cette CTE dans votre requête principale pour alimenter
la fonction de pg_routing grâce à une jointure latérale.
https://docs.postgresql.fr/10/queries-t … es-lateral
Code:
WITH input AS ( SELECT id_pbe, array_agg(id_site_raccordable) site_array FROM pbe JOIN zone_pbo ON st_contains(zone_pbo.geometry, pbe.geometry) JOIN site_raccordable ON st_contains(zone_pbo.geometry, site_raccordable.geometry) GROUP BY id_pbe ) SELECT * FROM input CROSS JOIN LATERAL pgr_kdijkstraPath ( 'SELECT edge_id as id, start_node as source, end_node as target, tps_distance as cost FROM routing_mdz14.edge_data', id_pbe, site_array, false, false ) ;
Dernière modification par tumasgiu (Tue 23 January 2018 18:03)
Hors ligne
#3 Tue 23 January 2018 21:27
Re: Itinéraire à multiples destinations sans connaitre id_node[pg_routing]
Bonsoir et merci pour cette découverte !
Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com
Hors ligne
#4 Wed 24 January 2018 14:21
- bruhnild
- Participant actif
- Lieu: Lyon
- Date d'inscription: 7 Jun 2014
- Messages: 130
Re: Itinéraire à multiples destinations sans connaitre id_node[pg_routing]
Merci tumasgiu pour votre réponse, grace à celle ci j'ai pu parvenir à un résultat très probant!
J'ai joint une capture en PJ pour que vous puissiez constater par vous même le résultat.
Voici la requete pour obtenir le path:
Code:
WITH input AS ( SELECT a.id_bpe, array_agg(c.site_array) site_array FROM travail.bpe as a JOIN mdz14.zone_pbo as b ON st_contains(b.geom, a.geom) JOIN travail.site as c ON st_contains(b.geom, c.geom) GROUP BY a.id_bpe ) SELECT id1 AS path, st_linemerge(st_union(b.geom)) as geom FROM input CROSS JOIN LATERAL pgr_kdijkstraPath ( 'SELECT edge_id as id, start_node as source, end_node as target, tps_distance as cost FROM routing_mdz14.edge_data', id_bpe, site_array, false, false )a, routing_mdz14.edge_data b WHERE a.id3=b.edge_id GROUP by id1 ORDER by id1;
Maintenant je vais l'améliorer pour connecter les bpe entre eux.
Bonne journée!
Hors ligne
Pages: 1
- Sujet précédent - Itinéraire à multiples destinations sans connaitre id_node[pg_routing] - Sujet suivant