ST_OffsetCurve — 從輸入線段以指定的距離和側邊返回偏移線段。
geometry ST_OffsetCurve(
geometry line, float signed_distance, text style_parameters='')
;
從輸入線段以指定的距離和側邊返回偏移線段。返回幾何形狀的所有點與輸入幾何形狀的距離都不會超過給定的距離。適用於計算中心線的平行線。
對於正距離,偏移位於輸入線段的左側,並保持相同的方向。對於負距離,偏移位於右側,且方向相反。
距離單位以空間參考系統的單位來衡量。
請注意,對於某些拼圖形狀的輸入幾何形狀,輸出可能是 MULTILINESTRING 或 EMPTY。
可選的第三個參數允許指定以空格分隔的 key=value 對列表,以調整操作,如下所示:
'quad_segs=#':用於逼近四分之一圓的線段數量(預設為 8)。
'join=round|mitre|bevel':連接樣式(預設為 "round")。'miter' 也被接受為 'mitre' 的同義詞。
'mitre_limit=#.#':斜接比率限制(僅影響斜接連接樣式)。'miter_limit' 也被接受為 'mitre_limit' 的同義詞。
由 GEOS 模組執行。
GEOS 3.11 中變更的行為,因此偏移曲線現在具有與輸入線相同的方向,無論是正偏移還是負偏移。
可用性:2.0
增強功能:2.5 - 新增對 GEOMETRYCOLLECTION 和 MULTILINESTRING 的支援
![]() |
|
此函數會忽略 Z 維度。即使在 3D 幾何形狀上使用,它始終會給出 2D 結果。 |
計算道路周圍的開放緩衝區
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;
![]() 15,'quad_segs=4 join=round' 原始線段及其偏移 15 個單位。
SELECT ST_AsText(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'));
output
LINESTRING(164 1,18 1,12.2597485145237 2.1418070123307,
7.39339828220179 5.39339828220179,
5.39339828220179 7.39339828220179,
2.14180701233067 12.2597485145237,1 18,1 195)
|
![]() -15,'quad_segs=4 join=round' 原始線段及其偏移 -15 個單位
SELECT ST_AsText(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;
notsocurvy
LINESTRING(31 195,31 31,164 31)
|
![]() 雙重偏移以獲得更彎曲的效果,請注意,第一個反轉了方向,因此 -30 + 15 = -15
SELECT ST_AsText(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;
morecurvy
LINESTRING(164 31,46 31,40.2597485145236 32.1418070123307,
35.3933982822018 35.3933982822018,
32.1418070123307 40.2597485145237,31 46,31 195)
|
![]() 雙重偏移以獲得更彎曲的效果,並與常規偏移 15 結合以獲得平行線。與原始線段疊加。
SELECT ST_AsText(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;
parallel curves
MULTILINESTRING((164 1,18 1,12.2597485145237 2.1418070123307,
7.39339828220179 5.39339828220179,5.39339828220179 7.39339828220179,
2.14180701233067 12.2597485145237,1 18,1 195),
(164 31,46 31,40.2597485145236 32.1418070123307,35.3933982822018 35.3933982822018,
32.1418070123307 40.2597485145237,31 46,31 195))
|
![]() 15,'quad_segs=4 join=bevel' 顯示與原始線段
SELECT ST_AsText(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'));
output
LINESTRING(164 1,18 1,7.39339828220179 5.39339828220179,
5.39339828220179 7.39339828220179,1 18,1 195)
|
![]() 15, -15 收集,join=mitre mitre_limit=2.1
SELECT ST_AsText(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;
output
MULTILINESTRING((164 1,11.7867965644036 1,1 11.7867965644036,1 195),
(31 195,31 31,164 31))
|