From c437d848292ab5c0064f35b7dcd8a1bb9180d966 Mon Sep 17 00:00:00 2001 From: MaelReboux Date: Wed, 1 May 2019 14:53:48 +0200 Subject: [PATCH] couche phase_2_trace_secteur --- scripts/create_tables.sql | 28 ++++++++ scripts/traitements_phase_2.2.sql | 116 ++++++------------------------ scripts/traitements_phase_2.sh | 58 +++++++++++++-- 3 files changed, 104 insertions(+), 98 deletions(-) diff --git a/scripts/create_tables.sql b/scripts/create_tables.sql index 50aa290..717795f 100644 --- a/scripts/create_tables.sql +++ b/scripts/create_tables.sql @@ -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 ; diff --git a/scripts/traitements_phase_2.2.sql b/scripts/traitements_phase_2.2.sql index 1baf802..514057b 100644 --- a/scripts/traitements_phase_2.2.sql +++ b/scripts/traitements_phase_2.2.sql @@ -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 +-- 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 + 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 ; - --- 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 - -- 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 ; - - - -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 ; - +*/ diff --git a/scripts/traitements_phase_2.sh b/scripts/traitements_phase_2.sh index c5cf6d8..22946fb 100755 --- a/scripts/traitements_phase_2.sh +++ b/scripts/traitements_phase_2.sh @@ -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 "" -# et on exporte en geojson pour umap +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# 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 ""