pgRouting Manual (2.0.0)

Topologie de routage

«  Prise en main   ::   Contenu   ::   Analytiques de graphe  »

Topologie de routage

Author:Stephen Woodbridge <woodbri@swoodbridge.com>
Copyright:Stephen Woodbridge. The code source est distribué sous la licence MIT-X.

Présentation

Typically when GIS files are loaded into the data database for use with pgRouting they do not have topology information associated with them. To create a useful topology the data needs to be “noded”. This means that where two or more roads form an intersection there it needs to be a node at the intersection and all the road segments need to be broken at the intersection, assuming that you can navigate from any of these segments to any other segment via that intersection.

Vous pouvez utiliser les graph analysis functions pour vous aider à voir où vous pourrie avoir des problèmes de topologie dans vos données. Si vous avez besoin de nouer vos données, nous avons aussi une fonction pgr_nodeNetwork() qui pourrait fonctionner pour vous. La fonction sépare TOUS les segments et les noue. Il y a certaines cas où cela pourrait ne pas être la bonne chose à faire.

Par exemple, quand vous avez une intersection entre une route supérieure et inférieure, vous ne voulez pas qu’elle soit nouée, mais pgr_nodeNetwork ne sait pas que c’est le cas et va les nouer avec eux ce qui n’est pas bien parce qu’ensuite le conducteur sera capable d’éteindre la route supérieure sur la route inférieure comme cela était une intersection plate 2D. Pour faire face à ce problème certains jeux de données à ces types utilisent les z-levels à ces types d’intersections et autres données pourraient ne pas nouer cette intersection ce qui serait ok.

Pour ces cas où la topologie a besoin d’être ajoutée les fonctions suivantes peuvent être utiles. Une façon de préparer les données pour pgRouting est d’ajouter les colonnes suivantes à votre table et ensuite les remplir comme approprié. Cet exemple fait un tas d’hypothèses comme que vos tables de données originales ont certaines colonnes comme one_way, fcc, et possiblement autres et qu’ils contiennent des valeurs de données spécifiques. Ceci est seulement pour vous donner une idée de ce que vous pouvez faire avec vos données.

ALTER TABLE edge_table
    ADD COLUMN source integer,
    ADD COLUMN target integer,
    ADD COLUMN cost_len double precision,
    ADD COLUMN cost_time double precision,
    ADD COLUMN rcost_len double precision,
    ADD COLUMN rcost_time double precision,
    ADD COLUMN x1 double precision,
    ADD COLUMN y1 double precision,
    ADD COLUMN x2 double precision,
    ADD COLUMN y2 double precision,
    ADD COLUMN to_cost double precision,
    ADD COLUMN rule text,
    ADD COLUMN isolated integer;

SELECT pgr_createTopology('edge_table', 0.000001, 'the_geom', 'id');

La fonction pgr_createTopology() va créer la table vertices_tmp et remplir la source et les colonnes target. L’exemple suivant remplit les colonnes suivantes. Dans cet exemple, la colonne fcc contient le code de la classe fonctionnalité et les instructions CASE le convertissent en une vitesse moyenne.

UPDATE edge_table SET x1 = st_x(st_startpoint(the_geom)),
                      y1 = st_y(st_startpoint(the_geom)),
                      x2 = st_x(st_endpoint(the_geom)),
                      y2 = st_y(st_endpoint(the_geom)),
  cost_len  = st_length_spheroid(the_geom, 'SPHEROID["WGS84",6378137,298.25728]'),
  rcost_len = st_length_spheroid(the_geom, 'SPHEROID["WGS84",6378137,298.25728]'),
  len_km = st_length_spheroid(the_geom, 'SPHEROID["WGS84",6378137,298.25728]')/1000.0,
  len_miles = st_length_spheroid(the_geom, 'SPHEROID["WGS84",6378137,298.25728]')
              / 1000.0 * 0.6213712,
  speed_mph = CASE WHEN fcc='A10' THEN 65
                   WHEN fcc='A15' THEN 65
                   WHEN fcc='A20' THEN 55
                   WHEN fcc='A25' THEN 55
                   WHEN fcc='A30' THEN 45
                   WHEN fcc='A35' THEN 45
                   WHEN fcc='A40' THEN 35
                   WHEN fcc='A45' THEN 35
                   WHEN fcc='A50' THEN 25
                   WHEN fcc='A60' THEN 25
                   WHEN fcc='A61' THEN 25
                   WHEN fcc='A62' THEN 25
                   WHEN fcc='A64' THEN 25
                   WHEN fcc='A70' THEN 15
                   WHEN fcc='A69' THEN 10
                   ELSE null END,
  speed_kmh = CASE WHEN fcc='A10' THEN 104
                   WHEN fcc='A15' THEN 104
                   WHEN fcc='A20' THEN 88
                   WHEN fcc='A25' THEN 88
                   WHEN fcc='A30' THEN 72
                   WHEN fcc='A35' THEN 72
                   WHEN fcc='A40' THEN 56
                   WHEN fcc='A45' THEN 56
                   WHEN fcc='A50' THEN 40
                   WHEN fcc='A60' THEN 50
                   WHEN fcc='A61' THEN 40
                   WHEN fcc='A62' THEN 40
                   WHEN fcc='A64' THEN 40
                   WHEN fcc='A70' THEN 25
                   WHEN fcc='A69' THEN 15
                   ELSE null END;

-- UPDATE the cost infomation based on oneway streets

UPDATE edge_table SET
    cost_time = CASE
        WHEN one_way='TF' THEN 10000.0
        ELSE cost_len/1000.0/speed_kmh::numeric*3600.0
        END,
    rcost_time = CASE
        WHEN one_way='FT' THEN 10000.0
        ELSE cost_len/1000.0/speed_kmh::numeric*3600.0
        END;

-- clean up the database because we have updated a lot of records

VACUUM ANALYZE VERBOSE edge_table;

Maintenant votre base de données devrait être prête pour utiliser n’importe (la plupart ?) des algorithmes de pgRouting.

«  Prise en main   ::   Contenu   ::   Analytiques de graphe  »