couche phase_2_trace_secteur

This commit is contained in:
MaelReboux 2019-05-01 14:53:48 +02:00
parent 007b4cf784
commit c437d84829
3 changed files with 104 additions and 98 deletions

View file

@ -284,6 +284,34 @@ ALTER TABLE phase_2_trace_pgr_4326 OWNER to redadeg;
-- couche qui contient 1 ligne par secteur
DROP TABLE IF EXISTS phase_2_trace_secteur CASCADE ;
CREATE TABLE phase_2_trace_secteur
(
secteur_id int,
nom_fr text,
nom_br text,
longueur int,
longueur_km numeric,
the_geom geometry,
CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = 2154)
);
ALTER TABLE phase_2_trace_secteur OWNER to redadeg;
-- une vue en 4326 pour export
DROP VIEW IF EXISTS phase_2_trace_secteur_4326 ;
CREATE VIEW phase_2_trace_secteur_4326 AS
SELECT
secteur_id, nom_fr, nom_br,
longueur, longueur_km,
ST_Transform(the_geom,4326)::geometry(MultiLineString, 4326) AS the_geom
FROM phase_2_trace_secteur ;
ALTER TABLE phase_2_trace_secteur_4326 OWNER to redadeg;
-- la table qui va contenir des tronçons de x m
DROP TABLE IF EXISTS phase_2_trace_troncons ;

View file

@ -1,105 +1,33 @@
/*
==========================================================================
phase 2 : calcul d'itinéraires en appui du réseau routier OSM
phase 2 : création de différentes données à partir du tracé routé
==========================================================================
*/
-- dans la base redadeg on a chargé la couche osm_roads qui a été calculée
-- à partir de données OSM
-- 2. ajout d'un nouvel attribut sur la table osm_roads
-- normalement il existe déjà mais au cas où on a rechargé un nouveau réseau routier
SELECT topology.AddTopoGeometryColumn('osm_roads_topo', 'public', 'osm_roads', 'topo_geom', 'LINESTRING');
-- 3. on calcule le graphe topologique
-- en remplissant le nouvel attribut géométrique
-- le 1er chiffre est l'identifiant du layer dans la table topology.layer
-- le 2e chiffre est la tolérance en mètres
UPDATE osm_roads SET topo_geom = topology.toTopoGeom(the_geom, 'osm_roads_topo', 1, 0.00001);
-- 1.0 = 18 min
-- 0.00001 = 2 min
-- à ce stade on a un graphe topologique dans le schema osm_roads_topo
-- 4. remplissage de la couche routable depuis la couche d'origine et la topologie
-- on commence par vider avant de remplir
TRUNCATE TABLE osm_roads_pgr ;
--TRUNCATE TABLE osm_roads_pgr_noded ;
TRUNCATE TABLE osm_roads_pgr_vertices_pgr ;
-- reset des séquences
ALTER SEQUENCE osm_roads_pgr_vertices_pgr_id_seq RESTART WITH 1;
--ALTER SEQUENCE osm_roads_pgr_noded_id_seq RESTART WITH 1;
INSERT INTO osm_roads_pgr
( SELECT
row_number() over() as id,
o.osm_id,
o.highway,
o.type,
o.oneway,
o.ref,
o.name_fr,
o.name_br,
NULL as source,
NULL as target,
NULL as cost,
NULL as reverse_cost,
e.geom as the_geom
FROM osm_roads_topo.edge e,
osm_roads_topo.relation rel,
osm_roads o
WHERE e.edge_id = rel.element_id
AND rel.topogeo_id = (o.topo_geom).id
);
-- calcul des 2 attributs de coût (= longueur)
UPDATE osm_roads_pgr SET cost = st_length(the_geom);
UPDATE osm_roads_pgr SET reverse_cost = st_length(the_geom);
-- 5. calcul du graphe routier par pgRouting
SELECT pgr_createTopology('osm_roads_pgr', 1.0);
-- 35 s
-- vérification
SELECT pgr_analyzegraph('osm_roads_pgr', 1.0);
SELECT pgr_nodeNetwork('osm_roads_pgr', 1.0);
-- il ne reste plus qu'à faire des calculs d'itinéraires
-- on met le résultat dans une table
TRUNCATE TABLE phase_2_trace_pgr ;
INSERT INTO phase_2_trace_pgr
-- on prend le tracé routé et on fait une version simple
-- 1 ligne par secteur
TRUNCATE TABLE phase_2_trace_secteur ;
INSERT INTO phase_2_trace_secteur
SELECT
-- info de routage
a.seq AS id,
a.path_seq,
a.node,
a.cost,
a.agg_cost,
-- infos OSM
b.osm_id,
b.highway,
b."type",
b.oneway,
b.ref,
b.name_fr,
b.name_br,
b.the_geom
FROM pgr_dijkstra(
'SELECT id, source, target, cost, reverse_cost FROM osm_roads_pgr',
7632, 687) as a
JOIN osm_roads_pgr b ON a.edge = b.id ;
secteur_id, '', '', 0, 0,
ST_UNION(the_geom)
FROM phase_2_trace_pgr
GROUP BY secteur_id
ORDER BY secteur_id ;
-- mise à jour des attributs
UPDATE phase_2_trace_secteur a
SET
nom_fr = b.nom_fr,
nom_br = b.nom_br,
longueur = TRUNC( ST_Length(the_geom)::numeric , 0),
longueur_km = TRUNC( ST_Length(the_geom)::numeric / 1000 , 1)
FROM secteur b WHERE a.secteur_id = b.id ;
TRUNCATE phase_2_trace_troncons ;
/*TRUNCATE phase_2_trace_troncons ;
INSERT INTO phase_2_trace_troncons
SELECT
row_number() over() as uid,
@ -140,5 +68,5 @@ SET
END),
km = uid -- km redadeg
;
*/

