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Ă© ?

#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

Copyright Association GeoRezo