對于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 | 可選值為:roundflatsquare。 |
join | 連接方式。 | string | round | 可選值為:roundmitrebevel。 |
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');