对于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');