Postgis/Pgrouting: Temps moyen d’accès à la gare SNCF de Rennes

le

Quel est le temps ou la distance moyenne d’accès à la gare SNCF de Rennes ?Eh bien pour répondre à cette question il existe plusieurs possibilités en termes de représentation cartographique.Nous allons uniquement exploiter ici les fonctionnalités de Postgis/Pgroutine pour y répondre.

15mn_gare_sncf

Avant de commencer assurez-vous d’avoir installé Postgis et Pgrouting. Sinon je vous envoie à la documentation.

La source des données :

Référentiel voies et adresses de Rennes Métropole (rva_troncon.shp)
Périmètres des 45 sous-quartiers de la Ville de Rennes(sous_quartiers_vdr.shp)

Préparation des données :

1/-Importation
Nous allons travailler uniquement avec les données de la commune de Rennes. Dans Qgis j’ai créé une intersection entre rva_troncon.shp et sous_quartiers_vdr.shp pour récupérer uniquement les tronçons de Rennes.
Ensuite j’ai supprimé les voies non utilisées par les voitures tels que « modes doux » et » non définie » dans la colonne « hierarchie » de rva_rennes.

Enfin j’ai importé les données dans Postgis. Vous pouvez le faireavec QGIS ou autre. Pour vous faciliter la tâche voici un fichier bat pour l’importation des données dans ma base de données routing :

gt;REM Parametres de connections
set PGPORT=5432
set PGHOST=localhost
set PGUSER=admin
set PGPASSWORD=admin
"C:\Program Files\PostgreSQL\9.3\bin\shp2pgsql" -d -D -I -W CP1252 -s 4326 "C:\data\accident\rva_rennes.shp" | "C:\Program Files\PostgreSQL\9.3\bin\psql" -d routing

 

2/-Création d’une structure topologique

-- Creation des colonnes "source" and "target" pour les sommets et cible de chaque tronçons
ALTER TABLE rva_rennes ADD COLUMN "source" integer;
ALTER TABLE rva_rennes ADD COLUMN "target" integer;
ALTER TABLE rva_rennes ADD COLUMN "reverse_cost" double precision;
--J’ai également crer des colonnes pour estimer la vitesse et le temps. On y reviendra.
ALTER TABLE rva_rennes ADD COLUMN "temps" double precision;
ALTER TABLE rva_rennes ADD COLUMN "vitesse" double precision;

--creationn de la topologie
Ca va nous créer des nœuds pour chaque source et target dans une table vertex_temp qui vont nous servir pour calculer les temps d’accès ou coûts.
SELECT assign_vertex_id('rva_rennes', 0.00001, 'geom', 'gid');

Plus court chemin
Je vais alors chercher le plus court chemin entre le point ayant l’identifiant 7 (Source) et le point ayant l’identifiant 2 (Destination).
Dans ma table vertex_temp le centre ville( République et la gare SNCF) correspond au nœuds 2746 et 2963
Si vous voulais savoir quel est le nœud le plus près de la gare(x,y) vous pouvez procéder ainsi :

create table temp as
SELECT a.gid, b.id, min(a.dist)
FROM
(SELECT gare_sncf.id as gid,
min(st_distance(gare_sncf.the_geom, vertices_tmp.the_geom)) AS dist
FROM gare_sncf, vertices_tmp
GROUP BY gid) AS a,
(SELECT gare_sncf.id as gid, vertices_tmp.id,
st_distance(gare_sncf.the_geom, vertices_tmp.the_geom) AS dist
FROM gare_sncf, vertices_tmp) AS b
WHERE a.dist = b. dist
AND a.gid = b.gid
GROUP BY a.gid, b.id

-- Ici c’est le nœud 2963 à 1.2 mn de la gare
Le plus court chemin pour aller de la république à la gare :
create table pgr_dijkstra as
SELECT id2,rva_rennes.geom
FROM pgr_dijkstra
(
'SELECT
gid AS id,
source,
target,
reverse_cost AS cost
FROM rva_rennes '
,2746, 2963, false, false)
JOIN
rva_rennes
ON
id2=rva_rennes.gid;

