-
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathST_TransectsOnStraightLine
More file actions
20 lines (18 loc) · 1.03 KB
/
ST_TransectsOnStraightLine
File metadata and controls
20 lines (18 loc) · 1.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DROP FUNCTION IF EXISTS ST_TransectsOnStraightLine(
geom GEOMETRY,
sl numeric)
CREATE OR REPLACE FUNCTION ST_TransectsOnStraightLine(
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 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),
rotate AS (SELECT id, ST_Rotate(ST_Collect(geom), -pi()/2, ST_LineInterpolatePoint(geom, 0.5)) geom FROM linecut GROUP BY id, geom)
SELECT ST_Union(geom) geom FROM rotate;
$BODY$
LANGUAGE SQL
SELECT ST_TransectsOnStraightLine(geom, 1.5) geom FROM <name_line_table>
* function can solve the problem for rectilinear objects