1. ST_Buffer
ST_Buffer
- (T)返回一个几何图形,覆盖从输入几何图形给定距离内的所有点。
1.1. 概要
geometry ST_Buffer(geometry g1, float radius_of_buffer);
geometry ST_Buffer(geometry g1, float radius_of_buffer, integer num_seg_quarter_circle);
geometry ST_Buffer(geometry g1, float radius_of_buffer, text buffer_style_parameters);
geography ST_Buffer(geography g1, float radius_of_buffer_in_meters);
geography ST_Buffer(geography g1, float radius_of_buffer, integer num_seg_quarter_circle);
geography ST_Buffer(geography g1, float radius_of_buffer, text buffer_style_parameters);
1.2. 描述
返回一个几何/地理值,表示与此几何/地理值的距离小于或等于距离的所有点。
几何学:计算在几何学的空间参考系统中。 在1.5中引入了不同的端盖和斜盖设置来控制形状。
负半径:对于多边形,可以使用负半径,这将收缩多边形而不是扩大它。
地理:对于地理来说,这实际上是对几何实现的一个薄薄的包装。 它首先确定适合地理对象的边界框的最佳SRID(有利于UTM, Lambert Azimuthal Equal Area (LAEA)北极/南极,并在最坏的情况下落回到mercator),然后在该平面空间参考缓冲区,并重新转换回WGS84地理。
对地理这可能不会像预期如果对象是足够大,它介于两个UTM区或跨越国际日期变更线增强:2.5.0 ST_Buffer几何支持增强的同时允许缓冲规范一起= | |左右可用性:1.5 - ST_Buffer增强,支持不同结束描述和连接类型。 这些是有用的,例如,转换道路线字符串为多边形道路与平或正方形的边缘,而不是圆角的边缘。 添加了地理信息的薄包装。 需要GEOS >= 3.2来利用高级几何功能。
可选的第三个参数(目前只适用于几何)可以指定用于近似四分之一圆的段的数量(整数情况,默认为8)或空白分隔的键值对列表(字符串情况),以调整操作如下:
-
quad_segs=#
:用于近似四分之一圆的线段数(默认为8)。 -
endcap=round|flat|square
: endcap样式(默认为“round”,需要GEOS-3.2或更高的值)。 “butt”也可以作为“flat”的同义词。 -
join=round|mitre|bevel
: 连接样式(默认为“round”,需要GEOS-3.2或更高的值)。 ’ miter ‘也被认为是’ mitre '的同义词。 -
mitre_limit=#.#
: 斜接比率限制(只影响斜接连接风格)。 ’ miter_limit ‘也可以作为’ mitre_limit '的同义词。 -
side=both|left|right
: “左”或“右”在几何图形上执行单面缓冲,缓冲的一面相对于线的方向。 这只与LINESTRING几何有关,并不影响点或多边形几何。 默认情况下,端帽是方形的。
半径的单位是以空间参考系的单位来度量的。
输入参数可以是: POINTS, MULTIPOINTS, LINESTRINGS, MULTILINESTRINGS, POLYGONS, MULTIPOLYGONS和GeometryCollections
这个函数忽略了第三维(z),即使是在呈现3d几何图形时,也总是给出一个2d缓冲区。
人们经常犯这样的错误,用这个函数来做半径搜索。 为半径搜索创建缓冲区是缓慢且毫无意义的。 使用ST_DWithin代替。
1.3. 样例
- quad_segs=8 (default)
SELECT ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=8');
- quad_segs=2 (lame)
SELECT ST_Buffer(ST_GeomFromText('POINT(100 90)'),50, 'quad_segs=2');
- endcap=round join=round (default)
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');
- join=bevel
SELECT ST_Buffer(ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'), 10, 'join=bevel');
- join=mitre mitre_limit=5.0 (default mitre limit)
SELECT ST_Buffer(ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'), 10, 'join=mitre mitre_limit=5.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');
- right-hand-winding, polygon boundary 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');
- right-hand-winding, polygon boundary 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')
- 具体使用
- 缓冲点近似于一个圆
- 缓冲点强迫近似(见图)
- 每四分之一个圆有2个点是8条边的多边形(见图)
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 |
- 一个更轻但更跛的圆圈
- 每四分之一个圆只有2个点是一个八边形
- 下面是一个100米的八边形
注意坐标在NAD 83长lat中,我们将其转换为质量状态平面米,然后缓冲以米为单位进行测量;
SELECT ST_AsText(ST_Buffer(ST_Transform(ST_SetSRID(ST_MakePoint(-71.063526, 42.35785),4269), 26986),100,2)) As octagon;
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)) |
2. ST_BuildArea
ST_BuildArea
-创建一个由给定几何体的组成线组成的区域几何体
2.1. 概要
geometry ST_BuildArea(geometry A);
2.2. 描述
创建一个由给定几何体的组成线组成的区域几何体。 返回类型可以是Polygon或MultiPolygon,这取决于输入。 如果输入的线条不形成多边形,则返回NULL。 输入可以是LINESTRINGS、MULTILINESTRINGS、polygon、multipolygon和GeometryCollections。
- 这个函数将假定所有的内部几何图形都代表孔
输入线必须被正确的点,这个函数才能正常工作
2.3. 样例
- This will create a donut 这样就可以做成甜甜圈了
SELECT ST_BuildArea(ST_Collect(smallc,bigc)) FROM (SELECTST_Buffer(ST_GeomFromText('POINT(100 90)'), 25) As smallc,ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50) As bigc) As foo;
- This will create a gaping hole inside the circle with prongs sticking out 这将在圆的内部形成一个有尖头伸出的大洞
SELECT ST_BuildArea(ST_Collect(line,circle))
FROM (SELECTST_Buffer(ST_MakeLine(ST_MakePoint(10, 10),ST_MakePoint(190, 190)),5) As line,ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50) As circle) As foo;
--这就造成了同样的大洞
--而是用线条代替多边形
SELECT ST_BuildArea(ST_Collect(ST_ExteriorRing(line),ST_ExteriorRing(circle)))
FROM (SELECT ST_Buffer(ST_MakeLine(ST_MakePoint(10, 10),ST_MakePoint(190, 190)),5) As line,ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50) As circle) As foo;