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' :endcap 样式(默认为“round”)。 “butt”被认为是“flat”的同义词。
'join=round|mitre|bevel' :连接样式(默认为“round”)。 “mitre”被认为是“mitre”的同义词。
'mitre_limit=#.#' :斜接比率限制(仅影响斜接连接样式)。 “miter_limit”被接受为“mitre_limit”的同义词。
'side=both|left|right' :'left' 或 'right' 在几何体上执行单边缓冲,缓冲边相对于线的方向。 这仅适用于 LINESTRING 几何图形,不影响 POINT 或 POLYGON 几何图形。 默认情况下,终止样式是方形的。
对于地理数据,这是对几何数据实现的一个轻量级封装。 它确定最适合地理对象边界框的平面空间参考系统(尝试 UTM、兰伯特方位角等积 (LAEA) 北/南极,最后是墨卡托)。 缓冲区在平面空间中计算,然后转换回 WGS84。 如果输入对象远大于 UTM 区域或跨越日期变更线,这可能不会产生所需的行为 |
缓冲区输出始终是有效的多边形几何体。 缓冲区可以处理无效输入,因此距离 0 的缓冲有时被用作修复无效多边形的一种方法。 ST_MakeValid也可用于此目的。 |
缓冲有时用于执行近距离搜索。 对于此用例,使用ST_DWithin效率更高。 |
此函数忽略 Z 维度。 即使在 3D 几何体上使用时,它也始终给出 2D 结果。 |
增强:2.5.0 - ST_Buffer的几何感知版本已得到增强,允许您指定要缓冲的一侧。side=both|left|right
。
可用性:1.5 - ST_Buffer 已得到增强,以适应各种端接和接缝。 例如,您可能希望将道路线串转换为街道面,并希望将端点视为平面或正方形而不是圆。 添加了地理的薄包装器。
这个函数是由 GEOS 模块执行的。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.1.3
该方法实现了SQL/MM规范。 SQL-MM IEC 13249-3: 5.1.30
SELECT ST_Buffer( ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=8');
|
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');
|
SELECT ST_Buffer( ST_GeomFromText( 'LINESTRING(50 50,150 150,150 50)' ), 10, 'join=mitre mitre_limit=5.0');
|
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))