本系列文章是根据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 |
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([(0, 0), (1, 1), (0, 2), (2, 2), (3, 1), (1, 0)])
2>>> line
3<LINESTRING (0 0, 1 1, 0 2, 2 2, 3 1, 1 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.788, 0.593 1, 0.505 1.212, -0.136 1.853, -0.154 1.873, -0...>
两次缓冲结果如下图所示(线的扩张(左)和多边形的侵蚀(右),新对象以蓝色显示。):
-
quad_segs
参数:决定了用于近似包围一个点的四分之一圆的段数,即结果的光滑程度。点的默认缓冲区是一个多边形图斑(quad_segs 参数为16),其面积为它所近似的圆形的99.8%。
1>>> p = Point(0, 0).buffer(10.0)
2>>> p
3<POLYGON ((10 0, 9.952 -0.98, 9.808 -1.951, 9.569 -2.903, 9.239 -3.827, 8.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(0, 0).buffer(10.0 , quad_segs=1)
2>>> q
3<POLYGON ((10 0, 0 -10, -10 0, 0 10, 10 0))>
4
5>>> len(q.exterior.coords)
65
7
8>>> q.area
9200.0
-
single_sided
参数:
用于指定是否只在一侧生成缓冲区,默认为False
,会在两侧生成缓冲区。
根据缓冲距离的符号决定生成缓冲区的方向。正的距离表示左边,负的距离表示右边。
点状几何要素的单边缓冲区与普通缓冲区相同。单面缓冲区的端部样式总是设定为BufferCapStyle.flat
。
1>>> line = LineString([(0, 0), (1, 1), (0, 2), (2, 2), (3, 1), (1, 0)])
2>>> line
3<LINESTRING (0 0, 1 1, 0 2, 2 2, 3 1, 1 0)>
4
5# 正的距离表示左边
6>>> left_hand_side = line.buffer(0.5, single_sided=True)
7>>> left_hand_side
8<POLYGON ((1 0, 3 1, 2 2, 0 2, 1 1, 0 0, -0.354 0.354, 0.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 0, 1 1, 0 2, 2 2, 3 1, 1 0, 0.866 0.268, 2.494 1.082, 1.876 1.7...>
两次缓冲结果如下图所示(0.5缓冲距离(左)和0.3缓冲距离(右)生成的单面缓冲区):
-
buffer(distance=0)
操作:
传递一个0的距离,buffer()
操作有时可以用来清除自接触或自交叉的多边形,如经典的 “领结”形式。根据网友的日常经验,非常小的距离值有时会产生比0更干净的结果。在清除此类多边形时,依实际情况可能有差别。
此时,缓冲区操作将多边形在它们接触的地方一分为二。
1# 生成经典的 “领结”形式
2>>> coords = [(0, 0), (0, 2), (1, 1), (2, 2), (2, 0), (1, 1), (0, 0)]
3>>> bowtie = Polygon(coords)
4>>> bowtie
5<POLYGON ((0 0, 0 2, 1 1, 2 2, 2 0, 1 1, 0 0))>
6>>> bowtie.is_valid
7False
8
9# buffer(distance=0)操作
10>>> clean = bowtie.buffer(0)
11>>> clean
12<MULTIPOLYGON (((0 0, 0 2, 1 1, 0 0)), ((1 1, 2 2, 2 0, 1 1)))>
13>>> clean.is_valid
14True
15>>> len(clean.geoms) # 缓冲区操作将多边形在它们接触的地方一分为二
162
17>>> clean.geoms[0]
18<POLYGON ((0 0, 0 2, 1 1, 0 0))>
19>>> list(clean.geoms[0].exterior.coords)
20[(0.0, 0.0), (0.0, 2.0), (1.0, 1.0), (0.0, 0.0)]
21>>> list(clean.geoms[1].exterior.coords)
22[(1.0, 1.0), (2.0, 2.0), (2.0, 0.0), (1.0, 1.0)]
缓冲结果如下图所示(原始几何对象(左)和处理后的几何对象(右),新对象以蓝色显示。):
END
本篇文章来源于微信公众号: 码农设计师