ST_OffsetCurve — Returns an offset line at a given distance and side from an input line.
geometry ST_OffsetCurve(geometry line, float signed_distance, text style_parameters='');
Return an offset line at a given distance and side from an input line. All points of the returned geometries are not further than the given distance from the input geometry. Useful for computing parallel lines about a center line.
For positive distance the offset is on the left side of the input line and retains the same direction. For a negative distance it is on the right side and in the opposite direction.
거리의 단위는 공간 참조 시스템의 단위로 측정됩니다.
Note that output may be a MULTILINESTRING or EMPTY for some jigsaw-shaped input geometries.
다음과 같이 연산을 조정하기 위해 선택적인 세 번째 파라미터로 공백으로 구분된 키=값 쌍의 목록을 설정할 수 있습니다:
'quad_segs=#' : 사분원(quarter circle)의 근사치를 계산하는 데 쓰이는 선분의 개수(기본값은 8)
'join=round|mitre|bevel' : 접합 스타일(기본값은 "원형(round)"). '마이터(mitre)'의 동의어로 '마이터(miter)'도 쓸 수 있습니다.
'mitre_limit=#.#' : 마이터 비율 제한(마이터 접합 스타일만 영향을 받습니다). 'mitre_limit'의 동의어로 'miter_limit'도 쓸 수 있습니다.
GEOS 모듈로 실행
Behavior changed in GEOS 3.11 so offset curves now have the same direction as the input line, for both positive and negative offsets.
2.0 버전부터 사용할 수 있습니다.
Enhanced: 2.5 - added support for GEOMETRYCOLLECTION and MULTILINESTRING
|
|
|
This function ignores the Z dimension. It always gives a 2D result even when used on a 3D geometry. |
Compute an open buffer around roads.
SELECT ST_Union(
ST_OffsetCurve(f.geom, f.width/2, 'quad_segs=4 join=round'),
ST_OffsetCurve(f.geom, -f.width/2, 'quad_segs=4 join=round')
) as track
FROM someroadstable;
Offset 15 units with quad_segs=4 join=round.
SELECT ST_OffsetCurve(
ST_GeomFromText('LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
44 16,24 16,20 16,18 16,17 17,
16 18,16 20,16 40,16 60,16 80,16 100,
16 120,16 140,16 160,16 180,16 195)'),
15, 'quad_segs=4 join=round');
LINESTRING(164 1,18 1,15.073645169758077 1.288220793951544,
12.259748514523654 2.141807012330698,9.66644650470597 3.527955815461818,
7.393398282201788 5.393398282201788,5.393398282201788 7.393398282201788,
3.527955815461818 9.66644650470597,2.141807012330696 12.259748514523654,
1.288220793951544 15.073645169758075,1 18,1 195)
Offset -15 units with quad_segs=4 join=round.
SELECT ST_OffsetCurve(
geom,
-15,
'quad_segs=4 join=round') As notsocurvy
FROM ST_GeomFromText('LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
44 16,24 16,20 16,18 16,17 17,
16 18,16 20,16 40,16 60,16 80,16 100,
16 120,16 140,16 160,16 180,16 195)') As geom;
LINESTRING(164 31,31 31,31 195)
Apply two negative offsets to obtain a smoother curve; the distances combine to -45 units.
SELECT ST_OffsetCurve(
ST_OffsetCurve(
geom,
-30,
'quad_segs=4 join=round'),
-15,
'quad_segs=4 join=round') As morecurvy
FROM ST_GeomFromText('LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
44 16,24 16,20 16,18 16,17 17,
16 18,16 20,16 40,16 60,16 80,16 100,
16 120,16 140,16 160,16 180,16 195)') As geom;
LINESTRING(164 61,61 61,61 195)
Collect the positive offset and the double-offset to produce parallel curves.
SELECT ST_Collect(
ST_OffsetCurve(geom, 15, 'quad_segs=4 join=round'),
ST_OffsetCurve(
ST_OffsetCurve(
geom,
-30,
'quad_segs=4 join=round'),
-15,
'quad_segs=4 join=round')
) As parallel_curves
FROM ST_GeomFromText('LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
44 16,24 16,20 16,18 16,17 17,
16 18,16 20,16 40,16 60,16 80,16 100,
16 120,16 140,16 160,16 180,16 195)') As geom;
MULTILINESTRING((164 1,18 1,15.073645169758077 1.288220793951544, 12.259748514523654 2.141807012330698,9.66644650470597 3.527955815461818, 7.393398282201788 5.393398282201788,5.393398282201788 7.393398282201788, 3.527955815461818 9.66644650470597,2.141807012330696 12.259748514523654, 1.288220793951544 15.073645169758075,1 18,1 195),(164 61,61 61,61 195))
Offset 15 units with a bevel join.
SELECT ST_OffsetCurve(
ST_GeomFromText('LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
44 16,24 16,20 16,18 16,17 17,
16 18,16 20,16 40,16 60,16 80,16 100,
16 120,16 140,16 160,16 180,16 195)'),
15, 'quad_segs=4 join=bevel');
LINESTRING(164 1,18 1,7.393398282201788 5.393398282201788,
5.393398282201788 7.393398282201788,1 18,1 195)
Collect offsets on both sides using a mitre join and a mitre limit of 2.2.
SELECT ST_Collect(
ST_OffsetCurve(geom, 15, 'quad_segs=4 join=mitre mitre_limit=2.2'),
ST_OffsetCurve(geom, -15, 'quad_segs=4 join=mitre mitre_limit=2.2')
)
FROM ST_GeomFromText('LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
44 16,24 16,20 16,18 16,17 17,
16 18,16 20,16 40,16 60,16 80,16 100,
16 120,16 140,16 160,16 180,16 195)') As geom;
MULTILINESTRING((164 1,11.786796564403577 1,1 11.786796564403577,1 195),
(164 31,31 31,31 195))