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