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 几何体。默认情况下,端点为方形。
对于地理,这是一个围绕几何实现的薄包装器。 它确定一个平面空间参考系统,该系统最适合地理对象的外接矩形(尝试 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 模块执行。
此方法实现了 OGC Simple Features Implementation Specification for SQL 1.1.
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))