名称

ST_Buffer — 计算一个几何对象,该对象覆盖所有与给定几何对象距离在指定范围内的点。

概要

geometry ST_Buffer(geometry g1, float radius_of_buffer, text buffer_style_parameters = '');

geometry ST_Buffer(geometry g1, float radius_of_buffer, integer num_seg_quarter_circle);

geography ST_Buffer(geography g1, float radius_of_buffer, text buffer_style_parameters);

geography ST_Buffer(geography g1, float radius_of_buffer, integer num_seg_quarter_circle);

描述

计算一个 POLYGON 或 MULTIPOLYGON,表示所有与几何/地理对象距离小于或等于给定距离的点。负距离会缩小几何对象而不是扩大它。负距离可能会完全缩小一个多边形,在这种情况下会返回 POLYGON EMPTY。对于点和线,负距离总是返回空结果。

对于几何对象,距离以几何对象的空间参考系统的单位指定。对于地理对象,距离以米为单位指定。

可选的第三个参数控制缓冲区的精度和样式。缓冲区中圆弧的精度指定为用于近似四分之一圆的线段数(默认为 8)。可以通过提供一个以空格分隔的键=值对列表来指定缓冲区样式,如下所示:

  • 'quad_segs=#':用于近似四分之一圆的线段数(默认为 8)。

  • 'endcap=round|flat|square':端盖样式(默认为“round”)。 'butt' 被接受为 'flat' 的同义词。

  • 'join=round|mitre|bevel':连接样式(默认为“round”)。 'miter' 被接受为 'mitre' 的同义词。

  • 'mitre_limit=#.#':斜接比率限制(仅影响斜接连接样式)。 'miter_limit' 被接受为 'mitre_limit' 的同义词。

  • 'side=both|left|right':'left' 或 'right' 在几何对象上执行单边缓冲,缓冲侧相对于线的方向。这仅适用于 LINESTRING 几何对象,不影响 POINT 或 POLYGON 几何对象。默认情况下,端盖是方形的。

[Note]

对于地理对象,这是对几何对象实现的薄封装。它确定最适合地理对象边界框的平面空间参考系统(尝试 UTM、兰伯特方位等面积 (LAEA) 北/南极,最后是墨卡托投影)。缓冲区在平面空间中计算,然后转换回 WGS84。如果输入对象远大于 UTM 区域或跨越日期线,这可能不会产生预期的行为

[Note]

缓冲区输出始终是有效的多边形几何对象。缓冲区可以处理无效的输入,因此有时使用距离为 0 的缓冲作为修复无效多边形的一种方法。 ST_MakeValid 也可以用于此目的。

[Note]

缓冲有时用于执行距离内的搜索。对于这种情况,使用 ST_DWithin 更有效。

[Note]

此函数忽略 Z 维度。即使在 3D 几何对象上使用,它也始终给出 2D 结果。

增强:2.5.0 - ST_Buffer 几何支持得到增强,允许指定侧缓冲 side=both|left|right

可用性:1.5 - ST_Buffer 得到增强,支持不同的端盖和连接类型。例如,这些对于将道路线串转换为具有平边或方边而不是圆边的多边形道路很有用。添加了地理对象的薄封装。

由 GEOS 模块执行。

此方法实现了 OGC 简单要素 SQL 1.1 实现规范。 s2.1.1.3

此方法实现了 SQL/MM 规范。 SQL-MM IEC 13249-3: 5.1.30

示例

quad_segs=8 (默认)

SELECT ST_Buffer(
 ST_GeomFromText('POINT(100 90)'),
 50, 'quad_segs=8');
                

quad_segs=2 (较差)

SELECT ST_Buffer(
 ST_GeomFromText('POINT(100 90)'),
 50, 'quad_segs=2');
                

endcap=round join=round (默认)

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'endcap=round join=round');
                

endcap=square

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'endcap=square join=round');
                

endcap=flat

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'endcap=flat join=round');
                

join=bevel

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'join=bevel');
                

join=mitre mitre_limit=5.0 (默认斜接限制)

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'join=mitre mitre_limit=5.0');
                

join=mitre mitre_limit=1

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'join=mitre mitre_limit=1.0');
                

side=left

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'side=left');
                

side=right

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'side=right');
                

side=left join=mitre

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'side=left join=mitre');
                

右手法则缠绕,多边形边界 side=left

SELECT ST_Buffer(
ST_ForceRHR(
ST_Boundary(
 ST_GeomFromText(
'POLYGON ((50 50, 50 150, 150 150, 150 50, 50 50))'))),
 ), 20, 'side=left');
                

右手法则缠绕,多边形边界 side=right

SELECT ST_Buffer(
ST_ForceRHR(
ST_Boundary(
 ST_GeomFromText(
'POLYGON ((50 50, 50 150, 150 150, 150 50, 50 50))'))
), 20,'side=right')
                

--A buffered point approximates a circle
-- A buffered point forcing approximation of (see diagram)
-- 2 points per quarter circle is poly with 8 sides (see diagram)
SELECT ST_NPoints(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50)) As promisingcircle_pcount,
ST_NPoints(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 2)) As lamecircle_pcount;

promisingcircle_pcount | lamecircle_pcount
------------------------+-------------------
             33 |                9

--A lighter but lamer circle
-- only 2 points per quarter circle is an octagon
--Below is a 100 meter octagon
-- Note coordinates are in NAD 83 long lat which we transform
to Mass state plane meter and then buffer to get measurements in meters;
SELECT ST_AsText(ST_Buffer(
ST_Transform(
ST_SetSRID(ST_Point(-71.063526, 42.35785),4269), 26986)
,100,2)) As octagon;
----------------------
POLYGON((236057.59057465 900908.759918696,236028.301252769 900838.049240578,235
957.59057465 900808.759918696,235886.879896532 900838.049240578,235857.59057465
900908.759918696,235886.879896532 900979.470596815,235957.59057465 901008.759918
696,236028.301252769 900979.470596815,236057.59057465 900908.759918696))