Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


ST_BUFFER

📄字数 2.5K
👁️阅读量 加载中...

功能描述

计算表示与几何/地理距离小于或等于给定距离的所有点的 POLYGON 或 MULTIPOLYGON。

语法格式

sql
GEOMETRY ST_BUFFER(GEOMETRY g1, DOUBLE radius_of_buffer, VARCHAR buffer_style_parameters = '');
GEOMETRY ST_BUFFER(GEOMETRY g1, DOUBLE radius_of_buffer, INTEGER num_seg_quarter_circle);
GEOGRAPHY ST_BUFFER(GEOGRAPHY g1, DOUBLE radius_of_buffer, VARCHAR buffer_style_parameters);
GEOGRAPHY ST_BUFFER(GEOGRAPHY g1, DOUBLE radius_of_buffer, INTEGER num_seg_quarter_circle);

参数说明

  • g1:目标 GEOMETRY/GEOGRAPHY 对象。
  • radius_of_buffer:半径。对于几何体,半径以几何体的空间参考系的单位指定。 对于地理,半径以米为单位指定。
  • buffer_style_parameters:精度和样式。空格分隔的键=值对列表,如下所示:
字段名称描述类型默认值说明
quad_segs近似四分之一圆的线段数INTEGER8值越大,弧段越光滑
endcap封端样式VARCHARround可选值:round|flat|square
join连接样式VARCHARround可选值:round|mitre|bevel
mitre_limit斜接连接值DOUBLE5.0最大值:5.0
side位置VARCHARround可选值:both|left|right。'left' 或 'right' 在几何体上执行单边缓冲,缓冲边相对于线的方向。仅适用于 LINESTRING 几何图形,不影响 POINT 或 POLYGON 几何图形。
  • num_seg_quarter_circle:缓冲区中圆弧的精度。指定为用于近似四分之一圆的线段数,默认值为 8。

函数返回类型

GEOMETRY/GEOGRAPHY 类型

使用说明

  • 负距离会缩小几何图形。
  • 对于多边形,负距离可能会完全缩小多边形,在这种情况下返回 POLYGON EMPTY。
  • 对于点和线,负距离始终返回空结果。
  • 对于地理数据,是对几何数据实现的一个轻量级封装。 它确定最适合地理对象边界框的平面空间参考系统(尝试 UTM、兰伯特方位角等积(LAEA)北/南极,最后是墨卡托)。缓冲区在平面空间中计算,然后转换回WGS84。如果输入对象远大于UTM区域或跨越日期变更线,这可能不会产生所需的行为。
  • 缓冲区输出始终是有效的多边形几何体。缓冲区可以处理无效输入,因此距离0的缓冲有时被用作修复无效多边形的一种方法。ST_MakeValid也可用于此目的。
  • 缓冲可用于执行近距离搜索。对于此用例,使ST_DWithin效率更高。
  • 此函数忽略Z维度。 即使在3D几何体上使用时,也始终给出2D结果。
  • 此函数是由GEOS模块执行。

示例

  • 四分之一圆的线段数不同

近似四分之一圆的线段数不同的对比,quad_segs = 8(默认)与 quad_segs = 2(不足):

sql
SELECT 
ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=8') AS seg_8,
ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2') AS seg_2;
quad_segs_8.pngquad_segs_2.png
quad_segs=8(默认)quad_segs = 2 (不足)
  • 封端样式不同

封端样式不同的对比,endcap=round、endcap=square、endcap=flat(join=round(默认)):

sql
SELECT 
ST_Buffer(ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'), 10, 'endcap=round join=round') AS round,
ST_Buffer(ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'), 10, 'endcap=square join=round') AS square,
ST_Buffer(ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'), 10, 'endcap=flat join=round') AS flat;
endcap_round.pngendcap_square.pngendcap_flat.png
endcap=round join=round (默认)endcap=squareendcap=flat
  • 边样式不同
sql
SELECT 
ST_Buffer(ST_ForceRHR(ST_Boundary(ST_GeomFromText('POLYGON ((50 50, 50 150, 150 150, 150 50, 50 50))'))),20, 'side=left') AS side_left,
ST_Buffer(ST_ForceRHR(ST_Boundary(ST_GeomFromText('POLYGON ((50 50, 50 150, 150 150, 150 50, 50 50))'))), 20,'side=right') AS side_right;
side_left.pngside_right.png
顺时针方向,多边形边界向左顺时针方向,多边形边界向右
  • 八边形

100米的八边形,即四分之一圆上2个点。

sql
SQL> SELECT ST_ASTEXT(ST_BUFFER(
     ST_TRANSFORM(
     ST_SETSRID(ST_POINT(-71.063526, 42.35785),4269), 26986)
     ,100,2)) As octagon;

+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                                                                                                                                     OCTAGON                                                                                                                                                                      |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| POLYGON((236057.5905746494 900908.7599186976,236028.30125276805 900838.049240579,235957.5905746494 900808.7599186976,235886.87989653074 900838.049240579,235857.5905746494 900908.7599186976,235886.87989653074 900979.4705968163,235957.5905746494 901008.7599186976,236028.30125276805 900979.4705968163,236057.5905746494 900908.7599186976)) |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

(1 row)
octagon.png
100 米的八边形,即四分之一圆上 2 个点