Guide de l'utilisateur


Le fonctionnalités essentielles sont définies dans le fichier routing.sql. Ces fonctions attendent en entrée des données dans un format spécifique.

Pour renvoyer des données elles utilisent le type suivant :

CREATE TYPE path_result AS (vertex_id integer, edge_id integer, cost float8);

Cela renvoit un type qui peut être utilisé pour générer des résultats géographiques qui seront décrits plus tard.

 Table des matières

Création de données pour l'application de routage
Plus court chemin avec l'algorithme Dijkstra (sans heuristique)
Fonction A*
Fonction Shooting*
Fonction Driving Distance
Fonction TSP
Fonctions géométriques

Création de données pour l'application de routage

Les logiciels de routage requièrent toujours un noeud source et destination pour chaque arc afin de créer une recherche du plus court chemin. La création de ces données sur des réseaux de lignes implique la création de la topologie de ce réseau. Bien que pgDijkstra donne la possibilité de créer les noeuds sources et destinations dans PostgreSQL, les performances ne sont pas bonne, parfois cette opération peut prendre un jour ou plus pour un grand nombre de données (le paramétrage de la base de donnée peux réduire le temps necéssaire).

Il y a d'autre logiciel qui peuvent être utilisés pour créer une topologie plus rapidement.

Certains d'entre eux sont :

PostGIS

Lors de la rédaction de cette documentation, la dernière version de PostGIS (1.1.2), a commencé à ajouter des fonctionnalités topologiques. Mais cela reste dans un état de développement très primaire et il y a encore très peu de documentation sur la création de topologies. Cette page sera mise à jour lorsque les fonctionnalités topologiques de PostGIS seront dans un état suffisament stable pour être utilisées.

ArcInfo

Pour ceux qui possède un licence ArcInfo, la création de topologie est faite simplement en utilisant la commend build: build line {Coverage Name} et en exportant ensuite la couverture dans un fichier vecteur, qui peut être ensuite importé dans PostGIS. La commande build va créer les colonnes fnode_,tnode_,length qui peuvent être renommées dans PotgreSQL comme source,target, et la colonne length peut être utilisé comme le coût intial.

GRASS

GRASS peut aussi être utilisé pour créer une topologie, mais l'extraction de l'information topologique et l'insertion dans PostgreSQL n'est pas aussi simple que dans ArcInfo puisque l'information topologique n'est pas inclue dans l'ensemble des donnée lors de l'export dans un fichier vecteur.

La commande de création de topologie, v.build, a un option dump qui permet d'afficher l'information dans un flux qui peut être redirigé dans un fichier. Par exemple :

v.build map=dourol option=build,dump > dourokukan.txt

La sortie devrait ressembler à cela :

---------- TOPOLOGY DUMP ----------
N,S,E,W,T,B: 35.897887, 24.281578, 153.985841, 138.943042, 0.000000, 0.000000
Nodes (148304 nodes, alive + dead ):
node = 1, n_lines = 3, xy = 139.756532, 35.67451
line = 1, type = 2, angle = -2.265356
line = -20, type = 2, angle = -0.055499
line = 8, type = 2, angle = 1.281166
node = 2, n_lines = 3, xy = 139.756261, 35.674216
line = -9, type = 2, angle = -2.827622
line = 2, type = 2, angle = -1.878154
...
...
...
Lines (220672 lines, alive + dead ):
line = 1, type = 2, offset = 14 n1 = 1, n2 = 2, left/area = 0, right = 0
N,S,E,W,T,B: 35.674510, 35.674216, 139.756532, 139.756261, 0.000000, 0.000000
line = 2, type = 2, offset = 79 n1 = 2, n2 = 3, left/area = 0, right = 0
N,S,E,W,T,B: 35.674216, 35.672010, 139.756261, 139.755285, 0.000000, 0.000000
line = 3, type = 2, offset = 160 n1 = 3, n2 = 4, left/area = 0, right = 0
N,S,E,W,T,B: 35.672010, 35.671649, 139.755285, 139.755014, 0.000000, 0.000000

Un programme perl comme celui-ci (table_topo.pl) peut être utilisé pour convertir la sortie de GRASS dans un fichier SQL qui créera les table de noeuds et d'arcs contenant l'imformation topologique. Ces tables peuvent ensuite être liés dans la table réseau de PostGIS pour créer les information source-destination.

haut de la page | table des matières

Plus court chemin avec l'algorithme Dijkstra (sans heuristique)

La fonction shortest_path est définie de la manière suivante :

CREATE OR REPLACE FUNCTION shortest_path(sql text, source_id integer, 
       target_id integer, directed boolean, has_reverse_cost boolean) 
    RETURNS SETOF path_result
Les arguments sont les suivants :
sql
une requête SQL qui doit renvoyer les champs suivants :
SELECT id, source, target, cost FROM edge_table;
  • id: l'identifiant entier (int4) de l'arc
  • source: un identifiant entier (int4) du noeud de départ
  • target: un identifiant entier (int4) du noeud d'arrivée
  • cost: le coût de la traversée d'un arc (float8, un coût négatif permet de s'assurer qu'on ne passera jamais par cette arc)
  • reverse_cost : (optionel) le coût de la traversée de l'arc en sens invers. Cela n'estutilisé que lorsque la fonction est appelé avec l'argument has_reverse_cost à vrai.
