PostGIS的Geometry Processing 几何处理_1 ST_Buffer&&ST_BuildArea

本文深入探讨了GIS中的两个关键函数:ST_Buffer和ST_BuildArea。ST_Buffer用于创建几何图形的缓冲区,支持多种参数以定制缓冲形状,如端点样式、连接类型和四分之一圆的段数。此函数在地理空间分析中用于扩展或收缩几何对象。另一方面,ST_BuildArea则将线条组合成多边形,可用于构建区域或识别空洞。文章通过示例展示了如何使用这两个函数,并强调了它们在处理地理数据时的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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. 样例

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

  1. 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')

在这里插入图片描述

  1. 具体使用
  • 缓冲点近似于一个圆
  • 缓冲点强迫近似(见图)
  • 每四分之一个圆有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_pcountlamecircle_pcount
339
  • 一个更轻但更跛的圆圈
  • 每四分之一个圆只有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;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九又四分之三站台Emm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值