2019-04-28 14:05:22 +00:00
#!/bin/bash
set -e
set -u
PSQL = /usr/bin/psql
DB_HOST = localhost
DB_NAME = redadeg
DB_USER = redadeg
2019-04-07 17:23:21 +00:00
2020-02-07 13:37:13 +00:00
#cd /data/www/vhosts/ar-redadeg_openstreetmap_bzh/htdocs/scripts/
2019-04-07 17:23:21 +00:00
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# on récupère les couches geojson depuis umap
2019-05-01 12:53:48 +00:00
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo " Récupération des fichiers geojson depuis umap"
2019-04-07 17:23:21 +00:00
# les couches PK
# PK début - fin de secteur
curl -sS http://umap.openstreetmap.fr/fr/datalayer/817220/ > data/phase_2_umap_pk_secteur.geojson
# PK techniques
curl -sS http://umap.openstreetmap.fr/fr/datalayer/817221/ > data/phase_2_umap_pk_technique.geojson
# PK manuels
curl -sS http://umap.openstreetmap.fr/fr/datalayer/817222/ > data/phase_2_umap_pk_manuel.geojson
2019-05-08 14:39:51 +00:00
# couche de points de nettoyage
curl -sS http://umap.openstreetmap.fr/fr/datalayer/861810/ > data/phase_2_umap_point_nettoyage.geojson
2019-05-01 12:53:48 +00:00
echo " fait"
echo ""
2019-04-07 17:23:21 +00:00
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# on les charge dans postgis
# après avoir supprimé les tables
# note : les coordonnées sont en 3857 mais la déclaration de la table = 4326
2019-05-01 12:53:48 +00:00
echo " chargement des fichiers dans la BD"
2019-05-08 14:39:51 +00:00
echo ""
2019-05-01 12:53:48 +00:00
2019-05-08 14:39:51 +00:00
echo "phase_2_pk_secteur_3857"
2019-04-28 16:16:13 +00:00
$PSQL -U $DB_USER -d $DB_NAME -c "DROP TABLE IF EXISTS phase_2_pk_secteur_3857 CASCADE;"
2019-04-07 17:23:21 +00:00
ogr2ogr -f "PostgreSQL" PG:"host=localhost user=redadeg password=redadeg dbname=redadeg" data/phase_2_umap_pk_secteur.geojson -nln phase_2_pk_secteur_3857 -lco GEOMETRY_NAME = the_geom -explodecollections -overwrite
2019-05-08 14:39:51 +00:00
echo "phase_2_point_nettoyage_3857"
$PSQL -U $DB_USER -d $DB_NAME -c "DROP TABLE IF EXISTS phase_2_point_nettoyage_3857 CASCADE;"
ogr2ogr -f "PostgreSQL" PG:"host=localhost user=redadeg password=redadeg dbname=redadeg" data/phase_2_umap_point_nettoyage.geojson -nln phase_2_point_nettoyage_3857 -lco GEOMETRY_NAME = the_geom -explodecollections -overwrite
2019-05-01 12:53:48 +00:00
echo " fait"
echo ""
2019-04-07 17:23:21 +00:00
2019-04-28 14:05:22 +00:00
# on crée les tables en 3948
# et bien d'autres choses :
# - recalage des PK secteurs sur un nœud du réseau routable
2019-05-01 12:53:48 +00:00
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo " Application des traitements SQL 2.1"
echo ""
2019-04-28 14:05:22 +00:00
$PSQL -U $DB_USER -d $DB_NAME < traitements_phase_2.1.sql
2019-05-01 12:53:48 +00:00
echo " fait"
echo ""
2019-04-28 14:05:22 +00: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
2019-05-01 12:53:48 +00:00
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo " Calcul des itinéraires (pgrouting)"
echo ""
2019-04-28 14:05:22 +00:00
# on commence par vider la table qui contiendra les calculs d'itinéraires
2019-05-08 14:39:51 +00:00
echo "vidage de la couche de routage"
$PSQL -h $DB_HOST -U $DB_USER -d $DB_NAME -c "TRUNCATE TABLE phase_2_trace_pgr ;"
echo " fait"
# 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"
2019-05-09 13:40:15 +00:00
$PSQL -h $DB_HOST -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);"
2019-05-08 14:39:51 +00:00
echo " fait"
2019-05-19 09:23:00 +00:00
echo ""
2019-04-28 14:05:22 +00:00
# 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
2019-10-06 12:05:46 +00:00
# on va utiliser un compteur pour pouvoir sauter un sous-secteur à un autre
counter = 1
2019-10-06 13:12:05 +00:00
# autre variables de contrôle
longueur_totale = 0
longueur_inseree = 0
2019-10-06 12:05:46 +00:00
2019-04-28 14:05:22 +00:00
$PSQL -X -h $DB_HOST -U $DB_USER $DB_NAME \
2019-05-01 10:23:26 +00:00
-c " SELECT pk.id, s.id AS secteur_id, replace(s.nom_fr,' ','') AS nom_fr, replace(s.nom_br,' ','') AS nom_br, pk.pgr_node_id, replace(pk.name,' ','_') AS name
2019-04-28 20:57:00 +00:00
FROM phase_2_pk_secteur pk JOIN secteur s ON pk.secteur_id = s.id
2019-04-28 14:05:22 +00:00
ORDER BY pk.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
2019-04-28 20:57:00 +00:00
pk_id = ${ Record [0] }
secteur_id = ${ Record [1] }
secteur_nom_fr = " ${ Record [2] } "
secteur_nom_br = " ${ Record [3] } "
pk_id_start = ${ Record [4] }
2019-10-06 13:12:05 +00:00
troncon_name = ${ Record [5] }
2019-10-06 12:05:46 +00:00
echo " $secteur_id | $secteur_nom_fr / $secteur_nom_br "
2019-10-06 13:12:05 +00:00
echo " tronçon : $troncon_name "
2019-10-06 12:05:46 +00:00
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
2019-04-28 14:05:22 +00:00
read pk_id_end <<< $( $PSQL -h $DB_HOST -U $DB_USER --no-align -t --quiet \
2019-10-06 13:12:05 +00:00
-c " SELECT pgr_node_id FROM phase_2_pk_secteur ORDER BY id OFFSET $counter LIMIT 1 ; " )
2019-10-06 12:05:46 +00:00
echo " end node = $pk_id_end "
2019-04-28 14:05:22 +00:00
# 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
2019-10-06 12:05:46 +00:00
echo " calcul de l'itinéraire"
2019-04-07 17:23:21 +00:00
2019-04-28 14:05:22 +00:00
$PSQL -h $DB_HOST -U $DB_USER -c \
2019-10-06 13:12:05 +00:00
" 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 <<< $( $PSQL -h $DB_HOST -U $DB_USER --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
2019-10-06 12:05:46 +00:00
else
2019-10-06 13:16:58 +00:00
echo ""
echo " E R R E U R !!!!!!!!"
echo " impossible de calculer un itinéraire pour ce secteur"
echo ""
2019-04-28 14:05:22 +00:00
fi
2019-04-07 17:23:21 +00:00
2019-10-06 12:05:46 +00:00
2019-04-28 14:05:22 +00:00
# fin de la boucle
2019-10-06 12:05:46 +00:00
# on incrémente le compteur
( ( counter++) )
2019-04-28 14:05:22 +00:00
echo ""
done
2019-04-07 17:23:21 +00:00
2019-05-01 12:53:48 +00:00
echo " Calcul des itinéraires terminé"
echo ""
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# on applique maintenant des requêtes SQL de création des données dérivées des données de routage
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo " Application des traitements SQL 2.2"
echo ""
2019-04-28 16:37:45 +00:00
2019-05-01 12:53:48 +00:00
$PSQL -U $DB_USER -d $DB_NAME < traitements_phase_2.2.sql
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# et on exporte en geojson pour umap
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo " Exports"
echo ""
echo " exports geojson"
echo ""
2019-04-28 16:37:45 +00:00
rm data/phase_2_pk_secteur.geojson
ogr2ogr -f "GeoJSON" data/phase_2_pk_secteur.geojson PG:"host=localhost user=redadeg password=redadeg dbname=redadeg" phase_2_pk_secteur_4326
rm data/phase_2_trace_pgr.geojson
ogr2ogr -f "GeoJSON" data/phase_2_trace_pgr.geojson PG:"host=localhost user=redadeg password=redadeg dbname=redadeg" phase_2_trace_pgr_4326
2019-05-01 12:53:48 +00:00
rm data/phase_2_trace_secteur.geojson
ogr2ogr -f "GeoJSON" data/phase_2_trace_secteur.geojson PG:"host=localhost user=redadeg password=redadeg dbname=redadeg" phase_2_trace_secteur_4326
2019-04-28 16:37:45 +00:00
# les fichiers sont ensuite tout de suite visible dans umap
2019-05-04 08:35:48 +00:00
# exports supplémentaires
echo " exports supplémentaires"
2019-05-01 12:53:48 +00:00
echo ""
2019-04-28 16:37:45 +00:00
2019-05-04 09:15:31 +00:00
rm data/phase_2_tdb.xlsx
2019-05-04 08:35:48 +00:00
ogr2ogr -f "XLSX" data/phase_2_tdb.xlsx PG:"host=localhost user=redadeg password=redadeg dbname=redadeg" phase_2_tdb
2019-05-04 09:15:31 +00:00
rm data/phase_2_tdb.csv
2019-05-04 08:35:48 +00:00
ogr2ogr -f "CSV" data/phase_2_tdb.csv PG:"host=localhost user=redadeg password=redadeg dbname=redadeg" phase_2_tdb
echo " fait"
echo ""
2019-04-28 16:37:45 +00:00
2019-05-01 12:53:48 +00:00
echo ""
echo ""
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo " F I N"
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
echo ""