x
1
DECLARE
2
locate_before_point double precision = 0;
3
locate_after_point double precision = 1;
4
parcours public.geometry;
5
BEGIN
6
SELECT raepa.get_vanne_before_point(cana_id, locate_point, false) into locate_before_point;
7
SELECT raepa.get_vanne_after_point(cana_id, locate_point, false) into locate_after_point;
8
9
IF locate_before_point IS NOT NULL AND locate_after_point IS NOT NULL THEN
10
SELECT ST_LineSubstring(c.geom, locate_before_point, locate_after_point) into parcours AS geom FROM raepa.raepa_canalaep_l AS c WHERE c.idcana = cana_id;
11
RETURN parcours;
12
END IF;
13
14
WITH RECURSIVE walk_network(idcana, all_parents, geom, stop, step) AS (
15
SELECT idcana::text,
16
array[idcana::text] as all_parents,
17
ST_LineSubstring(geom,
18
CASE WHEN raepa.get_vanne_before_point(cana_id, locate_point, false) IS NULL THEN 0 ELSE raepa.get_vanne_before_point(cana_id, locate_point, false) END,
19
CASE WHEN raepa.get_vanne_after_point(cana_id, locate_point, false) IS NULL THEN 1 ELSE raepa.get_vanne_after_point(cana_id, locate_point, false) END) as geom,
20
False as stop,
21
0 as step
22
FROM raepa.raepa_canalaep_l
23
WHERE idcana = cana_id
24
UNION ALL
25
SELECT n.idcana::text AS idcana,
26
w.all_parents || n.idcana::text AS all_parents,
27
CASE
28
WHEN a.idappareil IS NOT NULL AND ST_Dwithin(st_startpoint(n.geom), st_endpoint(w.geom), 0.05) THEN ST_LineSubstring( n.geom, 0, raepa.get_vanne_after_point(n.idcana, 0, false) )::geometry(LineString,2154)
29
WHEN a.idappareil IS NOT NULL AND ST_Dwithin(st_startpoint(n.geom), st_startpoint(w.geom), 0.05) THEN ST_LineSubstring( n.geom, 0, raepa.get_vanne_after_point(n.idcana, 0, false) )::geometry(LineString,2154)
30
WHEN a.idappareil IS NOT NULL AND ST_Dwithin(st_endpoint(n.geom), st_startpoint(w.geom), 0.05) THEN ST_LineSubstring( n.geom, raepa.get_vanne_before_point(n.idcana, 1, false), 1 )::geometry(LineString,2154)
31
WHEN a.idappareil IS NOT NULL AND ST_Dwithin(st_endpoint(n.geom), st_endpoint(w.geom), 0.05) THEN ST_LineSubstring( n.geom, raepa.get_vanne_before_point(n.idcana, 1, false), 1 )::geometry(LineString,2154)
32
ELSE n.geom::geometry(LineString,2154) END AS geom,
33
a.idappareil IS NOT NULL OR o.idouvrage IS NOT NULL as stop,
34
w.step + 1 as step
35
FROM raepa.raepa_canalaep_l AS n
36
LEFT OUTER JOIN raepa.raepa_apparaep_p a ON ( fnappaep = '03' AND _ferme AND ST_Dwithin(n.geom, a.geom, 0.05) )
37
LEFT OUTER JOIN raepa.raepa_ouvraep_p o ON (
38
(fnouvaep = '03' OR fnouvaep = '05' OR fnouvaep = '01')
39
AND
40
ST_Dwithin(n.geom, o.geom, 0.05)
41
),
42
walk_network AS w
43
WHERE TRUE AND (
44
ST_Dwithin(st_startpoint(n.geom), st_endpoint(w.geom), 0.05) OR
45
ST_Dwithin(st_startpoint(n.geom), st_startpoint(w.geom), 0.05) OR
46
ST_Dwithin(st_endpoint(n.geom), st_startpoint(w.geom), 0.05) OR
47
ST_Dwithin(st_endpoint(n.geom), st_endpoint(w.geom), 0.05))
48
AND w.idcana <> n.idcana AND n.idcana <> ALL (w.all_parents)
49
AND NOT w.stop
50
AND w.step < 15
51
)
52
SELECT ST_Union(DISTINCT geom) into parcours AS geom FROM walk_network;
53
RETURN parcours;
54
END;
55