-
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathST_CircularWavyLineEven_round
More file actions
26 lines (24 loc) · 1.88 KB
/
ST_CircularWavyLineEven_round
File metadata and controls
26 lines (24 loc) · 1.88 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_CircularWavyLineEven_round(
geom GEOMETRY,
sl integer,
k integer)
CREATE OR REPLACE FUNCTION ST_CircularWavyLineEven_round(
geom GEOMETRY,
sl integer,
k integer)
RETURNS TABLE (geom GEOMETRY) AS
$BODY$
WITH
geodata AS (SELECT row_number() over() AS id, geom),
linedivide 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, sl 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),
tblc AS (SELECT geom, case id % 2 when 0 then 'even' else 'odd' end FROM linedivide),
tbld AS (SELECT (ST_Dump(geom)).geom geom FROM tblc WHERE tblc.case='even'),
tble AS (SELECT ST_Reverse((ST_Dump(geom)).geom) geom FROM tblc WHERE tblc.case='odd'),
group_geodata AS (SELECT ST_CurveToLine('CIRCULARSTRING('||ST_X(ST_StartPoint(geom))||' '||ST_Y(ST_StartPoint(geom))||','||ST_X(ST_Centroid(ST_OffsetCurve(geom, ST_Length(geom)/k, 'quad_segs=4 join=round')))||' '||ST_Y(ST_Centroid(ST_OffsetCurve(geom, ST_Length(geom)/k, 'quad_segs=4 join=round')))||', '||ST_X(ST_EndPoint(geom))||' '||ST_Y(ST_EndPoint(geom))||')') geom
FROM tbld UNION SELECT ST_CurveToLine('CIRCULARSTRING('||ST_X(ST_StartPoint(geom))||' '||ST_Y(ST_StartPoint(geom))||','||ST_X(ST_Centroid(ST_OffsetCurve(geom, ST_Length(geom)/k, 'quad_segs=4 join=round')))||' '||ST_Y(ST_Centroid(ST_OffsetCurve(geom, ST_Length(geom)/k, 'quad_segs=4 join=round')))||', '||ST_X(ST_EndPoint(geom))||' '||ST_Y(ST_EndPoint(geom))||')') geom FROM tble)
SELECT ST_Collect(geom) geom FROM group_geodata;
$BODY$
LANGUAGE SQL
SELECT ST_CircularWavyLineEven_round(geom, 15, 5) geom FROM <LINE_name_table>