Bienvenue sur PostGIS.fr

Bienvenue sur PostGIS.fr , le site de la communauté des utilisateurs francophones de PostGIS.

PostGIS ajoute le support d'objets géographique à la base de données PostgreSQL. En effet, PostGIS "spatialise" le serverur PostgreSQL, ce qui permet de l'utiliser comme une base de données SIG.

Maintenu à jour, en fonction de nos disponibilités et des diverses sorties des outils que nous testons, nous vous proposons l'ensemble de nos travaux publiés en langue française.

source: trunk/workshop-routing-foss4g/docs/chapters/advanced.rst @ 76

Revision 76, 7.1 KB checked in by djay, 12 years ago (diff)

Ajout du répertoire web

RevLine 
[63]1==============================================================================================================
[71]2Requêtes de routage avancées
[63]3==============================================================================================================
4
[71]5Comme expliqué dans le chapitre précédent une requête de recherche de plus court chemine ressemble généralement à ce qui suit :
[63]6
7.. code-block:: sql
8
9        SELECT * FROM shortest_path_shooting_star(
10                'SELECT gid as id, source, target, length as cost, x1, y1, x2, y2, rule,
11                to_cost, reverse_cost FROM ways', 6585, 8247, true, true);
12       
[71]13On parle généralement de **plus court** chemin, ce qui signifie que la longueur d'un arc est son coût. Mais le coût n'est pas nécessairement une longueur, il peut représenter n'importe quoi, par exemple le temps, la surface, le type de routes, etc ... Ou il peut être la combinaison de plusieurs paramÚtres ("coûts pondérés").
[63]14
15.. note::
16
[71]17        Si vous souhaitez continuer avec une base de données contenant les fonctions pgRouting, les données exemples ainsi que les attributs nécessaires, vous pouvez charger le fichier de sauvegarded la maniÚre suivante.
[63]18
19.. code-block:: bash
20
[71]21        # Optionel: supprimer la base de données
[63]22        dropdb -U postgres pgrouting-workshop
23
[71]24        # Charger le fichier de sauvegarde
[63]25        psql -U postgres -f ~/Desktop/pgrouting-workshop/data/sampledata_routing.sql
26
27-------------------------------------------------------------------------------------------------------------
[71]28Coûts pondérés
[63]29-------------------------------------------------------------------------------------------------------------
30
[71]31Dans un vrai réseau il y a différents types de limitations ou de préférences suivant les types de routes par exemple. En d'autre termes, nous ne voulons pas calculer *le plus court* chemin mais le chemin *le moins cher* - un chemin avec un coût minimum. Il n'y aucune limitation dans ce qui peut êtreutilsié pour définir le coût.
[63]32
[71]33Lorsque nous avons convertis les données au format OSM en utilisant l'outil osm2pgrouting, nous avons deux autres tables permettant de déifinir les ``types`` de routes et les ``classes``.
[63]34
35.. note::
36
[71]37        Nous passons maintenant à la base de données que nuos avons générée avec osm2pgrouting. Depuis l'invite de commandes de PostgreSQL ceci est possible avec la commande ``\c routing``.
[63]38
[71]39.. rubric:: Lancer : ``SELECT * FROM types;``
[63]40
41.. code-block:: sql
42
43          id |   name   
44        -----+------------
45           2 | cycleway
46           1 | highway
47           4 | junction
48           3 | tracktype
49   
[71]50.. rubric:: Lancer : ``SELECT * FROM classes;``
[63]51
52.. code-block:: sql
53
54         id  | type_id |        name        |  cost
55        -----+---------+--------------------+--------
56         201 |       2 | lane               |     
57         204 |       2 | opposite           |     
58         203 |       2 | opposite_lane      |   
59         202 |       2 | track              |     
60         117 |       1 | bridleway          |     
61         113 |       1 | bus_guideway       |     
62         118 |       1 | byway              |     
63         115 |       1 | cicleway           |     
64         116 |       1 | footway            |     
65         108 |       1 | living_street      |     
66         101 |       1 | motorway           |   
67         103 |       1 | motorway_junction  |     
68         102 |       1 | motorway_link      |     
69         114 |       1 | path               |     
70         111 |       1 | pedestrian         |     
71         106 |       1 | primary            |     
72         107 |       1 | primary_link       |     
73         107 |       1 | residential        |     
74         100 |       1 | road               |     
75         100 |       1 | unclassified       |     
76         106 |       1 | secondary          |   
77         109 |       1 | service            |     
78         112 |       1 | services           |     
79         119 |       1 | steps              |     
80         107 |       1 | tertiary           |     
81         110 |       1 | track              |     
82         104 |       1 | trunk              |     
83         105 |       1 | trunk_link         |     
84         401 |       4 | roundabout         |     
85         301 |       3 | grade1             |     
86         302 |       3 | grade2             |     
87         303 |       3 | grade3             |     
88         304 |       3 | grade4             |     
89         305 |       3 | grade5             |     
90
[71]91La classe de route est liée avec la tables des cheminspar le champ ``class_id``. Suite à l'importation des données la valeur de la colonne ``cost`` n'est pas encore attribuée. Sa valeur peut être modifiée à l'aide d'une requête ``UPDATE``. Dans cet exemple les valeurs de coût pour la table des classe sont assigné de façon arbitraire, donc nous exécutons :
[63]92
93.. code-block:: sql
94
95        UPDATE classes SET cost=1 ;
96        UPDATE classes SET cost=2.0 WHERE name IN ('pedestrian','steps','footway');
97        UPDATE classes SET cost=1.5 WHERE name IN ('cicleway','living_street','path');
98        UPDATE classes SET cost=0.8 WHERE name IN ('secondary','tertiary');
99        UPDATE classes SET cost=0.6 WHERE name IN ('primary','primary_link');
100        UPDATE classes SET cost=0.4 WHERE name IN ('trunk','trunk_link');
101        UPDATE classes SET cost=0.3 WHERE name IN ('motorway','motorway_junction','motorway_link');
102
[71]103Pour de meilleures performances, tout spécialement si le réseau est important, il est préférable de créer un index sur la colonnes ``class_id`` de la table des chemins et eventuellement le champ ``id`` de la table ``types``.
[63]104
105.. code-block:: sql
106
107        CREATE INDEX ways_class_idx ON ways (class_id);
108        CREATE INDEX classes_idx ON classes (id);
109
[71]110L'idée de ces deux tables est de les utiliser afin de spécifier un facteur qui sera multiplié par le coût de parcour d'un tronçon (habituellement la longueur) :
[63]111
112.. code-block:: sql
113
114        SELECT * FROM shortest_path_shooting_star(
115                'SELECT gid as id, class_id, source, target, length*c.cost as cost,
116                        x1, y1, x2, y2, rule, to_cost, reverse_cost*c.cost as reverse_cost
117                FROM ways w, classes c
118                WHERE class_id=c.id', 6585, 8247, true, true);
119
120-------------------------------------------------------------------------------------------------------------
[71]121Restriction d'accÚs
[63]122-------------------------------------------------------------------------------------------------------------
123
[71]124Une autre possibilité est de restreindre l'accÚs à des routes d'un certains types soit en affectant un coût trÚs élevé à un tronçon ayant un certain attribut soit en s'assurant de ne sélectionner aucun de ces tronçons :
[63]125
126.. code-block:: sql
127
128        UPDATE classes SET cost=100000 WHERE name LIKE 'motorway%';
129
[71]130En utilisant des sous-requêtes vous pouvez "mixer" vos coût comme bon vous semble et cela modifiera le résultat obtenu imédiatement. Les changements de coûts affecteront la prochaine recherche de plus courts chemins, sans avoir à reconstruire le votre réseau.
[63]131
[71]132Bien entendu, certaines classes de tronçon peuvent aussi être exclues à l'aide d'une clause ``WHERE`` dans la requête, par exemple pour exclure la classe "living_street" :
[63]133
134.. code-block:: sql
135
136        SELECT * FROM shortest_path_shooting_star(
137                'SELECT gid as id, class_id, source, target, length*c.cost as cost,
138                        x1, y1, x2, y2, rule, to_cost, reverse_cost*c.cost as reverse_cost
139                FROM ways w, classes c
140                WHERE class_id=c.id AND class_id != 111', 6585, 8247, true, true);
141
[71]142Bien entendu, pgRouting vus permet tout types de requêtes SQL supportées par PostgreSQL/PostGIS.
[63]143 
Note: See TracBrowser for help on using the repository browser.