From 613db460dd6c6fd0660c14fa1efc4cce8508223e Mon Sep 17 00:00:00 2001 From: MaelREBOUX Date: Sun, 3 Oct 2021 09:47:20 +0200 Subject: [PATCH] =?UTF-8?q?mise=20=C3=A0=20jour=20par=20mill=C3=A9sime=20+?= =?UTF-8?q?=20secteur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts_v2/create_osm_roads.sh | 39 +++-- scripts_v2/create_osm_roads_pgr.sh | 52 ------- scripts_v2/phase_2.sh | 6 +- scripts_v2/phase_2_routing.sh | 186 ------------------------ scripts_v2/phase_2_routing_compute.sh | 146 +++++++++++++++++++ scripts_v2/phase_2_routing_prepare.sh | 106 ++++++++++++++ scripts_v2/sql/create_tables.sql | 11 +- scripts_v2/sql/update_osm_roads_pgr.sql | 43 +++--- scripts_v2/update_osm_roads_pgr.sh | 123 ++++++++++++---- 9 files changed, 406 insertions(+), 306 deletions(-) delete mode 100755 scripts_v2/create_osm_roads_pgr.sh delete mode 100755 scripts_v2/phase_2_routing.sh create mode 100755 scripts_v2/phase_2_routing_compute.sh create mode 100755 scripts_v2/phase_2_routing_prepare.sh diff --git a/scripts_v2/create_osm_roads.sh b/scripts_v2/create_osm_roads.sh index 33ae698..0a93878 100755 --- a/scripts_v2/create_osm_roads.sh +++ b/scripts_v2/create_osm_roads.sh @@ -16,18 +16,30 @@ fi . config.sh -echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" -echo " Création de la couche osm_roads" -echo "" -echo "" +# contrôle si argument secteur_id +if [ -z "$2" ] + then + echo "Pas de secteur_id en argument --> stop" + exit 1 +fi +secteur_id=$2 +# on calcule le code du secteur suivant +# ex : 200 -> 300 +secteur_id_next="$(( ${secteur_id:0:1} + 1 ))00" + + +echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" +echo " Création de la couche osm_roads pour le secteur $secteur_id -> $secteur_id_next" +echo "" +echo "" echo "" echo "import phase_1_trace dans la base OSM" echo "" # 1. export du tracé phase 1 depuis la base redadeg -pg_dump --dbname=postgresql://$DB_USER:$DB_PASSWD@$HOST_DB_redadeg/$DB_NAME \ +pg_dump --dbname=postgresql://$DB_USER:$DB_PASSWD@$DB_HOST:$DB_PORT/$DB_NAME \ --format=p --no-owner --section=pre-data --section=data --no-privileges --no-tablespaces --no-unlogged-table-data --no-comments \ --table phase_1_trace \ --file $rep_data/redadeg_trace.sql @@ -53,7 +65,7 @@ PGPASSWORD=$osmDBPassword $PSQL -h $osmDBHost -p $osmDBPort -U $osmDBUser -d $os PGPASSWORD=$osmDBPassword $PSQL -h $osmDBHost -p $osmDBPort -U $osmDBUser -d $osmDBName -c " CREATE TABLE osm_roads_$millesime ( - uid bigint NOT NULL, + secteur_id integer NOT NULL, osm_id bigint, highway text, type text, @@ -62,7 +74,6 @@ CREATE TABLE osm_roads_$millesime name_fr text, name_br text, the_geom geometry, - CONSTRAINT osm_roads_pkey_$millesime PRIMARY KEY (uid), CONSTRAINT enforce_geotype_the_geom CHECK (geometrytype(the_geom) = 'LINESTRING'::text OR geometrytype(the_geom) = 'MULTILINESTRING'::text), CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = 2154) );" @@ -73,18 +84,20 @@ echo "" echo " extraction du filaire de voies OSM le long du tracé fourni" echo "" -PGPASSWORD=$osmDBPassword $PSQL -h $osmDBHost -p $osmDBPort -U $osmDBUser -d $osmDBName -c "WITH trace_buffer AS ( +PGPASSWORD=$osmDBPassword $PSQL -h $osmDBHost -p $osmDBPort -U $osmDBUser -d $osmDBName -c " +WITH trace_buffer AS ( SELECT secteur_id, ST_Union(ST_Buffer(the_geom, 25, 'quad_segs=2')) AS the_geom FROM phase_1_trace_$millesime + WHERE secteur_id >= $secteur_id AND secteur_id < $secteur_id_next GROUP BY secteur_id ORDER BY secteur_id ) INSERT INTO osm_roads_$millesime ( SELECT - row_number() over() as id, + t.secteur_id, osm_id, highway, CASE @@ -112,19 +125,19 @@ echo "" # 4. export de osm_roads depuis la base OSM -echo "transfert de osm_roads_$millesime depuis la base OSM vers la base redadeg" +echo "transfert de osm_roads_$millesime + secteur $secteur_id depuis la base OSM vers la base redadeg" echo "" -pg_dump --dbname=postgresql://$osmDBUser:$osmDBPassword@$osmDBHost/$osmDBName \ +pg_dump --dbname=postgresql://$osmDBUser:$osmDBPassword@$osmDBHost:$osmDBPort/$osmDBName \ --format=p --no-owner --section=pre-data --section=data --no-privileges --no-tablespaces --no-unlogged-table-data --no-comments \ --table osm_roads_$millesime \ --file $rep_data/osm_roads.sql # 5. import dans la base redadeg -PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "DROP TABLE IF EXISTS osm_roads;" +PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "DROP TABLE IF EXISTS osm_roads_import;" PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME < $rep_data/osm_roads.sql -PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "ALTER TABLE osm_roads_$millesime RENAME TO osm_roads ;" +PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "ALTER TABLE osm_roads_$millesime RENAME TO osm_roads_import ;" echo "" echo "fait" diff --git a/scripts_v2/create_osm_roads_pgr.sh b/scripts_v2/create_osm_roads_pgr.sh deleted file mode 100755 index e94fe5f..0000000 --- a/scripts_v2/create_osm_roads_pgr.sh +++ /dev/null @@ -1,52 +0,0 @@ -#! /bin/bash - -# exit dès que qqch se passe mal -set -e -# sortir si "unbound variable" -#set -u - - -if [ -z "$1" ] - then - echo "Pas de millésime en argument --> stop" - exit 1 -fi - -# lecture du fichier de configuration -. config.sh - - -echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" -echo " Création de la couche osm_roads_pgr" -echo "" -echo "" - -# suppose le le .pgpass est correctement configuré pour le compte qui lance ce script - - -echo ">> suppression de la topologie existante" -echo "" -PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "SELECT DropTopology('osm_roads_topo') ;" || true -echo "" - -# création d'un schéma qui va accueillir le réseau topologique de la couche osm_roads -echo ">> création d'une nouvelle topologie" -echo "" -PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "SELECT topology.CreateTopology('osm_roads_topo', 2154);" - - -echo ">> ajout d'un nouvel attribut sur la table osm_roads" -echo "" -PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "SELECT topology.AddTopoGeometryColumn('osm_roads_topo', 'public', 'osm_roads', 'topo_geom', 'LINESTRING');" -echo "" -echo "fait" -echo "" - -echo "" -echo "" -echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" -echo " F I N " -echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" -echo "" -echo ">>>> exécuter update_osm_roads_pgr.sh " -echo "" diff --git a/scripts_v2/phase_2.sh b/scripts_v2/phase_2.sh index 52c9225..defa581 100755 --- a/scripts_v2/phase_2.sh +++ b/scripts_v2/phase_2.sh @@ -26,7 +26,7 @@ echo "" echo " récupération des fichiers geojson depuis la carte umap" -curl -sS https://umap.openstreetmap.fr/fr/datalayer/1903900/ > $rep_data/phase_2_umap_pk_secteur.geojson +curl -sSk https://umap.openstreetmap.fr/fr/datalayer/1903900/ > $rep_data/phase_2_umap_pk_secteur.geojson echo " fait" echo "" @@ -56,7 +56,7 @@ PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c " echo "" echo " récupération des fichiers geojson depuis la carte umap" -curl -sS https://umap.openstreetmap.fr/fr/datalayer/1899462/ > $rep_data/phase_2_umap_points_nettoyage.geojson +curl -sSk https://umap.openstreetmap.fr/fr/datalayer/1899462/ > $rep_data/phase_2_umap_points_nettoyage.geojson echo " fait" echo "" @@ -73,7 +73,7 @@ echo "" # on appelle le script qui s'occupe du calcul du routage -. phase_2_routing.sh +#. phase_2_routing.sh echo "" diff --git a/scripts_v2/phase_2_routing.sh b/scripts_v2/phase_2_routing.sh deleted file mode 100755 index 9cdc86b..0000000 --- a/scripts_v2/phase_2_routing.sh +++ /dev/null @@ -1,186 +0,0 @@ -#! /bin/bash - -# exit dès que qqch se passe mal -set -e -# sortir si "unbound variable" -#set -u - - -if [ -z "$1" ] - then - echo "Pas de millésime en argument --> stop" - exit 1 -fi - -# lecture du fichier de configuration -. config.sh - - - -# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -# ici on va calculer un itinéraire pour chaque secteur -# en utilisant les PK de début (ou fin) de chaque secteur - -# https://www.manniwood.com/postgresql_and_bash_stuff/index.html - - -echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" -echo " Calcul des itinéraires (pgrouting)" -echo "" - - -echo "patch de la couche osm_roads_pgr pour les cas particuliers" -PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME < sql/patch_osm_roads_pgr.sql -echo " fait" -echo "" - -# on commence par vider la table qui contiendra les calculs d'itinéraires -echo "vidage de la couche de routage" -PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "TRUNCATE TABLE phase_2_trace_pgr ;" -echo " fait" -echo "" - -# ensuite : on supprime les tronçons ciblés par la couche de points de nettoyage -# AVANT de calculer les itinéraires -echo "nettoyage de la couche de routage par les points ciblés" -PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "UPDATE osm_roads_pgr SET cost = 1000000, reverse_cost = 1000000 WHERE id IN (SELECT r.id FROM osm_roads_pgr r JOIN phase_2_point_nettoyage p ON r.id = p.edge_id);" -echo " fait" -echo "" - - -# on fait la requête qui va donner une liste de PK de secteurs -# et on calcule un itinéraire entre le PK de début et le PK suivant - -# on va utiliser un compteur pour pouvoir sauter un sous-secteur à un autre -counter=1 -# autre variables de contrôle -longueur_totale=0 -longueur_inseree=0 - - -PGPASSWORD=$DB_PASSWD $PSQL -X -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME \ - -c "SELECT pk.id, s.id AS secteur_id, pk.pgr_node_id, replace(s.nom_fr,' ','') AS nom_fr, replace(s.nom_br,' ','') AS nom_br, replace(pk.name,' ','_') AS name -FROM phase_2_pk_secteur pk JOIN secteur s ON pk.secteur_id = s.id -ORDER BY s.id ;" \ - --single-transaction \ - --set AUTOCOMMIT=off \ - --set ON_ERROR_STOP=on \ - --no-align \ - -t \ - --field-separator ' ' \ - --quiet | while read -a Record ; do - - # ici commence la boucle sur les PK de secteurs - echo "----------------------------" - - #IFS="|" pour forcer un délimiteur mais ne fonctionne pas : les espaces sont compris comme des séparateurs - # alors la requête supprime les espaces. TODO - - # le premier PK = PK de début - pk_id=${Record[0]} - secteur_id=${Record[1]} - pk_id_start=${Record[2]} - secteur_nom_fr="${Record[3]}" - secteur_nom_br="${Record[4]}" - troncon_name=${Record[5]} - - echo " $secteur_id | $secteur_nom_fr / $secteur_nom_br" - echo " tronçon : $troncon_name" - echo " PK ID = $pk_id" - echo " start node = $pk_id_start" - - # on fait une requête pour récupérer l'id du nœud de routage de fin - # ce nœud = le PK de début du secteur suivant - read pk_id_end <<< $(PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME --no-align -t --quiet \ - -c "SELECT pgr_node_id FROM phase_2_pk_secteur ORDER BY id OFFSET $counter LIMIT 1 ;" ) - - echo " end node = $pk_id_end" - - - # on teste si on récupère qqch sinon ça veurt dire qu'on a pas de nœud de fin donc impossible de calculer un itinéraire - if [[ -n "$pk_id_end" ]]; - then - echo " calcul de l'itinéraire" - - PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c \ - "INSERT INTO phase_2_trace_pgr - SELECT - $secteur_id AS secteur_id, - -- info de routage - a.path_seq, - a.node, - a.cost, - a.agg_cost, - -- infos OSM - b.osm_id, - b.highway, - b.\"type\", - b.oneway, - b.ref, - CASE - WHEN b.name_fr IS NULL AND b.ref IS NOT NULL THEN b.ref - ELSE b.name_fr - END AS name_fr, - CASE - WHEN b.name_br IS NULL AND b.name_fr IS NULL AND b.ref IS NOT NULL THEN b.ref - WHEN b.name_br IS NULL AND b.name_fr IS NOT NULL THEN '# da dreiñ e brezhoneg #' - ELSE b.name_br - END AS name_br, - b.the_geom - FROM pgr_dijkstra( - 'SELECT id, source, target, cost, reverse_cost FROM osm_roads_pgr', $pk_id_start, $pk_id_end) as a - JOIN osm_roads_pgr b ON a.edge = b.id ;" >> /dev/null - - # on fait une requête pour voir la longueur insérée - # en fait : la longueur totale - la longueur totale lors du précédent calcul - read longueur_base <<< $(PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME --no-align -t --quiet \ - -c "SELECT trunc(SUM(ST_Length(the_geom))/1000) as longueur_totale FROM phase_2_trace_pgr ;" ) - longueur_inseree=$(($longueur_base-$longueur_totale)) - longueur_totale=$longueur_base - - # une alerte si 0 km insérés - if [ $longueur_inseree -eq 0 ] ; - then - echo "" - echo " E R R E U R !!!!!!!!" - echo "" - else - echo " fait : $longueur_inseree km (total = $longueur_totale km)" - fi - - else - echo "" - echo " E R R E U R !!!!!!!!" - echo " impossible de calculer un itinéraire pour ce secteur" - echo "" - fi - - - # fin de la boucle - # on incrémente le compteur - ((counter++)) - echo "" - -done - -# ménage pour performances -PGPASSWORD=$DB_PASSWD $PSQL -X -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME \ - -c "VACUUM FULL phase_2_trace_pgr ;" - -echo " Calcul des itinéraires terminé" -echo "" - - -echo " Export GeoJSON pour umap" -echo "" -rm -f $rep_data/phase_2_trace_pgr.geojson -ogr2ogr -f "GeoJSON" $rep_data/phase_2_trace_pgr.geojson PG:"host=$DB_HOST port=$DB_PORT user=$DB_USER password=$DB_PASSWD dbname=$DB_NAME" phase_2_trace_pgr_4326 -echo " fait" - - -echo "" -echo "" -echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" -echo " F I N traitements phase 2 : calcul des itinéraires" -echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" -echo "" diff --git a/scripts_v2/phase_2_routing_compute.sh b/scripts_v2/phase_2_routing_compute.sh new file mode 100755 index 0000000..c491494 --- /dev/null +++ b/scripts_v2/phase_2_routing_compute.sh @@ -0,0 +1,146 @@ +#! /bin/bash + +# exit dès que qqch se passe mal +set -e +# sortir si "unbound variable" +#set -u + + +if [ -z "$1" ] + then + echo "Pas de millésime en argument --> stop" + exit 1 +fi + +# lecture du fichier de configuration +. config.sh + + +# contrôle si argument secteur_id +if [ -z "$2" ] + then + echo "Pas de secteur_id en argument --> stop" + exit 1 +fi + +secteur_id=$2 +# on calcule le code du secteur suivant +# ex : 200 -> 300 +secteur_id_next="$(( ${secteur_id:0:1} + 1 ))00" + + + +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# ici on va calculer un itinéraire pour chaque secteur +# en utilisant les PK de début (ou fin) de chaque secteur + +# https://www.manniwood.com/postgresql_and_bash_stuff/index.html + + +echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" +echo " Calcul de l'itinéraires pour le secteur $secteur_id" +echo "" + + +# on commence par vider la table qui contiendra les calculs d'itinéraires +echo " vidage de la couche de routage" +PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "DELETE FROM phase_2_trace_pgr WHERE secteur_id = $secteur_id ;" +echo " fait" +echo "" + + +# on cherche le node_id du PK de début et le node_id du PK de fin +read pk_start_node <<< $(PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME --no-align -t --quiet -c \ +"SELECT pk.pgr_node_id +FROM phase_2_pk_secteur pk JOIN secteur s ON pk.secteur_id = s.id +WHERE secteur_id IN ($secteur_id,$secteur_id_next) +ORDER BY s.id +LIMIT 1 OFFSET 0" ) + +read pk_end_node <<< $(PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME --no-align -t --quiet -c \ +"SELECT pk.pgr_node_id +FROM phase_2_pk_secteur pk JOIN secteur s ON pk.secteur_id = s.id +WHERE secteur_id IN ($secteur_id,$secteur_id_next) +ORDER BY s.id +LIMIT 1 OFFSET 1" ) + + + +echo " calcul d'un itinéraire entre les nœuds $pk_start_node et $pk_end_node" + + +PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c \ +"INSERT INTO phase_2_trace_pgr +SELECT + $secteur_id AS secteur_id, + -- info de routage + a.path_seq, + a.node, + a.cost, + a.agg_cost, + -- infos OSM + b.osm_id, + b.highway, + b.\"type\", + b.oneway, + b.ref, + CASE + WHEN b.name_fr IS NULL AND b.ref IS NOT NULL THEN b.ref +ELSE b.name_fr + END AS name_fr, + CASE + WHEN b.name_br IS NULL AND b.name_fr IS NULL AND b.ref IS NOT NULL THEN b.ref +WHEN b.name_br IS NULL AND b.name_fr IS NOT NULL THEN '# da dreiñ e brezhoneg #' +ELSE b.name_br + END AS name_br, + b.the_geom +FROM pgr_dijkstra( + 'SELECT id, source, target, cost, reverse_cost FROM osm_roads_pgr', $pk_start_node, $pk_end_node) as a +JOIN osm_roads_pgr b ON a.edge = b.id ;" >> /dev/null + + + +# on fait une requête pour voir la longueur insérée +# en fait : la longueur totale - la longueur totale lors du précédent calcul +read longueur_base <<< $(PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME --no-align -t --quiet \ + -c "SELECT trunc(SUM(ST_Length(the_geom))/1000) as longueur_totale FROM phase_2_trace_pgr ;" ) +longueur_inseree=$(($longueur_base-$longueur_totale)) +longueur_totale=$longueur_base + +# une alerte si 0 km insérés +if [ $longueur_inseree -eq 0 ] ; +then + echo "" + echo " E R R E U R !!!!!!!!" + echo "" + exit 0 +else + echo " fait : $longueur_inseree km (total = $longueur_totale km)" +fi + + + + + +# ménage pour performances +PGPASSWORD=$DB_PASSWD $PSQL -X -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME \ + -c "VACUUM FULL phase_2_trace_pgr ;" + +echo " Calcul des itinéraires terminé" +echo "" + + +echo " Export GeoJSON pour umap" +echo "" +rm -f $rep_data/phase_2_trace_pgr.geojson +ogr2ogr -f "GeoJSON" $rep_data/phase_2_trace_pgr.geojson PG:"host=$DB_HOST port=$DB_PORT user=$DB_USER password=$DB_PASSWD dbname=$DB_NAME" phase_2_trace_pgr_4326 +echo " fait" + + + +echo "" +echo "" +echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" +echo " F I N calcul de l'itinéraire pour le secteur $secteur_id" +echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" +echo "" diff --git a/scripts_v2/phase_2_routing_prepare.sh b/scripts_v2/phase_2_routing_prepare.sh new file mode 100755 index 0000000..ae85656 --- /dev/null +++ b/scripts_v2/phase_2_routing_prepare.sh @@ -0,0 +1,106 @@ +#! /bin/bash + +# exit dès que qqch se passe mal +set -e +# sortir si "unbound variable" +#set -u + + +if [ -z "$1" ] + then + echo "Pas de millésime en argument --> stop" + exit 1 +fi + +# lecture du fichier de configuration +. config.sh + + +# contrôle si argument secteur_id +if [ -z "$2" ] + then + echo "Pas de secteur_id en argument --> stop" + exit 1 +fi + +secteur_id=$2 +# on calcule le code du secteur suivant +# ex : 200 -> 300 +secteur_id_next="$(( ${secteur_id:0:1} + 1 ))00" + + + +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# ici on va calculer un itinéraire pour chaque secteur +# en utilisant les PK de début (ou fin) de chaque secteur + +# https://www.manniwood.com/postgresql_and_bash_stuff/index.html + + +echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" +echo " Patch de la couche osm_roads_pgr pour les cas particuliers" +echo "" + + +echo " suppression des objets de osm_roads_pgr qui intersectent avec les zones de boucles" +PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c " +DELETE FROM osm_roads_pgr WHERE id IN +( + SELECT a.id + FROM osm_roads_pgr a, osm_roads_pgr_patch_mask m + WHERE + a.secteur_id = $secteur_id + AND ST_INTERSECTS(a.the_geom, m.the_geom) +);" +echo " fait" +echo "" + + +echo " collage des objets de la couche osm_roads_pgr_patch à la place des objets supprimés" +PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c " +INSERT INTO osm_roads_pgr + SELECT + nextval('osm_roads_pgr_id_seq') AS uid, + $secteur_id AS secteur_id, + a.osm_id, a.highway, a.type, a.oneway, a.ref, a.name_fr, a.name_br, + NULL, NULL, NULL, NULL, + a.the_geom + FROM osm_roads_pgr_patch a, osm_roads_pgr_patch_mask m + WHERE ST_INTERSECTS(a.the_geom, m.the_geom); +" +echo " fait" +echo "" + + +echo " calcul des 2 attributs de coût (= longueur)" +PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c " +UPDATE osm_roads_pgr +SET cost = st_length(the_geom), reverse_cost = st_length(the_geom) +WHERE secteur_id = $secteur_id ;" + +echo " recrée des nœuds uniquement sur les zones de patch" +PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "SELECT pgr_nodeNetwork('osm_roads_pgr', 0.001, rows_where := 'secteur_id = $secteur_id');" + +echo " recalcul la topologie pgRouting uniquement sur les zones de patch" +PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "SELECT pgr_createTopology('osm_roads_pgr', 0.001, rows_where := 'secteur_id = $secteur_id', clean := false);" + + +# ensuite : on met un coup ÉNORME sur les tronçons ciblés par la couche de points de nettoyage +# AVANT de calculer les itinéraires +echo " nettoyage de la couche de routage par les points ciblés" +PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c " +UPDATE osm_roads_pgr SET cost = 1000000, reverse_cost = 1000000 +WHERE + secteur_id = $secteur_id + AND id IN (SELECT r.id FROM osm_roads_pgr r JOIN phase_2_point_nettoyage p ON r.id = p.edge_id);" +echo " fait" +echo "" + + + +echo "" +echo "" +echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" +echo " F I N préparation pour le calcul d'itiniéraire pour le secteur $secteur_id" +echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" +echo "" diff --git a/scripts_v2/sql/create_tables.sql b/scripts_v2/sql/create_tables.sql index d185aa2..3fc9d0d 100644 --- a/scripts_v2/sql/create_tables.sql +++ b/scripts_v2/sql/create_tables.sql @@ -275,7 +275,7 @@ ALTER TABLE osm_municipalities OWNER to redadeg; DROP TABLE IF EXISTS osm_roads CASCADE ; CREATE TABLE osm_roads ( - uid bigint NOT NULL, + secteur_id integer, osm_id bigint, highway text, type text, @@ -284,19 +284,22 @@ CREATE TABLE osm_roads name_fr text, name_br text, the_geom geometry, - CONSTRAINT osm_roads_pkey PRIMARY KEY (uid), CONSTRAINT enforce_geotype_the_geom CHECK (geometrytype(the_geom) = 'LINESTRING'::text OR geometrytype(the_geom) = 'MULTILINESTRING'::text), CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = 2154) ); CREATE INDEX osm_roads_geom_idx ON osm_roads USING gist(the_geom); ALTER TABLE osm_roads OWNER to redadeg; +-- cette couche supporte une topologie +SELECT topology.CreateTopology('osm_roads_topo', 2154); +SELECT topology.AddTopoGeometryColumn('osm_roads_topo', 'public', 'osm_roads', 'topo_geom', 'LINESTRING'); -- la couche en version routable DROP TABLE IF EXISTS osm_roads_pgr CASCADE ; CREATE TABLE osm_roads_pgr ( - id bigint, + id serial, + secteur_id integer, osm_id bigint, highway text, type text, @@ -325,6 +328,7 @@ DROP TABLE IF EXISTS osm_roads_pgr_patch_mask CASCADE ; CREATE TABLE osm_roads_pgr_patch_mask ( id serial, + secteur_id integer, name text, the_geom geometry, CONSTRAINT osm_roads_pgr_patch_mask_pkid PRIMARY KEY (id), @@ -340,6 +344,7 @@ DROP TABLE IF EXISTS osm_roads_pgr_patch CASCADE ; CREATE TABLE osm_roads_pgr_patch ( id serial, + secteur_id integer, osm_id bigint, highway text, type text, diff --git a/scripts_v2/sql/update_osm_roads_pgr.sql b/scripts_v2/sql/update_osm_roads_pgr.sql index 800213b..285fcaa 100755 --- a/scripts_v2/sql/update_osm_roads_pgr.sql +++ b/scripts_v2/sql/update_osm_roads_pgr.sql @@ -24,25 +24,30 @@ ALTER SEQUENCE public.osm_roads_pgr_noded_id_seq RESTART WITH 1 ; -- on remplit la couche de lignes 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 +( + SELECT + o.secteur_id, + 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 + secteur_id = 100 + AND e.edge_id = rel.element_id + AND rel.topogeo_id = (o.topo_geom).id ); -- calcul des 2 attributs de coût (= longueur) diff --git a/scripts_v2/update_osm_roads_pgr.sh b/scripts_v2/update_osm_roads_pgr.sh index 10ea44a..735dc97 100755 --- a/scripts_v2/update_osm_roads_pgr.sh +++ b/scripts_v2/update_osm_roads_pgr.sh @@ -16,60 +16,123 @@ fi . config.sh +# contrôle si argument secteur_id +if [ -z "$2" ] + then + echo "Pas de secteur_id en argument --> stop" + exit 1 +fi + +secteur_id=$2 +# on calcule le code du secteur suivant +# ex : 200 -> 300 +secteur_id_next="$(( ${secteur_id:0:1} + 1 ))00" + + echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" -echo " Mise à jour des couches de routage" +echo " Mise à jour des couches de routage pour le secteur $secteur_id -> $secteur_id_next" echo "" -echo " prend 15-20 min" echo "" -# la couche osm_roads vient d'être mise à jour ou recrée +# # la couche osm_roads vient d'être mise à jour ou recrée -# on efface la topologie existante -PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "SELECT DropTopology('osm_roads_topo') ;" +# # on efface la topologie existante +# PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "SELECT DropTopology('osm_roads_topo') ;" -# création d'un schéma qui va accueillir le réseau topologique de la couche osm_roads -PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "SELECT topology.CreateTopology('osm_roads_topo', 2154);" +# # création d'un schéma qui va accueillir le réseau topologique de la couche osm_roads +# PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "SELECT topology.CreateTopology('osm_roads_topo', 2154);" -# ajout d'un nouvel attribut sur la table osm_roads -PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "SELECT topology.AddTopoGeometryColumn('osm_roads_topo', 'public', 'osm_roads', 'topo_geom', 'LINESTRING');" +# # ajout d'un nouvel attribut sur la table osm_roads +# PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "SELECT topology.AddTopoGeometryColumn('osm_roads_topo', 'public', 'osm_roads', 'topo_geom', 'LINESTRING');" -# on a besoin du layer_id -# au cas où ça change : on le récupère par requête -PGPASSWORD=$DB_PASSWD $PSQL -X -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME \ - -c "SELECT layer_id FROM topology.layer WHERE table_name = 'osm_roads' ;" \ - --single-transaction \ - --set AUTOCOMMIT=off \ - --set ON_ERROR_STOP=on \ - --no-align \ - -t \ - --field-separator ' ' \ - --quiet | while read -a Record ; do +# # on a besoin du layer_id +# # au cas où ça change : on le récupère par requête +# PGPASSWORD=$DB_PASSWD $PSQL -X -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME \ +# -c "SELECT layer_id FROM topology.layer WHERE table_name = 'osm_roads' ;" \ +# --single-transaction \ +# --set AUTOCOMMIT=off \ +# --set ON_ERROR_STOP=on \ +# --no-align \ +# -t \ +# --field-separator ' ' \ +# --quiet | while read -a Record ; do - layer_id=${Record[0]} +# layer_id=${Record[0]} - echo "" - echo "layer_id de osm_roads = $layer_id" - echo "" +# echo "" +# echo "layer_id de osm_roads = $layer_id" +# echo "" -done +# done # sauf que je n'arrive pas à sortir cette valeur du subshell créé par la boucle do /!\ # donc je remet ici à la main. A corriger… TODO layer_id=1 +echo " suppression des données du secteur à mettre à jour" +PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "DELETE FROM osm_roads WHERE secteur_id >= $secteur_id AND secteur_id < $secteur_id_next ;" +PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "DELETE FROM osm_roads_pgr WHERE secteur_id >= $secteur_id AND secteur_id < $secteur_id_next ;" +echo " fait" +echo "" + + +echo " import du filaire de voirie à jour dans la couche topologique (osm_roads)" + +# import des données +PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c " +INSERT INTO osm_roads + SELECT secteur_id, osm_id, highway, "type", oneway, "ref", name_fr, name_br, the_geom, NULL AS topo_geom + FROM osm_roads_import" + # on calcule le graphe topologique en remplissant le nouvel attribut géométrique +# pour le secteur en cours de mise à jour uniquement # le 1er chiffre est l'identifiant du layer dans la table topology.layer # le 2e chiffre est la tolérance en mètres -echo ">> calcul du graphe topologique" -PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "UPDATE osm_roads SET topo_geom = topology.toTopoGeom(the_geom, 'osm_roads_topo', $layer_id, 0.00001);" -echo "" +PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "UPDATE osm_roads SET topo_geom = topology.toTopoGeom(the_geom, 'osm_roads_topo', $layer_id, 0.00001) WHERE secteur_id >= $secteur_id AND secteur_id < $secteur_id_next ;" + +echo "fait" +echo "" + +#echo ">> maj de la couche osm_roads_pgr qui sert au routage depuis la topologie" +#PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME < sql/update_osm_roads_pgr.sql + + +echo " remplissage de la couche de routage (osm_roads_pgr)" +PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c " +INSERT INTO osm_roads_pgr +( + SELECT + nextval('osm_roads_pgr_id_seq'), + o.secteur_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 + o.secteur_id >= $secteur_id AND o.secteur_id < $secteur_id_next + AND e.edge_id = rel.element_id + AND rel.topogeo_id = (o.topo_geom).id +);" + +# calcul des 2 attributs de coût (= longueur) +PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "UPDATE osm_roads_pgr SET cost = st_length(the_geom), reverse_cost = st_length(the_geom) WHERE secteur_id >= $secteur_id AND secteur_id < $secteur_id_next ;" + echo "fait" echo "" -echo ">> maj de la couche osm_roads_pgr qui sert au routage depuis la topologie" -PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME < sql/update_osm_roads_pgr.sql echo ""