Obtenir plusieurs chemins les plus courts avec PgRouting en une seule requête?

12

Je veux exécuter l'algorithme du chemin le plus court sur plusieurs paires source et cible à la fois et obtenir un résultat sous forme de tableau et le traiter ensuite.

Comment puis-je faire cela? Cette requête ne fonctionne pas:

SELECT a.source, a.target, paths.* 
FROM all_to_all a, shortest_path_astar('...', a.source, a.target, false, false) paths;

ERROR:  function expression in FROM cannot refer to other relations of same query level

(btw, all_to_all ne signifie pas littéralement tout pour tous, :) c'est juste un certain nombre de paires aléatoires)

Cela ne fonctionne pas non plus:

SELECT * 
FROM all_to_all a, (
   SELECT * FROM shortest_path_astar('...', a.source, a.target, false, false) yyy
) AS t2;
culebrón
la source
---- pourriez-vous s'il vous plaît développer cela? j'ai le même problème mais ne peux pas obtenir ces paires à droite? (à partir d'une tentative de modification de l'article]
Mapperz

Réponses:

13

Quelque chose comme

SELECT 
  source, 
  target,
  (SELECT SUM(cost) FROM  -- or whatever you want to do with the routing result
     (SELECT * FROM shortest_path_astar('...',
       source,
       target,
       false,
       false)
     ) AS foo 
  ) AS cost
FROM all_to_all;
obscur
la source
4

Voici une requête qui renvoie tous les segments pour toutes les combinaisons source-cible:

SELECT
    source,
    target,
    shortest_path_astar('SELECT gid AS id, length AS cost, * FROM ways', source, target, false, false) AS segment
FROM
    all_to_all

Incroyable, incohérent avec la syntaxe SQL, mais fonctionne!

source | target | segment
-------+--------+----------------
     1 |      4 | (1, 2, 0.1357)
     1 |      4 | (2, 3, 0.2468)
     1 |      4 | (3, 4, 0.9)
     1 |      4 | (4, -1, 0)
other sources & targets here
culebrón
la source