source_id
identifiant du noeud de départ.
target_id
identifiant du noeud d'arrivée.
directed
vrai si le graphe est orienté.
has_reverse_cost
vrai si la colonne reverse_cost doit être considérée lors de la recherche du plus court chemin, dans le cas où lma traversée de l'arc se fait en sens invers.
Cette fonction renvoit un ensemble de tuples. Il y a un tuple par arc traversé et un tuple supplémentaire à la fin contenant le noeud d'arrivée. Les colonnes de chaque lignes sont les suivants : Exemple :
SELECT * FROM shortest_path('SELECT gid AS id, source::int4, 
          target::int4, length::double precision AS cost,
    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('SELECT gid AS id, source::int4, 
         target::int4, length::double precision AS cost,length::double precision 
    AS reverse_cost FROM dourol', 3, 7, true, true);
haut de la page | table des matières

Fonction A*

La fonction shortest_path_astar est définie de la façon suivante :

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

Les arguments sont :

Fonction Shooting*

La fonction shortest_path_shooting_star est définie de la façon suivante :

CREATE OR REPLACE FUNCTION shortest_path_shooting_star(sql text, source_id integer, target_id integer,directed boolean, has_reverse_cost boolean)
RETURNS SETOF path_result

Les arguments sont :

sql
une requête SQL, qui doit renvoyer un ensemble de lignes ayant les mêmes colonnes que celles nécessaires à A* plus :

  • rule: une chaîne de caractère contenant une liste d'identifiants d'arcs, séparés par une virgule, qui décrit le sens giratoir (si je suis sur tel tronçon je peux aller sur tel tronçon avec le coût décrit dans la colonne to_cost)
  • to_cost : le coût d'un passage restrain (peut être très élevé dans le cas où le fait de tourner vers tel arc entraine le passage par un feu)

source_id
int4 identifiant de l'arc de départ
target_id
int4 identifiant de l'arc 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 équivalent à celui renvoyé par A* mis à part que le dernier coût retourné n'est pas -1.

Exemple:

SELECT * from shortest_path_shooting_star('SELECT id, source, target, cost,
x1, y1, x2, y2, rule, to_cost FROM edges', 17, 9, true, false);
vertex_id | edge_id | cost
----------+---------+------------------------
       16 |      17 | 1
       15 |      16 | 1
        2 |       5 | 1
        3 |       4 | 1
       20 |      12 | 2
       10 |       9 | 2
(6 rows)


haut de la page | table des matières

Fonction Driving Distance

La fonction driving_distance est définie comme suit :

CREATE OR REPLACE FUNCTION driving_distance(sql text, source_id integer,distance float8)
RETURNS SETOF path_result

Les arguments sont :

sql
une requête SQL, qui devrait renvoyer un ensemble de lignes ayant les colonnes suivantes :

  • id: un identifiant (int4) de l'arc
  • source: un identifiant (int4) du noeud origine
  • target: un identifiant (int4) du noeud destination
  • cost: une valeur float8 représentant le coût de traversé d'un arc. (un coût négatif entrainera la non insertion de l'arc dans le graphe).

source_id
un identifiant (int4) du point de départ id of the start point
distance
une valeur float8 de la distance en degrés

La focntion renvoie un ensemble de lignes. Il y a une ligne pour chaque arc tranversés et un ligne supplémentaire contenant le noeud terminal. Les colonnes de chaque lignes sont :

Fonction TSP

La fonction tsp est définie comme suit :

CREATE OR REPLACE FUNCTION tsp(sql text, ids varchar, source_id integer)
RETURNS SETOF path_result

Les arguments sont :

sql
un requête SQL qui devrait retourner un ensemble de lignes ayant les colonnes suivantes :

  • source_id: un int4 identifiant du noeud
  • x: la coordonée x du noeud
  • y: la coordonée y du noeud

ids
une chaîne de charactères contenant les idetifiants (int4) des noeuds séparés par une virgule.
source_id
identifiant (int4) du point de départ

La fonction renvoie un ensemble de lignes. Il y a une ligne pour chaque arc travsersé et une en plus contenant le noeud final. Les colonnes de chaques lignes sont les suivantes :

Exemple:

SELECT * from tsp('select distinct source as source_id,
x1::double precision as x,
y1::double precision as y from dourol
where source in (83593,66059,10549,18842,13)',
'83593,66059,10549,18842,13', 10549);
vertex_id | edge_id | cost
----------+---------+------
    10549 |       0 |     0
    83593 |       0 |     0
    66059 |       0 |     0
    18842 |       0 |     0
       13 |       0 |     0
(5 rows)

Ensuite la colonne vertex_id peut être utilisée pour le calcul du plus court chemin.

haut de la page | table des matières

Fonctions géométriques

Il y a de nombreuses fonctions dans le fichier routing_postgis.sql qui renvoient le résultat sous la forme d'une geometrie (objet de type geometry). Vous pouvez trouver leur noms facilement - elles contiennent "as_geometry".

haut de la page | table des matières