Suite

Comment préserver l'ordre des résultats avec les fonctions wrapper

Comment préserver l'ordre des résultats avec les fonctions wrapper


En courant

SELECT * FROM dijkstra_sp('voies',232, 421) ;

J'obtiens le résultat classé par gid, plutôt que par l'ordre d'atteindre la cible en commençant à la source.

Quelle en est la raison et y a-t-il un moyen d'obtenir les résultats dans le Naturel ordre de routage ?

J'utilise pgrouting 1,05-1~lucide1 de http://ppa.launchpad.net/georepublic/pgrouting


La raison semble être que SQL ne spécifie pas l'ordre des résultats lors de l'utilisation de jointures. Postgre réorganise donc les résultats lors d'une jointure. Les fonctions wrapper (dijkstra_sp) joignent les résultats de la fonction de routage principale avec la geom_table pour obtenir des informations supplémentaires.

Une solution de contournement consiste à générer des numéros de ligne artificiels avec les résultats de la fonction de routage principale et à les classer en fonction de ceux de la requête externe où la jointure se produit. Malheureusement, cela n'est compatible qu'avec postgre 8.4 et les versions ultérieures.

SELECT rank,gid,the_geom FROM ( select edge_id, ROW_NUMBER() OVER (PARTITION BY 1) as rank from shortest_path( 'SELECT gid as id, source::integer, target::integer, length::double precision as cost FROM way ', 232, 421, false, false ) ) as route join way w on w.gid = edge_id order by rank;

C'est l'un des défauts de pgRouting. J'aurais été beaucoup plus facile pour l'implémentation C++ (le plus court cheminest directement mappé sur une fonction C++) pour renvoyer une colonne de numéro de séquence que d'avoir à recourir à la réorganisation en SQL.

L'autre option est de le faire en PLPGSQL. Vous construisez un tableau à partir des résultats, puis vous utilisez la position dans le tableau comme indicateur de classement :

sélectionnez array_agg(edge_id) de shortest_path('SELECT gid comme identifiant, source, cible, longueur comme coût FROM trail_network', src, dst,false,false) dans les bords ; POUR i dans 1… array_upper(edges, 1) LOOP sélectionnez le nom, le symbole, st_length(the_geom) de trail_network où gid = edge[i] dans tn; RAISE NOTICE 'Edge % on trail [%] symbol [%]', edge[i], tn.name, tn.symbol; FIN DE BOUCLE ;

J'ai exactement le même problème avec mon projet : j'ai besoin d'un ordre correct de gid pour retracer le chemin à partir du résultat SQL.

En regardant les implémentations de dijkstra_sp et la fonction de l'atelier pgRouting dijkstra_sp_delta, il me semble que le rang de la réponse de Florian est déjà implémenté avec une ligne retournée par l'identifiant 'id'. Alors jetez un coup d'œil - c'est peut-être une fonctionnalité plus récente.

C'est 'id' comme dans 'SELECT gid , id ,… ' au lieu de 'SELECT gid ,… ' bien que je n'aie pas vérifié et que je puisse encore me tromper .

PS : j'ai aussi Ubuntu 10.04 et la version ppa de la bibliothèque logicielle pgRouting.

PPS : Veuillez me corriger si je me trompe complètement et que id fait quelque chose de différent.

Edit : il me semble que je me trompe complètement. Apparemment , le champ id est une renumérotation du champ gid dans le résultat de la requête pour augmenter de 1 différence , donc si le résultat est ordonné par id alors tous les nombres dans le champ gid seront également dans l' ordre .