名稱

ST_Buffer — 計算一個幾何形狀,涵蓋所有距離某幾何形狀給定距離內的點。

概要

geometry ST_Buffer(geometry g1, float radius_of_buffer, text buffer_style_parameters = '');

geometry ST_Buffer(geometry g1, float radius_of_buffer, integer num_seg_quarter_circle);

geography ST_Buffer(geography g1, float radius_of_buffer, text buffer_style_parameters);

geography ST_Buffer(geography g1, float radius_of_buffer, integer num_seg_quarter_circle);

描述

計算一個 POLYGON 或 MULTIPOLYGON,表示所有距離幾何/地理物件小於或等於給定距離的點。負距離會縮小幾何形狀而非擴大。負距離可能會完全縮小多邊形,在這種情況下會返回 POLYGON EMPTY。對於點和線,負距離總是返回空的結果。

對於幾何形狀,距離以幾何形狀的空間參考系統的單位指定。對於地理物件,距離以公尺指定。

可選的第三個參數控制緩衝區的精確度和樣式。緩衝區中圓弧的精確度被指定為用於近似四分之一圓的線段數(預設值為 8)。緩衝區樣式可以透過提供以空白分隔的鍵=值對列表來指定,如下所示:

  • 'quad_segs=#':用於近似四分之一圓的線段數(預設值為 8)。

  • 'endcap=round|flat|square':端點帽樣式(預設為 "round")。'butt' 被接受為 'flat' 的同義詞。

  • 'join=round|mitre|bevel':連接樣式(預設為 "round")。'miter' 被接受為 'mitre' 的同義詞。

  • 'mitre_limit=#.#':斜接比率限制(僅影響斜接連接樣式)。'miter_limit' 被接受為 'mitre_limit' 的同義詞。

  • 'side=both|left|right':'left' 或 'right' 對幾何形狀執行單邊緩衝,緩衝側相對於線的方向。這僅適用於 LINESTRING 幾何形狀,不影響 POINT 或 POLYGON 幾何形狀。預設情況下,端點帽為方形。

[Note]

對於地理物件,這是一個圍繞幾何實作的薄包裝函式。它確定最適合地理物件邊界框的平面空間參考系統(嘗試 UTM、Lambert 方位等面積投影 (LAEA) 北/南極,最後是 Mercator 投影)。緩衝區在平面空間中計算,然後轉換回 WGS84。如果輸入物件遠大於 UTM 區域或跨越日期線,則可能不會產生預期的行為

[Note]

緩衝區輸出始終是有效的多邊形幾何形狀。緩衝區可以處理無效的輸入,因此有時使用距離 0 的緩衝來修復無效的多邊形。ST_MakeValid 也可用於此目的。

[Note]

緩衝區有時用於執行距離內搜尋。對於這種使用情況,使用 ST_DWithin 會更有效率。

[Note]

此函式會忽略 Z 維度。即使在 3D 幾何形狀上使用,它也始終會產生 2D 結果。

增強功能:2.5.0 - ST_Buffer 幾何支援已增強,允許指定邊緩衝區 side=both|left|right

可用性:1.5 - ST_Buffer 已增強,可支援不同的端點帽和連接類型。例如,這些可用於將道路線字串轉換為具有平坦或方形邊緣而不是圓形邊緣的多邊形道路。新增了地理物件的薄包裝函式。

由 GEOS 模組執行。

此方法實作 OGC 簡單功能 SQL 1.1 實作規範。 s2.1.1.3

此方法實作 SQL/MM 規範。SQL-MM IEC 13249-3: 5.1.30

範例

quad_segs=8(預設)

SELECT ST_Buffer(
 ST_GeomFromText('POINT(100 90)'),
 50, 'quad_segs=8');
                

quad_segs=2(不佳)

SELECT ST_Buffer(
 ST_GeomFromText('POINT(100 90)'),
 50, 'quad_segs=2');
                

endcap=round join=round(預設)

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'endcap=round join=round');
                

endcap=square

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'endcap=square join=round');
                

endcap=flat

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'endcap=flat join=round');
                

join=bevel

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'join=bevel');
                

join=mitre mitre_limit=5.0(預設斜接限制)

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'join=mitre mitre_limit=5.0');
                

join=mitre mitre_limit=1

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'join=mitre mitre_limit=1.0');
                

side=left

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'side=left');
                

side=right

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'side=right');
                

side=left join=mitre

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'side=left join=mitre');
                

右手繞組,多邊形邊界 side=left

SELECT ST_Buffer(
ST_ForceRHR(
ST_Boundary(
 ST_GeomFromText(
'POLYGON ((50 50, 50 150, 150 150, 150 50, 50 50))'))),
 ), 20, 'side=left');
                

右手繞組,多邊形邊界 side=right

SELECT ST_Buffer(
ST_ForceRHR(
ST_Boundary(
 ST_GeomFromText(
'POLYGON ((50 50, 50 150, 150 150, 150 50, 50 50))'))
), 20,'side=right')
                

--A buffered point approximates a circle
-- A buffered point forcing approximation of (see diagram)
-- 2 points per quarter circle is poly with 8 sides (see diagram)
SELECT ST_NPoints(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50)) As promisingcircle_pcount,
ST_NPoints(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 2)) As lamecircle_pcount;

promisingcircle_pcount | lamecircle_pcount
------------------------+-------------------
             33 |                9

--A lighter but lamer circle
-- only 2 points per quarter circle is an octagon
--Below is a 100 meter octagon
-- Note coordinates are in NAD 83 long lat which we transform
to Mass state plane meter and then buffer to get measurements in meters;
SELECT ST_AsText(ST_Buffer(
ST_Transform(
ST_SetSRID(ST_Point(-71.063526, 42.35785),4269), 26986)
,100,2)) As octagon;
----------------------
POLYGON((236057.59057465 900908.759918696,236028.301252769 900838.049240578,235
957.59057465 900808.759918696,235886.879896532 900838.049240578,235857.59057465
900908.759918696,235886.879896532 900979.470596815,235957.59057465 901008.759918
696,236028.301252769 900979.470596815,236057.59057465 900908.759918696))