From 352198454d97d642d827cc3a1100019caecb494d Mon Sep 17 00:00:00 2001 From: MaelReboux Date: Sun, 7 Apr 2019 19:23:21 +0200 Subject: [PATCH] recalage des PK secteurs sur les noeuds de routage --- scripts/create_tables.sql | 16 ++++++++ scripts/traitements_phase_2.1.sql | 64 +++++++++++++++++++++++++++++++ scripts/traitements_phase_2.sh | 32 ++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 scripts/traitements_phase_2.1.sql create mode 100755 scripts/traitements_phase_2.sh diff --git a/scripts/create_tables.sql b/scripts/create_tables.sql index 4038b78..a532b44 100644 --- a/scripts/create_tables.sql +++ b/scripts/create_tables.sql @@ -166,6 +166,22 @@ CREATE VIEW phase_1_tdb AS ========================================================================== */ +-- les couches PK venant de umap + +DROP TABLE IF EXISTS phase_2_pk_secteur CASCADE ; +CREATE TABLE phase_2_pk_secteur +( + id integer, + name text, + pgr_node_id integer, + the_geom geometry(Point,2154), + CONSTRAINT phase_2_pk_secteur_pkey PRIMARY KEY (id), + CONSTRAINT enforce_geotype_the_geom CHECK (geometrytype(the_geom) = 'POINT'::text), + CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = 2154) +); + + + -- la table qui contient les lignes des routes venant de OSM DROP TABLE IF EXISTS osm_roads ; diff --git a/scripts/traitements_phase_2.1.sql b/scripts/traitements_phase_2.1.sql new file mode 100644 index 0000000..194b49b --- /dev/null +++ b/scripts/traitements_phase_2.1.sql @@ -0,0 +1,64 @@ +/* +========================================================================== + + phase 2 : préparation des données + +========================================================================== +*/ + +-- dans la base redadeg on a chargé des données provenant de umap +-- ces données sont en 3857. On va les passer en 2154 (Lambert 93). + + + + +-- ici on fait une grosse requête qui va recaler les PK secteurs sur les nœuds routables +-- ça insère les points de secteurs dans la table en 2154 + +TRUNCATE TABLE phase_2_pk_secteur ; + +-- on fait une table de base qui contient les relations entre le point à recaler et les poins de référence +-- on limite à un buffer de 25 +WITH candidates AS +( +SELECT + pk_org.id AS pk_id, + pk_org.name AS name, + node.id AS node_id, + ST_Distance(pk_org.the_geom, ST_ClosestPoint(node.the_geom, pk_org.the_geom)) AS distance, + ST_Snap( + pk_org.the_geom, -- le point d'origine à recaler + ST_ClosestPoint(node.the_geom, pk_org.the_geom), -- le point le plus près dans la couche de nœuds + ST_Distance(pk_org.the_geom, ST_ClosestPoint(node.the_geom, pk_org.the_geom))* 1.01 -- dans la distance de ce plus proche point + ) AS the_geom +FROM + (SELECT id::integer, name, ST_Transform(the_geom,2154) AS the_geom FROM phase_2_pk_secteur_3857) AS pk_org, + (SELECT id, the_geom FROM osm_roads_pgr_vertices_pgr) AS node +WHERE +ST_INTERSECTS(node.the_geom, ST_BUFFER(ST_Transform(pk_org.the_geom,2154) ,25) ) +ORDER BY pk_org.id, ST_Distance(pk_org.the_geom, ST_ClosestPoint(node.the_geom, pk_org.the_geom)) +) +-- à partir de cette table on va faire une jointure entre les PK org et les nœuds ramenés par la sous-requête +INSERT INTO phase_2_pk_secteur +SELECT + a.pk_id AS id, + a.name, + b.node_id AS pgr_node_id, + b.the_geom +FROM candidates a JOIN +( +-- on fait une table qui ordonne les points d'accroche +SELECT + pk_id, node_id, + -- le rang va permettre de donner le rang de chaque rapprochement et d'en faire un critère + row_number() over (partition by pk_id order by min(distance)) AS rang, + min(distance) AS min_distance, + the_geom +FROM candidates +GROUP BY pk_id, node_id, the_geom +) b ON a.pk_id = b.pk_id +WHERE b.rang = 1 +GROUP BY a.pk_id, a.name, b.node_id, b.the_geom +ORDER BY a.pk_id + + diff --git a/scripts/traitements_phase_2.sh b/scripts/traitements_phase_2.sh new file mode 100755 index 0000000..a00b5f8 --- /dev/null +++ b/scripts/traitements_phase_2.sh @@ -0,0 +1,32 @@ +#!/bin/sh + +cd /data/www/vhosts/ar-redadeg_openstreetmap_bzh/htdocs/scripts/ + +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# on récupère les couches geojson depuis umap + +# 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 + + +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# 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 + +psql -U redadeg -d redadeg -c "DROP TABLE phase_2_pk_secteur_3857 CASCADE;" +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 + + + +# on crée les tables en 3948 et on fait bien d'autres choses : +psql -U redadeg -d redadeg < traitements_phase_2.1.sql + + +