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 | 近似四分之一圆的线段数 | INTEGER | 8 | 值越大,弧段越光滑 |
| endcap | 封端样式 | VARCHAR | round | 可选值:round|flat|square |
| join | 连接样式 | VARCHAR | round | 可选值:round|mitre|bevel |
| mitre_limit | 斜接连接值 | DOUBLE | 5.0 | 最大值:5.0 |
| side | 位置 | VARCHAR | round | 可选值: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(默认) | 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 join=round (默认) | endcap=square | endcap=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;![]() | ![]() |
|---|---|
| 顺时针方向,多边形边界向左 | 顺时针方向,多边形边界向右 |
- 八边形
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)![]() |
|---|
| 100 米的八边形,即四分之一圆上 2 个点 |








