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

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

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 ;
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,

View file

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

View file

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