對于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');
    1
  • 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');
    2
  • 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');
    3
  • 不同的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');
    4
  • 不同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');
    5