Name

ST_Buffer — 计算覆盖距几何图形给定距离内的所有点的几何图形。

Synopsis

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 Empty。对于点和线,负距离始终返回空结果。

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

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

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

  • ‘endCap=圆形|扁平|正方形’:收头样式(默认为“圆形”)。‘Butt’被认为是‘Flat’的同义词。

  • ‘JOIN=ROUND|MITRE|BEVELL’:连接样式(默认为“ROUND”)。‘miter’被认为是‘mitre’的同义词。

  • ‘Mitre_Limit=#.#’:斜接比例限制(仅影响斜接样式)。‘Miter_Limit’被接受为‘Mitre_Limit’的同义词。

  • ‘side=Both|Left|Right’:‘Left’或‘Right’在几何体上执行单面缓冲区,缓冲区的一侧相对于直线的方向。这仅适用于LINESTRING几何图形,不影响点几何图形或多边形几何图形。默认情况下,末端封口为正方形。

[Note]

对于地理,这是几何实现的包装器。它确定最适合地理对象边界框的平面空间参考系(尝试UTM、Lambert方位等面积(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,以支持不同的EndCaps和Join类型。例如,在将道路线串转换为具有平边或方形边而不是圆边的多边形道路时,这些选项非常有用。添加了地理的薄包装器。

由GEOS模块执行。

This method implements the OGC Simple Features Implementation Specification for SQL 1.1. s2.1.1.3

This method implements the SQL/MM specification. SQL-MM 3:5.1.17

示例

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

端盖=圆形连接=圆形(默认)

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

收头=正方形

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

收头=平面

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

连接=倒角

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

JOIN=斜接限制=5.0(默认斜接限制)

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

连接=斜接_限制=1

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

侧边=左侧

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

侧=右

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

侧=左连接=斜接

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

右侧缠绕,多边形边界边=左侧

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

右侧缠绕,多边形边界边=右侧

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))
        

另请参阅

ST_Collect, ST_DWithin, ST_SetSRID, ST_Transform, ST_Union, ST_MakeValid