CREATE OR REPLACE FUNCTION shortest_path_astar(sql text, source_id integer, target_id integer, directed boolean, has_reverse_cost boolean)
RETURNS SETOF path_result
- sql
- une requête SQL, qui doit renvoyer un ensemble de lignes ayant les colonnes suivantes :
- id: une entier (int4), l'identifiant de l'arc
- source: un entier (int4), l'identifiant du noeud source
- target: un entier (int4), l'identifiant du noeud destination
- cost: une valeur flotante (float8) représentant le coût de la traversé de l'arc. (un coût négatif permettra d'empécher l'insertion de l'arc dans le graphe).
- x1: coordonée x du noeud source de l'arc
- y1: coordonée y du noeud source de l'arc
- x2: coordonée x du noeud destination de l'arc
- y2: coordonée x du noeud destination de l'arc
- reverse_cost (optional): le coût de la traversée dans le sens inverse de l'arc. Cela est uniquement utilisé lorsque le graphe est orienté et que les paramètres has_reverse_cost sont à vrai (voir la remarque ci-dessous concernant les coûts inverses).
- source_id
- int4 identifiant du point de départ
- target_id
- int4 identifiant du point d'arrivé
- directed
- vrai si le graphe est orienté
- has_reverse_cost
- si sa valeur est vrai, la colonne
reverse_cost
du résultat SQL généré sera utilisé pour le coût de la traversé d'un arc dans la direction oposée.
La fonction renvoie un ensemble de lignes. Il y a une ligne pour chaque arc traversé et une en plus contenant le noeud terminal. Les colonnes de chaque lignes sont :
- vertex_id: l'identifiant du noeud origine de chaque arc. Il y a une ligne supplémentaire après le dernier arc qui contient le noeud de la destination du chemin.
- edge_id: l'identifiant de l'arc croisé
- cost: le coût associé à l'arc courant. Il vaut 0 pour les lignes après le dernier arc. Donc, le coût total du chemin peut être calculé en utilisant la somme de la colonne coût de toutes le lignes.
Exemple:
SELECT * from shortest_path_astar('SELECT gid as id, source::int4,
target::int4, length::double precision as cost, x1, y1, x2, y2
FROM dourol',3, 7, false, false);
vertex_id | edge_id | cost
----------+---------+------------------------
3 | 2 | 0.000763954363701041
4 | 21 | 0.00150254971056274
6 | 5 | 0.000417442425988342
7 | -1 | 0
(4 rows)
SELECT * from shortest_path_astar('SELECT gid as id, source::int4,
target::int4, length::double precision as cost,length::double precision
as reverse_cost, x1, y1, x2, y2 FROM dourol', 3, 7, true, true);