对于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