mise à jour par millésime + secteur
This commit is contained in:
parent
786ef692b0
commit
613db460dd
|
@ -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"
|
||||
|
|
|
@ -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 ""
|
|
@ -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 ""
|
||||
|
|
|
@ -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 ""
|
146
scripts_v2/phase_2_routing_compute.sh
Executable file
146
scripts_v2/phase_2_routing_compute.sh
Executable 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 ""
|
106
scripts_v2/phase_2_routing_prepare.sh
Executable file
106
scripts_v2/phase_2_routing_prepare.sh
Executable 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 ""
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 ""
|
||||
|
|
Loading…
Reference in a new issue