pgr_dijkstra

Distance de tous les tronçons à la Gare SNCF
Nous allons maintenant estimer la distance parcourue pour accéder à la gare pour chaque tronçon dans la commune de Rennes.

–Distance d’accés à la gare en km
–drop table dist_gare


CREATE TABLE dist_gare AS
SELECT
id,
the_geom,
(SELECT sum(cost) FROM (
SELECT * FROM pgr_dijkstra('
SELECT gid as id,
source::integer,
target::integer,
reverse_cost::double precision AS cost
FROM rva_rennes',
2963,
id,
false,
false)) AS foo ) AS cost
FROM vertices_tmp

 

distance

Ici nous avons donc la répartition des nœuds entre 0 et 10 km aux tours de la gare SNCF de Rennes.

Temps d’accès à la Gare SNCF
Nous avons la distance en mettre il suffit alors d’avoir la vitesse pour calculer le temps de parcours sachant que T=D/V
Dans les données fournis nous n’avons pas les vitesses des tronçons. En se basant sur WKI http://fr.wikipedia.org/wiki/Vitesse_maximale_autoris%C3%A9e_sur_route_en_France
J’ai crée une colonne pour estimer la vitesse dans rva_rennes.


update rva_rennes set vitesse=100 where hierarchie like'%int�r�t national ou r�gional%';
update rva_rennes set vitesse=50 where hierarchie like '%Voie structurant%';
update rva_rennes set vitesse=90 where hierarchie like '%Ceinture de desserte%';
update rva_rennes set vitesse=50 where hierarchie ='Voie de desserte locale';
update rva_rennes set vitesse=90 where hierarchie = 'Voie de desserte urbaine';
update rva_rennes set vitesse=90 where hierarchie ='Voie principale communale';
update rva_rennes set vitesse=90 where hierarchie like 'Voie communale principale hors agglom�ration';
update rva_rennes set vitesse=30 where hierarchie = 'Voie inter quartier';

--temps d acces a la gare
CREATE TABLE temps_gare AS
SELECT
id,
the_geom,
(SELECT sum(cost) FROM (
SELECT * FROM pgr_dijkstra('
SELECT gid as id,
source::integer,
target::integer,
temps::double precision AS cost
FROM rva_rennes',
2963,
id,
false,
false)) AS foo ) AS cost
FROM vertices_tmp

temps_acces

 

Comme vous pouvez le voir voici le temps d’accès à la gare SNCF en minutes

Fronction Driving distance
Par exemple pour calculer uniquement les routes qui se trouvent à – 5mn de la gare, la fonction pgr_drivingdistance_vitesse permet de répondre à cette question.

CREATE table pgr_drivingdistance_gare AS

SELECT seq, id1 AS node, id2 AS edge, cost, the_geom

FROM pgr_drivingdistance(

'SELECT

gid AS id,

source,

target,

temps AS cost

FROM rva_rennes',

2963, 5, false, false

) as di

JOIN vertices_tmp pt

ON di.id1 = pt.id

 

where cost is not null

5mn_gare

20mn

20mn_gare

Interpolation des données

Avec QGIS on peut également faire une interpolation pour représenter le temps d’accès en 15 mn de la gare

15mn_gare

Bon voilà maintenant vous avez les bases pour pgrouting.
Pour approfondir notre carte on pourrait par exemple calculer la densité de population rennaise qui met 10- 15 mn pour accéder à la gare ou tout simplement les hôtels accessibles en de 5mn au tours de la gare …

 

 

Un commentaire Ajouter un commentaire

  1. guitousson dit :

    Vraiment super intéressant et impressionnant à la fois.

    Jean-Guillaume

Laisser un commentaire