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

可选值为:

  • round

  • flat

  • square

join

连接方式。

string

round

可选值为:

  • round

  • mitre

  • bevel

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