mise à jour par millésime + secteur

This commit is contained in:
MaelREBOUX 2021-10-03 09:47:20 +02:00
parent 786ef692b0
commit 613db460dd
9 changed files with 406 additions and 306 deletions

View file

@ -16,18 +16,30 @@ fi
. config.sh . config.sh
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" # contrôle si argument secteur_id
echo " Création de la couche osm_roads" if [ -z "$2" ]
echo "" then
echo "" 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 ""
echo "import phase_1_trace dans la base OSM" echo "import phase_1_trace dans la base OSM"
echo "" echo ""
# 1. export du tracé phase 1 depuis la base redadeg # 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 \ --format=p --no-owner --section=pre-data --section=data --no-privileges --no-tablespaces --no-unlogged-table-data --no-comments \
--table phase_1_trace \ --table phase_1_trace \
--file $rep_data/redadeg_trace.sql --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 " PGPASSWORD=$osmDBPassword $PSQL -h $osmDBHost -p $osmDBPort -U $osmDBUser -d $osmDBName -c "
CREATE TABLE osm_roads_$millesime CREATE TABLE osm_roads_$millesime
( (
uid bigint NOT NULL, secteur_id integer NOT NULL,
osm_id bigint, osm_id bigint,
highway text, highway text,
type text, type text,
@ -62,7 +74,6 @@ CREATE TABLE osm_roads_$millesime
name_fr text, name_fr text,
name_br text, name_br text,
the_geom geometry, 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_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) 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 " extraction du filaire de voies OSM le long du tracé fourni"
echo "" 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 SELECT
secteur_id, secteur_id,
ST_Union(ST_Buffer(the_geom, 25, 'quad_segs=2')) AS the_geom ST_Union(ST_Buffer(the_geom, 25, 'quad_segs=2')) AS the_geom
FROM phase_1_trace_$millesime FROM phase_1_trace_$millesime
WHERE secteur_id >= $secteur_id AND secteur_id < $secteur_id_next
GROUP BY secteur_id GROUP BY secteur_id
ORDER BY secteur_id ORDER BY secteur_id
) )
INSERT INTO osm_roads_$millesime INSERT INTO osm_roads_$millesime
( (
SELECT SELECT
row_number() over() as id, t.secteur_id,
osm_id, osm_id,
highway, highway,
CASE CASE
@ -112,19 +125,19 @@ echo ""
# 4. export de osm_roads depuis la base OSM # 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 "" 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 \ --format=p --no-owner --section=pre-data --section=data --no-privileges --no-tablespaces --no-unlogged-table-data --no-comments \
--table osm_roads_$millesime \ --table osm_roads_$millesime \
--file $rep_data/osm_roads.sql --file $rep_data/osm_roads.sql
# 5. import dans la base redadeg # 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 < $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 ""
echo "fait" echo "fait"

View file

@ -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 ""

View file

@ -26,7 +26,7 @@ echo ""
echo " récupération des fichiers geojson depuis la carte umap" 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 " fait"
echo "" echo ""
@ -56,7 +56,7 @@ PGPASSWORD=$DB_PASSWD $PSQL -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "
echo "" echo ""
echo " récupération des fichiers geojson depuis la carte umap" 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 " fait"
echo "" echo ""
@ -73,7 +73,7 @@ echo ""
# on appelle le script qui s'occupe du calcul du routage # on appelle le script qui s'occupe du calcul du routage
. phase_2_routing.sh #. phase_2_routing.sh
echo "" echo ""

View file

@ -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 ""

View file

@ -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 ""

View file

@ -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 ""

View file

@ -275,7 +275,7 @@ ALTER TABLE osm_municipalities OWNER to redadeg;
DROP TABLE IF EXISTS osm_roads CASCADE ; DROP TABLE IF EXISTS osm_roads CASCADE ;
CREATE TABLE osm_roads CREATE TABLE osm_roads
( (
uid bigint NOT NULL, secteur_id integer,
osm_id bigint, osm_id bigint,
highway text, highway text,
type text, type text,
@ -284,19 +284,22 @@ CREATE TABLE osm_roads
name_fr text, name_fr text,
name_br text, name_br text,
the_geom geometry, 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_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) CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = 2154)
); );
CREATE INDEX osm_roads_geom_idx ON osm_roads USING gist(the_geom); CREATE INDEX osm_roads_geom_idx ON osm_roads USING gist(the_geom);
ALTER TABLE osm_roads OWNER to redadeg; 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 -- la couche en version routable
DROP TABLE IF EXISTS osm_roads_pgr CASCADE ; DROP TABLE IF EXISTS osm_roads_pgr CASCADE ;
CREATE TABLE osm_roads_pgr CREATE TABLE osm_roads_pgr
( (
id bigint, id serial,
secteur_id integer,
osm_id bigint, osm_id bigint,
highway text, highway text,
type text, type text,
@ -325,6 +328,7 @@ DROP TABLE IF EXISTS osm_roads_pgr_patch_mask CASCADE ;
CREATE TABLE osm_roads_pgr_patch_mask CREATE TABLE osm_roads_pgr_patch_mask
( (
id serial, id serial,
secteur_id integer,
name text, name text,
the_geom geometry, the_geom geometry,
CONSTRAINT osm_roads_pgr_patch_mask_pkid PRIMARY KEY (id), 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 CREATE TABLE osm_roads_pgr_patch
( (
id serial, id serial,
secteur_id integer,
osm_id bigint, osm_id bigint,
highway text, highway text,
type text, type text,

View file

@ -24,7 +24,9 @@ ALTER SEQUENCE public.osm_roads_pgr_noded_id_seq RESTART WITH 1 ;
-- on remplit la couche de lignes -- on remplit la couche de lignes
INSERT INTO osm_roads_pgr INSERT INTO osm_roads_pgr
( SELECT (
SELECT
o.secteur_id,
row_number() over() as id, row_number() over() as id,
o.osm_id, o.osm_id,
o.highway, o.highway,
@ -38,10 +40,13 @@ INSERT INTO osm_roads_pgr
NULL as cost, NULL as cost,
NULL as reverse_cost, NULL as reverse_cost,
e.geom as the_geom e.geom as the_geom
FROM osm_roads_topo.edge e, FROM
osm_roads_topo.edge e,
osm_roads_topo.relation rel, osm_roads_topo.relation rel,
osm_roads o osm_roads o
WHERE e.edge_id = rel.element_id WHERE
secteur_id = 100
AND e.edge_id = rel.element_id
AND rel.topogeo_id = (o.topo_geom).id AND rel.topogeo_id = (o.topo_geom).id
); );

View file

@ -16,60 +16,123 @@ fi
. config.sh . 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 "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo " Mise à jour des couches de routage" echo " Mise à jour des couches de routage pour le secteur $secteur_id -> $secteur_id_next"
echo "" echo ""
echo " prend 15-20 min"
echo "" 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 # # 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') ;" # 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 # # 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);" # 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 # # 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');" # 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 # # on a besoin du layer_id
# au cas où ça change : on le récupère par requête # # 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 \ # 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' ;" \ # -c "SELECT layer_id FROM topology.layer WHERE table_name = 'osm_roads' ;" \
--single-transaction \ # --single-transaction \
--set AUTOCOMMIT=off \ # --set AUTOCOMMIT=off \
--set ON_ERROR_STOP=on \ # --set ON_ERROR_STOP=on \
--no-align \ # --no-align \
-t \ # -t \
--field-separator ' ' \ # --field-separator ' ' \
--quiet | while read -a Record ; do # --quiet | while read -a Record ; do
layer_id=${Record[0]} # layer_id=${Record[0]}
echo "" # echo ""
echo "layer_id de osm_roads = $layer_id" # echo "layer_id de osm_roads = $layer_id"
echo "" # echo ""
done # done
# sauf que je n'arrive pas à sortir cette valeur du subshell créé par la boucle do /!\ # 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 # donc je remet ici à la main. A corriger… TODO
layer_id=1 layer_id=1
# on calcule le graphe topologique en remplissant le nouvel attribut géométrique echo " suppression des données du secteur à mettre à jour"
# le 1er chiffre est l'identifiant du layer dans la table topology.layer 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 ;"
# le 2e chiffre est la tolérance en mètres 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 ">> calcul du graphe topologique" echo " fait"
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 ""
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
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 "fait"
echo "" 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 "" echo ""