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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Fri 22 June 2012 12:09

m0uum0uu
Juste Inscrit !
Date d'inscription: 22 Jun 2012
Messages: 1

pgRouting - multi table

Bonjour,
je développe actuellement un outil pour le calcul d'itinéraire à partir d'un réseau GTFS (bus par exemple)
Je rencontre un problème au niveau de l'utilisation de pGrouting : je dois affecter des valeurs temporaires à certains arcs. Ces valeurs sont stockées dans une autre table. Je choisi la valeur à utiliser par pgrouting (valeur de base ou valeur temporaire) à l'aide d'un LEFT JOIN + case dans le select. Les résultats  de cette requête sont ceux attendus. Malheureusement lorsque je souhaite les utiliser avec pgrouting (requete dans le 1er parametre de shortest_path), les valeurs temporaires (qui peuvent parfois être très grandes) n'ont pas l'air d'être prises en compte lors du calcul mais sont retournées dans les résultats finaux. Je me retrouve avec une réponse composée d'arcs de poids gigantesques alors que des chemins de poids 1000x plus petits existent.

Ex de résultat final :
vertex_id | edge_id | cost
-----------+---------+-------
      1001 |   70466 |  9780
      1002 |   70467 |    60
      1003 |   70468 |    60
      1004 |   20422 | 78720
      1005 |   20423 |    60
      1006 |   20401 | 84240
      1111 |   20402 |    60
      1432 |   20403 |    60
      1513 |   20404 |    60
      1514 |   20405 |   240
...

les grandes valeurs (9780 etc) sont les poids temporaires.
Or des arcs de meme source/target mais de poids largement inférieurs existent

Voici ma requête :
SELECT * FROM  shortest_path('
    SELECT t.arc_id as id,
    t.source_id::integer as source,
    t.target_id::integer as target,
    CASE
        WHEN t.cost IS NULL
        THEN extract(epoch from t.delais::time)::double precision
        ELSE t.cost::double precision
    END as cost
    from (graph g LEFT JOIN  graph_tmp gt ON g.arc_id = gt.arc) as t',
1001, 2020, true, false);

Graph contient la liste d'arcs et graph_tmp les poids temporaires
Le case utilise le poids temporaire s'il existe, la valeur de base sinon.
Le deuxième select me retourne bien un résultat sous la forme id|source|target|cost avec les valeurs que je souhaite.
Pour moi c'est sur ce résultat qu'est basé le graphe généré par pgRouting (?).
Peut-être n'ai-je pas bien compris l'utilité du 1er paramêtre de shortest_path() ?

J'espère que mon post est compréhensible..

Merci pour toute aide susceptible de me débloquer smile

Hors ligne

 

Pied de page des forums

Powered by FluxBB