découpage du tracé par des points

This commit is contained in:
MaelReboux 2019-05-08 16:39:51 +02:00
parent 2ddb83f145
commit 67e8c6a36e
3 changed files with 74 additions and 4 deletions

View file

@ -195,7 +195,7 @@ CREATE VIEW phase_2_pk_secteur_4326 AS
ALTER TABLE phase_2_pk_secteur_4326 OWNER to redadeg; ALTER TABLE phase_2_pk_secteur_4326 OWNER to redadeg;
-- la table qui contient les lignes des routes venant de OSM -- la couche qui contient les lignes des routes venant de OSM
DROP TABLE IF EXISTS osm_roads ; DROP TABLE IF EXISTS osm_roads ;
CREATE TABLE osm_roads CREATE TABLE osm_roads
( (
@ -212,9 +212,10 @@ CREATE TABLE osm_roads
CONSTRAINT enforce_geotype_the_geom CHECK (geometrytype(the_geom) = 'LINESTRING'::text OR geometrytype(the_geom) = 'MULTILINESTRING'::text), 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) CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = 2154)
); );
ALTER TABLE osm_roads OWNER to redadeg;
-- la table en version routable -- la couche en version routable
DROP TABLE IF EXISTS osm_roads_pgr ; DROP TABLE IF EXISTS osm_roads_pgr ;
CREATE TABLE osm_roads_pgr CREATE TABLE osm_roads_pgr
( (
@ -237,8 +238,24 @@ CREATE TABLE osm_roads_pgr
); );
CREATE INDEX osm_roads_pgr_source_idx ON osm_roads_pgr (source); CREATE INDEX osm_roads_pgr_source_idx ON osm_roads_pgr (source);
CREATE INDEX osm_roads_pgr_target_idx ON osm_roads_pgr (target); CREATE INDEX osm_roads_pgr_target_idx ON osm_roads_pgr (target);
ALTER TABLE osm_roads_pgr OWNER to redadeg;
-- la couche des points pour nettoyer la couche de routage
DROP TABLE IF EXISTS phase_2_point_nettoyage ;
CREATE TABLE phase_2_point_nettoyage
(
id serial,
pt_id bigint,
edge_id bigint,
distance numeric,
the_geom geometry,
CONSTRAINT phase_2_point_nettoyage_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)
);
ALTER TABLE phase_2_point_nettoyage OWNER to redadeg;
-- dans la base redadeg on chargera la couche osm_roads qui a été calculée -- dans la base redadeg on chargera la couche osm_roads qui a été calculée
-- à partir de données OSM -- à partir de données OSM

View file

@ -64,3 +64,41 @@ GROUP BY a.pk_id, a.name, a.secteur_id, b.node_id, b.the_geom
ORDER BY a.pk_id ; ORDER BY a.pk_id ;
-- on recale également les points de nettoyage sur le tracé
TRUNCATE TABLE phase_2_point_nettoyage ;
WITH candidates AS
(
SELECT
pt_org.ogc_fid AS pt_id,
edge.id AS edge_id,
ST_Distance(pt_org.the_geom, ST_ClosestPoint(edge.the_geom, pt_org.the_geom)) AS distance,
ST_Snap(
pt_org.the_geom, -- le point d'origine à recaler
ST_ClosestPoint(edge.the_geom, pt_org.the_geom), -- le point le plus près dans la couche de nœuds
ST_Distance(pt_org.the_geom, ST_ClosestPoint(edge.the_geom, pt_org.the_geom))* 1.01 -- dans la distance de ce plus proche point
) AS the_geom
FROM
(SELECT ogc_fid::integer, ST_Transform(the_geom,2154) AS the_geom FROM phase_2_point_nettoyage_3857) AS pt_org,
(SELECT id, the_geom FROM osm_roads_pgr) AS edge
WHERE
ST_INTERSECTS(edge.the_geom, ST_BUFFER(ST_Transform(pt_org.the_geom,2154) ,2) )
ORDER BY pt_org.ogc_fid, ST_Distance(pt_org.the_geom, ST_ClosestPoint(edge.the_geom, pt_org.the_geom))
)
INSERT INTO phase_2_point_nettoyage
SELECT
nextval('phase_2_point_nettoyage_id_seq'::regclass),
pt_id,
edge_id,
distance,
the_geom
FROM candidates ;

View file

@ -24,7 +24,8 @@ curl -sS http://umap.openstreetmap.fr/fr/datalayer/817220/ > data/phase_2_umap_
curl -sS http://umap.openstreetmap.fr/fr/datalayer/817221/ > data/phase_2_umap_pk_technique.geojson curl -sS http://umap.openstreetmap.fr/fr/datalayer/817221/ > data/phase_2_umap_pk_technique.geojson
# PK manuels # PK manuels
curl -sS http://umap.openstreetmap.fr/fr/datalayer/817222/ > data/phase_2_umap_pk_manuel.geojson curl -sS http://umap.openstreetmap.fr/fr/datalayer/817222/ > data/phase_2_umap_pk_manuel.geojson
# couche de points de nettoyage
curl -sS http://umap.openstreetmap.fr/fr/datalayer/861810/ > data/phase_2_umap_point_nettoyage.geojson
echo " fait" echo " fait"
echo "" echo ""
@ -36,10 +37,16 @@ echo ""
# note : les coordonnées sont en 3857 mais la déclaration de la table = 4326 # note : les coordonnées sont en 3857 mais la déclaration de la table = 4326
echo " chargement des fichiers dans la BD" echo " chargement des fichiers dans la BD"
echo ""
echo "phase_2_pk_secteur_3857"
$PSQL -U $DB_USER -d $DB_NAME -c "DROP TABLE IF EXISTS phase_2_pk_secteur_3857 CASCADE;" $PSQL -U $DB_USER -d $DB_NAME -c "DROP TABLE IF EXISTS 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 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
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
echo " fait" echo " fait"
echo "" echo ""
@ -68,7 +75,15 @@ echo " Calcul des itinéraires (pgrouting)"
echo "" echo ""
# on commence par vider la table qui contiendra les calculs d'itinéraires # on commence par vider la table qui contiendra les calculs d'itinéraires
$PSQL -h $DB_HOST -U $DB_USER -c "TRUNCATE TABLE phase_2_trace_pgr ;" 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"
$PSQL -h $DB_HOST -U $DB_USER -d $DB_NAME -c "DELETE FROM osm_roads_pgr 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"
# on fait la requête qui va donner une liste de PK de secteurs # on fait la requête qui va donner une liste de PK de secteurs