首页Python【Shapely矢量数据空...

【Shapely矢量数据空间分析】10.空间分析方法——buffer()缓冲区分析


本系列文章是根据Shapely官方文档翻译整理,学习任何一个Python第三方库,其官方文档都是最好的学习资料。相比网络搜索得到的一些资料,官方文档是权威的一手资料,其内容全面、准确可靠。通过官方文档入手,能够保证学习认知不会有大偏差。在学习完官方文档后,可以在寻找其他资料进一步学习。

点击“阅读原文”或者直接访问下方链接,查看翻译整理的“Shapely 2.0.0 中文文档”。

https://www.mizhushare.com/docs/shapely-2-0-0-%e4%b8%ad%e6%96%87%e6%96%87%e6%a1%a3/
本系列文章配套代码获取有以下两种途径:
  • 可以通过百度网盘获取,需要在本地配置代码运行环境:
链接:https://pan.baidu.com/s/1iWGGhB4kra9V7bUj-CWR0w?pwd=mnsj 提取码:mnsj
  • 前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Shapely




Shapely的几何对象有几种方法可以构建新对象,而不是基于集合论的分析方法。
本篇主要介绍buffer()缓冲分析。
1object.buffer(distance, 
2              quad_segs=16
3              cap_style=1
4              join_style=1
5              mitre_limit=5.0
6              single_sided=False)

返回该几何对象指定距离内的所有点的近似表示,即生成缓冲区。

端头的样式是由整数值指定的。1(圆),2(平),3(方)。这些值也被shapely.BufferCapStyle对象所枚举:

shapely.BufferCapStyle
Attribute Value
round 1
flat 2
square 3
偏移段之间的连接方式由整数值指定。1(圆形)、2(斜角)和3(斜面)。这些值也被shapely.BufferJoinStyle对象所枚举:
shapely.BufferJoinStyle
Attribute Value
round 1
mitre 2
bevel 3
1>>> from shapely import BufferCapStyle, BufferJoinStyle
2
3# 端头样式
4>>> BufferCapStyle.flat.value
52
6
7# 偏移段之间的连接方式
8>>> BufferJoinStyle.bevel.value
93
  • distance参数:

指定缓冲区距离。正的距离有扩张的效果;负的距离有侵蚀的效果。

 1>>> line = LineString([(00), (11), (02), (22), (31), (10)])
2>>> line
3<LINESTRING (0 01 10 22 23 11 0)>
4
5# 对线要素按照0.5的距离进行缓冲操作
6>>> dilated = line.buffer(0.5)
7>>> dilated
8<POLYGON ((0.293 1, -0.354 1.646, -0.387 1.683, -0.416 1.722, -0.441 1.764, ...>
9
10# 对上一步的缓冲结果按照-0.3的距离再次进行缓冲操作
11>>> eroded = dilated.buffer(-0.3)
12>>> eroded
13<POLYGON ((0.505 0.7880.593 10.505 1.212, -0.136 1.853, -0.154 1.873, -0...>

两次缓冲结果如下图所示(线的扩张(左)和多边形的侵蚀(右),新对象以蓝色显示。):

  • quad_segs 参数:

    决定了用于近似包围一个点的四分之一圆的段数,即结果的光滑程度。点的默认缓冲区是一个多边形图斑(quad_segs  参数为16),其面积为它所近似的圆形的99.8%。

 1>>> p = Point(00).buffer(10.0)
2>>> p
3<POLYGON ((10 09.952 -0.989.808 -1.9519.569 -2.9039.239 -3.8278.81...>
4
5>>> len(p.exterior.coords)
665
7
8>>> p.area
9313.6548490545941
10
11>>> import math
12>>> p.area / (math.pi * 10 * 10)
130.9983943930356188

quad_segs 参数为1的情况下,缓冲区是一个矩形。

1>>> q = Point(00).buffer(10.0 , quad_segs=1)
2>>> q
3<POLYGON ((10 00 -10, -10 00 1010 0))>
4
5>>> len(q.exterior.coords)
65
7
8>>> q.area
9200.0
  • single_sided参数:

用于指定是否只在一侧生成缓冲区,默认为False,会在两侧生成缓冲区。

根据缓冲距离的符号决定生成缓冲区的方向。正的距离表示左边,负的距离表示右边。

点状几何要素的单边缓冲区与普通缓冲区相同。单面缓冲区的端部样式总是设定为BufferCapStyle.flat

 1>>> line = LineString([(00), (11), (02), (22), (31), (10)])
2>>> line
3<LINESTRING (0 01 10 22 23 11 0)>
4
5# 正的距离表示左边
6>>> left_hand_side = line.buffer(0.5, single_sided=True)
7>>> left_hand_side
8<POLYGON ((1 03 12 20 21 10 0, -0.354 0.3540.293 1, -0.354 1.646...>
9
10# 的距离表示右边
11>>> right_hand_side = line.buffer(-0.3, single_sided=True)
12>>> right_hand_side
13<POLYGON ((0 01 10 22 23 11 00.866 0.2682.494 1.0821.876 1.7...>

两次缓冲结果如下图所示(0.5缓冲距离(左)和0.3缓冲距离(右)生成的单面缓冲区):

  • buffer(distance=0)操作:

传递一个0的距离,buffer()操作有时可以用来清除自接触或自交叉的多边形,如经典的 “领结”形式。根据网友的日常经验,非常小的距离值有时会产生比0更干净的结果。在清除此类多边形时,依实际情况可能有差别。

此时,缓冲区操作将多边形在它们接触的地方一分为二。

 1# 生成经典的 “领结”形式
2>>> coords = [(00), (02), (11), (22), (20), (11), (00)]
3>>> bowtie = Polygon(coords)
4>>> bowtie
5<POLYGON ((0 00 21 12 22 01 10 0))>
6>>> bowtie.is_valid
7False
8
9# buffer(distance=0)操作
10>>> clean = bowtie.buffer(0)
11>>> clean
12<MULTIPOLYGON (((0 00 21 10 0)), ((1 12 22 01 1)))>
13>>> clean.is_valid
14True
15>>> len(clean.geoms) # 缓冲区操作将多边形在它们接触的地方一分为二
162
17>>> clean.geoms[0]
18<POLYGON ((0 00 21 10 0))>
19>>> list(clean.geoms[0].exterior.coords)
20[(0.00.0), (0.02.0), (1.01.0), (0.00.0)]
21>>> list(clean.geoms[1].exterior.coords)
22[(1.01.0), (2.02.0), (2.00.0), (1.01.0)]

缓冲结果如下图所示(原始几何对象(左)和处理后的几何对象(右),新对象以蓝色显示。):


END


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments