ar_redadeg/scripts_v2/update_osm_roads_pgr.sh
MaelREBOUX 4813ce0b1c Update update_osm_roads_pgr.sh
mise en forme
2021-10-03 16:06:18 +02:00

151 lines
4.7 KiB
Bash
Executable file

#! /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"
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo " Mise à jour des couches de routage pour le secteur $secteur_id -> $secteur_id_next"
echo ""
echo ""
# # 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') ;"
# # 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');"
# # 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]}
# echo ""
# echo "layer_id de osm_roads = $layer_id"
# echo ""
# 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
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 ""
echo ""
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo " F I N "
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo ""
echo ""