-
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathST_TransectsOnCurveLine
More file actions
26 lines (24 loc) · 1.97 KB
/
Copy pathST_TransectsOnCurveLine
File metadata and controls
26 lines (24 loc) · 1.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
DROP FUNCTION IF EXISTS ST_TransectsOnCurveLine(
geom GEOMETRY,
sl numeric)
CREATE OR REPLACE FUNCTION ST_TransectsOnCurveLine(
geom GEOMETRY,
sl numeric)
RETURNS GEOMETRY AS
$BODY$
WITH
geodata AS (SELECT row_number() over() AS id, (ST_Dump($1)).geom geom),
linecut AS (SELECT row_number() over() AS id, ST_LineSubstring(d.geom, substart, CASE WHEN subend > 1 THEN 1 ELSE subend END) geom FROM (SELECT id, geom, ST_Length(((geom)::geometry)) len, $2 sublen FROM geodata) AS d CROSS JOIN LATERAL (SELECT i, (sublen * i)/len AS substart, (sublen * (i+1))/len AS subend
FROM generate_series(0, floor(d.len/sublen)::integer) AS t(i) WHERE (sublen * i)/len <> 1.0) AS d2),
rotate1 AS (SELECT id, ST_Rotate(ST_Collect(geom), -pi()/2, ST_LineInterpolatePoint(geom, 0.5)) geom FROM linecut GROUP BY id, geom),
tr1 AS (SELECT id, ST_MakeLine(ST_StartPoint(geom), ST_EndPoint(geom)) geom FROM (SELECT id, (ST_Dump(geom)).geom geom FROM rotate1) foo),
rotate2 AS (SELECT id, ST_Rotate(ST_Collect(geom), pi()/2, ST_LineInterpolatePoint(geom, 0.5)) geom FROM linecut GROUP BY id, geom),
tr2 AS (SELECT id, ST_MakeLine(ST_StartPoint(geom), ST_EndPoint(geom)) geom FROM (SELECT id, (ST_Dump(geom)).geom geom FROM rotate2) foo),
line_incoherence AS (SELECT a.id, ST_MakeLine(ST_StartPoint(a.geom), ST_EndPoint(b.geom)) geom FROM tr1 a JOIN tr2 b ON true AND a.id=b.id),
int_pnt AS (SELECT a.id, ST_ShortestLine(ST_LineInterpolatePoint(a.geom, 0.5), b.geom) geom FROM line_incoherence a JOIN linecut b ON a.id=b.id GROUP BY a.id, a.geom, b.geom ORDER BY id),
transectline AS (SELECT id, ST_Rotate(ST_Collect(geom), -pi(), ST_EndPoint(geom)) geom FROM int_pnt GROUP BY id, geom)
SELECT ST_Union(geom) geom FROM (SELECT geom FROM int_pnt UNION SELECT geom FROM transectline) foo;
$BODY$
LANGUAGE SQL
SELECT ST_TransectsOnCurveLine(geom, 1.5) geom FROM <line_name_table>
* function is able to solve the problem with small simplifications for complex convoluted linear objects