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 -- la table qui va contenir des tronçons de x m
DROP TABLE IF EXISTS phase_2_trace_troncons ; 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 -- on prend le tracé routé et on fait une version simple
-- à partir de données OSM -- 1 ligne par secteur
TRUNCATE TABLE phase_2_trace_secteur ;
INSERT INTO phase_2_trace_secteur
-- 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
SELECT SELECT
-- info de routage secteur_id, '', '', 0, 0,
a.seq AS id, ST_UNION(the_geom)
a.path_seq, FROM phase_2_trace_pgr
a.node, GROUP BY secteur_id
a.cost, ORDER BY secteur_id ;
a.agg_cost,
-- infos OSM -- mise à jour des attributs
b.osm_id, UPDATE phase_2_trace_secteur a
b.highway, SET
b."type", nom_fr = b.nom_fr,
b.oneway, nom_br = b.nom_br,
b.ref, longueur = TRUNC( ST_Length(the_geom)::numeric , 0),
b.name_fr, longueur_km = TRUNC( ST_Length(the_geom)::numeric / 1000 , 1)
b.name_br, FROM secteur b WHERE a.secteur_id = b.id ;
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 ;
/*TRUNCATE phase_2_trace_troncons ;
TRUNCATE phase_2_trace_troncons ;
INSERT INTO phase_2_trace_troncons INSERT INTO phase_2_trace_troncons
SELECT SELECT
row_number() over() as uid, row_number() over() as uid,
@ -140,5 +68,5 @@ SET
END), END),
km = uid -- km redadeg 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 # on récupère les couches geojson depuis umap
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo " Récupération des fichiers geojson depuis umap"
# les couches PK # les couches PK
# PK début - fin de secteur # PK début - fin de secteur
curl -sS http://umap.openstreetmap.fr/fr/datalayer/817220/ > data/phase_2_umap_pk_secteur.geojson 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 # PK manuels
curl -sS http://umap.openstreetmap.fr/fr/datalayer/817222/ > data/phase_2_umap_pk_manuel.geojson 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 # 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 # 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;" $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 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 # on crée les tables en 3948
# et bien d'autres choses : # et bien d'autres choses :
# - recalage des PK secteurs sur un nœud du réseau routable # - 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 $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 # 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 # 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 ;" $PSQL -h $DB_HOST -U $DB_USER -c "TRUNCATE TABLE phase_2_trace_pgr ;"
@ -129,19 +147,51 @@ ORDER BY pk.id ;" \
done 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 # et on exporte en geojson pour umap
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo " Exports"
echo ""
echo " exports geojson"
echo ""
rm data/phase_2_pk_secteur.geojson 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 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 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 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 # les fichiers sont ensuite tout de suite visible dans umap
echo " fait"
echo ""
# on exporte un json de synthèse des KM par secteur # on exporte un json de synthèse des KM par secteur
# TODO # TODO
echo ""
echo ""
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo " F I N"
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo ""