136 lines
3.7 KiB
MySQL
136 lines
3.7 KiB
MySQL
|
|
||
|
|
||
|
-- permet de créer 1 seule ligne pour 1 secteur
|
||
|
|
||
|
DELETE FROM phase_3_trace_secteurs WHERE secteur_id = 100 ;
|
||
|
WITH t AS (
|
||
|
SELECT *
|
||
|
FROM phase_2_trace_troncons
|
||
|
WHERE secteur_id = 100
|
||
|
)
|
||
|
INSERT INTO phase_3_trace_secteurs
|
||
|
SELECT
|
||
|
secteur_id, s.nom_fr, s.nom_br,
|
||
|
0 as km_reels,
|
||
|
--ST_AsText(ST_LineMerge(ST_Collect(t.the_geom))) as txt_geom,
|
||
|
ST_LineMerge(ST_Collect(t.the_geom)) as the_geom
|
||
|
FROM t JOIN secteur s ON t.secteur_id = s.id
|
||
|
GROUP BY t.secteur_id, s.nom_fr, s.nom_br ;
|
||
|
|
||
|
UPDATE phase_3_trace_secteurs
|
||
|
SET km_reels = TRUNC( ST_Length(the_geom)::numeric /1000 , 1)
|
||
|
WHERE secteur_id = 100 ;
|
||
|
|
||
|
|
||
|
|
||
|
--The below example simulates a while loop in
|
||
|
--SQL using PostgreSQL generate_series() to cut all
|
||
|
--linestrings in a table to 100 unit segments
|
||
|
-- of which no segment is longer than 100 units
|
||
|
-- units are measured in the SRID units of measurement
|
||
|
-- It also assumes all geometries are LINESTRING or contiguous MULTILINESTRING
|
||
|
--and no geometry is longer than 100 units*10000
|
||
|
--for better performance you can reduce the 10000
|
||
|
--to match max number of segments you expect
|
||
|
|
||
|
TRUNCATE phase_3_trace_troncons ;
|
||
|
|
||
|
INSERT INTO phase_3_trace_troncons
|
||
|
SELECT
|
||
|
row_number() over(),
|
||
|
secteur_id,
|
||
|
ST_LineSubstring(the_geom, 1000.00*n/length,
|
||
|
CASE
|
||
|
WHEN 1000.00*(n+1) < length THEN 1000.00*(n+1)/length
|
||
|
ELSE 1
|
||
|
END) As the_geom
|
||
|
FROM
|
||
|
(
|
||
|
SELECT
|
||
|
secteur_id,
|
||
|
ST_Length(the_geom) AS length,
|
||
|
ST_LineMerge(the_geom) AS the_geom
|
||
|
FROM phase_3_trace_secteurs
|
||
|
) AS t
|
||
|
CROSS JOIN generate_series(0,10000) AS n
|
||
|
WHERE n*1000.00/length < 1;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
-- la table qui va accueillir une couche support de calcul itinéraire phase 3
|
||
|
-- à savoir les tronçons phase 2 découpés tous les x mètres
|
||
|
DROP TABLE IF EXISTS phase_3_troncons_pgr CASCADE ;
|
||
|
CREATE TABLE phase_3_troncons_pgr
|
||
|
(
|
||
|
secteur_id integer,
|
||
|
-- info de routage
|
||
|
id serial,
|
||
|
source bigint,
|
||
|
target bigint,
|
||
|
cost double precision,
|
||
|
reverse_cost double precision,
|
||
|
-- info OSM
|
||
|
osm_id bigint,
|
||
|
highway text,
|
||
|
type text,
|
||
|
oneway text,
|
||
|
ref text,
|
||
|
name_fr text,
|
||
|
name_br text,
|
||
|
the_geom geometry,
|
||
|
--CONSTRAINT enforce_geotype_the_geom CHECK (geometrytype(the_geom) = 'LINESTRING'::text),
|
||
|
CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = 2154)
|
||
|
);
|
||
|
CREATE INDEX phase_3_troncons_pgr_geom_idx ON phase_3_troncons_pgr USING gist(the_geom);
|
||
|
ALTER TABLE phase_3_troncons_pgr OWNER to redadeg;
|
||
|
|
||
|
-- on supprime les données pour le secteur
|
||
|
DELETE FROM phase_3_troncons_pgr WHERE secteur_id = $secteur_id ;
|
||
|
|
||
|
-- on charge, pour le secteur concerné des tronçons courts découpés tous les x mètres
|
||
|
-- (densification avec ST_LineSubstring )
|
||
|
INSERT INTO phase_3_troncons_pgr (secteur_id, osm_id, highway, type, oneway, ref, name_fr, name_br, the_geom)
|
||
|
SELECT
|
||
|
secteur_id, osm_id, highway, type, oneway, ref, name_fr, name_br,
|
||
|
ST_LineSubstring(the_geom, $long_km_redadeg*n/length,
|
||
|
CASE
|
||
|
WHEN $long_km_redadeg*(n+1) < length THEN $long_km_redadeg*(n+1)/length
|
||
|
ELSE 1
|
||
|
END) As the_geom
|
||
|
FROM
|
||
|
(
|
||
|
SELECT
|
||
|
secteur_id, osm_id, highway, type, oneway, ref, name_fr, name_br,
|
||
|
ST_Length(the_geom) AS length,
|
||
|
the_geom
|
||
|
FROM phase_2_trace_troncons
|
||
|
WHERE secteur_id = $secteur_id
|
||
|
) AS t
|
||
|
CROSS JOIN generate_series(0,10000) AS n
|
||
|
WHERE n*$long_km_redadeg/length < 1;
|
||
|
|
||
|
-- calcul des attributs de support du calcul pour PGR
|
||
|
UPDATE phase_3_troncons_pgr
|
||
|
SET cost = st_length(the_geom), reverse_cost = st_length(the_geom)
|
||
|
WHERE secteur_id = $secteur_id ;
|
||
|
|
||
|
-- optimisation
|
||
|
VACUUM FULL phase_3_troncons_pgr ;
|
||
|
|
||
|
-- création / maj de la topologie pour les tronçons nouvellement créés
|
||
|
SELECT pgr_createTopology('phase_3_troncons_pgr', 0.001, rows_where:='true', clean:=true);
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
SELECT *
|
||
|
FROM pgr_drivingDistance(
|
||
|
'SELECT id, source, target, cost, reverse_cost FROM phase_3_troncons_pgr WHERE SOURCE IS NOT NULL',
|
||
|
107, 300);
|
||
|
|