View file

@ -14,6 +14,9 @@ cd /data/www/vhosts/ar-redadeg_openstreetmap_bzh/htdocs/scripts/
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# on récupère les couches geojson depuis umap
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo " Récupération des fichiers geojson depuis umap"
# les couches PK
# PK début - fin de secteur
curl -sS http://umap.openstreetmap.fr/fr/datalayer/817220/ > data/phase_2_umap_pk_secteur.geojson
@ -22,7 +25,9 @@ curl -sS http://umap.openstreetmap.fr/fr/datalayer/817221/ > data/phase_2_umap_
# PK manuels
curl -sS http://umap.openstreetmap.fr/fr/datalayer/817222/ > data/phase_2_umap_pk_manuel.geojson
echo "Récupération des fichier geojson umap ok"
echo " fait"
echo ""
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# on les charge dans postgis
@ -30,15 +35,25 @@ echo "Récupération des fichier geojson umap ok"
# note : les coordonnées sont en 3857 mais la déclaration de la table = 4326
echo " chargement des fichiers dans la BD"
$PSQL -U $DB_USER -d $DB_NAME -c "DROP TABLE IF EXISTS phase_2_pk_secteur_3857 CASCADE;"
ogr2ogr -f "PostgreSQL" PG:"host=localhost user=redadeg password=redadeg dbname=redadeg" data/phase_2_umap_pk_secteur.geojson -nln phase_2_pk_secteur_3857 -lco GEOMETRY_NAME=the_geom -explodecollections -overwrite
echo " fait"
echo ""
# on crée les tables en 3948
# et bien d'autres choses :
# - recalage des PK secteurs sur un nœud du réseau routable
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo " Application des traitements SQL 2.1"
echo ""
$PSQL -U $DB_USER -d $DB_NAME < traitements_phase_2.1.sql
echo " fait"
echo ""
@ -48,6 +63,9 @@ $PSQL -U $DB_USER -d $DB_NAME < traitements_phase_2.1.sql
# https://www.manniwood.com/postgresql_and_bash_stuff/index.html
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo " Calcul des itinéraires (pgrouting)"
echo ""
# on commence par vider la table qui contiendra les calculs d'itinéraires
$PSQL -h $DB_HOST -U $DB_USER -c "TRUNCATE TABLE phase_2_trace_pgr ;"
@ -129,19 +147,51 @@ ORDER BY pk.id ;" \
done
echo " Calcul des itinéraires terminé"
echo ""
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# on applique maintenant des requêtes SQL de création des données dérivées des données de routage
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo " Application des traitements SQL 2.2"
echo ""
$PSQL -U $DB_USER -d $DB_NAME < traitements_phase_2.2.sql
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# et on exporte en geojson pour umap
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo " Exports"
echo ""
echo " exports geojson"
echo ""
rm data/phase_2_pk_secteur.geojson
ogr2ogr -f "GeoJSON" data/phase_2_pk_secteur.geojson PG:"host=localhost user=redadeg password=redadeg dbname=redadeg" phase_2_pk_secteur_4326
rm data/phase_2_trace_pgr.geojson
ogr2ogr -f "GeoJSON" data/phase_2_trace_pgr.geojson PG:"host=localhost user=redadeg password=redadeg dbname=redadeg" phase_2_trace_pgr_4326
rm data/phase_2_trace_secteur.geojson
ogr2ogr -f "GeoJSON" data/phase_2_trace_secteur.geojson PG:"host=localhost user=redadeg password=redadeg dbname=redadeg" phase_2_trace_secteur_4326
# les fichiers sont ensuite tout de suite visible dans umap
echo " fait"
echo ""
# on exporte un json de synthèse des KM par secteur
# TODO
echo ""
echo ""
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo " F I N"
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo ""