Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).

En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.

#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.


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#2 Tue 23 January 2018 17:55

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1129

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

Loic_GR
Moderateur
Lieu: Besancon
Date d'inscription: 12 May 2011
Messages: 1016
Site web

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!


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

Pied de page des forums

Powered by FluxBB