ST_OffSetCurve
Signatures
GEOMETRY ST_OffSetCurve(GEOMETRY geom, DOUBLE distance);
GEOMETRY ST_OffSetCurve(GEOMETRY geom, DOUBLE distance, VARCHAR param);
Description
Return an offset line or collection of lines at a given distance and side from an input geometry (geom).
The distance is given in projection units.
The optional third parameter (param) can either specify the number of segments used to approximate a quarter circle or a VARCHAR list of space-separated key=value pairs:
|
Description |
Default |
|---|---|---|
|
number of segments to approximate a quarter circle |
8 |
|
join style |
|
|
mitre ratio limit (only affects mitered join style) |
5 |
Examples
SELECT ST_OffSetCurve('LINESTRING (1 1, 4 4)', 1);
-- Answer: LINESTRING (0.2928932188134524 1.7071067811865475, 3.2928932188134525 4.707106781186548)

SELECT ST_OffSetCurve('LINESTRING (1 1, 4 4)', -1);
-- Answer: LINESTRING (1.7071067811865475 0.2928932188134524, 4.707106781186548 3.2928932188134525)

SELECT ST_OffSetCurve('MULTILINESTRING ((1 1, 4 4), (1 4, 4 2))', 1);
-- Answer: MULTILINESTRING ((0.2928932188134524 1.7071067811865475, 3.2928932188134525 4.707106781186548),
-- (1.5547001962252291 4.832050294337844, 4.554700196225229 2.8320502943378436))

Changing the number of segments
SELECT ST_OffSetCurve('LINESTRING (1 1, 4 4, 4 2)', 1, 'quad_segs=2 join=round');
-- Answer: LINESTRING (0.2928932188134524 1.7071067811865475, 3.2928932188134525 4.707106781186548, 4 5, 4.707106781186548 4.707106781186548, 5 4, 5 2)
SELECT ST_OffSetCurve('LINESTRING (1 1, 4 4, 4 2)', 1, 'quad_segs=8 join=round');
-- Answer: LINESTRING (0.2928932188134524 1.7071067811865475, 3.2928932188134525 4.707106781186548, 3.444429766980398 4.831469612302546, 3.6173165676349104 4.923879532511287, 3.804909677983872 4.98078528040323, 4 5, 4.195090322016128 4.98078528040323, 4.38268343236509 4.923879532511287, 4.555570233019602 4.831469612302545, 4.707106781186548 4.707106781186548, 4.831469612302545 4.555570233019602, 4.923879532511287 4.38268343236509, 4.98078528040323 4.195090322016129, 5 4, 5 2)
SELECT ST_OffSetCurve('LINESTRING (1 1, 4 4, 4 2)', 1, 'quad_segs=16 join=round');
-- Answer: LINESTRING (0.2928932188134524 1.7071067811865475, 3.2928932188134525 4.707106781186548, 3.3656067158363547 4.773010453362737, 3.444429766980398 4.831469612302546, 3.528603263174002 4.881921264348355, 3.6173165676349104 4.923879532511287, 3.709715322745538 4.956940335732209, 3.804909677983872 4.98078528040323, 3.9019828596704396 4.995184726672197, 4 5, 4.098017140329561 4.995184726672197, 4.195090322016128 4.98078528040323, 4.290284677254462 4.956940335732209, 4.38268343236509 4.923879532511287, 4.471396736825998 4.881921264348355, 4.555570233019602 4.831469612302545, 4.634393284163646 4.773010453362737, 4.707106781186548 4.707106781186548, 4.773010453362737 4.634393284163646, 4.831469612302545 4.555570233019602, 4.881921264348355 4.471396736825998, 4.923879532511287 4.38268343236509, 4.956940335732209 4.290284677254462, 4.98078528040323 4.195090322016129, 4.995184726672197 4.098017140329561, 5 4, 5 2)

Changing the join style
SELECT ST_OffSetCurve('LINESTRING (1 1, 4 4, 4 2)', 1, 'join=round');
-- Answer: LINESTRING (0.2928932188134524 1.7071067811865475, 3.2928932188134525 4.707106781186548, 3.444429766980398 4.831469612302546, 3.6173165676349104 4.923879532511287, 3.804909677983872 4.98078528040323, 4 5, 4.195090322016128 4.98078528040323, 4.38268343236509 4.923879532511287, 4.555570233019602 4.831469612302545, 4.707106781186548 4.707106781186548, 4.831469612302545 4.555570233019602, 4.923879532511287 4.38268343236509, 4.98078528040323 4.195090322016129, 5 4, 5 2)
SELECT ST_OffSetCurve('LINESTRING (1 1, 4 4, 4 2)', 1, 'join=mitre');
-- Answer: LINESTRING (0.2928932188134524 1.7071067811865475, 5 6.414213562373096, 5 2)
SELECT ST_OffSetCurve('LINESTRING (1 1, 4 4, 4 2)', 1, 'join=bevel');
-- Answer: LINESTRING (0.2928932188134524 1.7071067811865475, 3.2928932188134525 4.707106781186548, 5 4, 5 2)

Changing the mitre ratio limit
SELECT ST_OffSetCurve('LINESTRING (1 1, 4 4, 4 2)', 1, 'join=mitre mitre_limit=1');
-- Answer: LINESTRING (0.2928932188134524 1.7071067811865475, 3.7653668647301792 5.179580427103275, 5 4.668178637919299, 5 2)
SELECT ST_OffSetCurve('LINESTRING (1 1, 4 4, 4 2)', 1, 'join=mitre mitre_limit=2');
-- Answer: LINESTRING (0.2928932188134524 1.7071067811865475, 4.5307337294603585 5.944947291833454, 5 5.750570838211694, 5 2)
SELECT ST_OffSetCurve('LINESTRING (1 1, 4 4, 4 2)', 1, 'join=mitre mitre_limit=3');
-- Answer: LINESTRING (0.2928932188134524 1.7071067811865475, 5 6.414213562373096, 5 2)
