對於Geometry類型對象,返回以給定點為中心點,距離小於或等於指定距離的所有點組成的Geometry對象。對於Geography類型對象,則在幾何空間參考系中計算。
文法
geometry ST_Buffer(geometry g1 , float radiusOfBuffer);
geometry ST_Buffer(geometry g1 , float radiusOfBuffer , integer numSegQuarterCircle);
geometry ST_Buffer(geometry g1 , float radiusOfBuffer , text bufferStyleParameters);
geography ST_Buffer(geography g1 , float radiusOfBufferInMeters);
geography ST_Buffer(geography g1 , float radiusOfBuffer , integer numSegQuarterCircle);
geography ST_Buffer(geography g1 , float radiusOfBuffer , text bufferStyleParameters);
參數
| 參數名稱 | 描述 |
| g1 | 目標Geometry對象或Geography對象。 |
| radiusOfBuffer | Buffer半徑。只適用於Geometry對象。 |
| numSegQuarterCircle | 指定分隔四分之一圓的弧段的數量,預設為7次分隔。 |
| bufferStyleParameters | 空格分隔的索引值對參數。 |
| radiusOfBufferInMeters | Buffer半徑,半徑為米。只適用於Geography對象。 |
描述
- 對於Polygon對象來說,如果使用負值的半徑,這意味著收縮而不是擴充它。
- 半徑單位以空間參考系規定的單位為準。
- 對Geography類型對象的來說,該函數實際上是對Geometry類型實現的簡單封裝。它首先會選擇一個適用於Geography對象的bounding box的最佳SRID值,(偏向於使用UTM參考系,Lambert Azimuthal Equal Area(LAEA),南北極,最差的情況是使用墨卡托投影),然後在平面空間參考系中做緩衝,最後再重新轉換到WGS 84地理參考系中。
- 該函數不考慮第三維度(Z座標),即便輸入對象是一個3DGeometry對象,返回的也是2D的buffer。
- 使用者經常錯誤性地使用該函數來做半徑搜尋。建立一個緩衝區來做半徑搜尋是很慢且無效的。應該使用函數ST_DWithin來處理。
- bufferStyleParameters參數如下:
| 參數名稱 | 描述 | 類型 | 預設值 | 說明 |
| quad_segs | 用來近似四分之一圓的弧段數。 | integer | 8 | 數值越大,弧段越圓滑。 |
| endcap | 端蓋樣式。 | string | round | 可選值為: |
| join | 串連方式。 | string | round | 可選值為: |
| mitre_limit | 切割率限制。 | float | 5.0 | 隻影響mitre的串連方式。 |
| side | Buffer位置。 | string | -- | 可選值為:bothleftrightleft和right在Geometry對象上執行單面緩衝,其緩衝面相對於直線方向。Buffer位置只對LineString對象有意義,不影響Point對象和Polygon對象。 |
樣本
- 不同弧段分段數對比:
SELECT ST_Buffer('POINT(0 0)'::geometry,1),ST_Buffer('POINT(3 0)'::geometry,1,'quad_segs=2');

- 3種端蓋樣式對比:
SELECT ST_Buffer('LINESTRING(0 0,0 3)'::geometry,1,'endcap=round'),
ST_Buffer('LINESTRING(6 0,6 3)'::geometry,1,'endcap=flat'),
ST_Buffer('LINESTRING(12 0,12 3)'::geometry,1,'endcap=square');

- 3種串連樣式對比:
SELECT ST_Buffer('LINESTRING(0 0,3 0,3 3)'::geometry,1.2,'join=round'),
ST_Buffer('LINESTRING(6 0,9 0,9 3)'::geometry,1.2,'join=mitre'),
ST_Buffer('LINESTRING(12 0,15 0,15 3)'::geometry,1.2,'join=bevel');

- 不同的mitre_limit對比:
SELECT ST_Buffer('LINESTRING(0 0,3 0,3 3)'::geometry,1.2,'join=mitre mitre_limit=1.0'),
ST_Buffer('LINESTRING(6 0,9 0,9 3)'::geometry,1.2,'join=mitre mitre_limit=0.5'),
ST_Buffer('LINESTRING(12 0,15 0,15 3)'::geometry,1.2,'join=mitre mitre_limit=0.1');

- 不同Buffer位置對比:
SELECT ST_Buffer('LINESTRING(0 0,3 0,3 3,0 3)'::geometry,1,'side=both'),
ST_Buffer('LINESTRING(6 0,9 0,9 3,6 3)'::geometry,1,'side=right'),
ST_Buffer('LINESTRING(12 0,15 0,15 3,12 3)'::geometry,1,'side=left');
