本系列文章是根据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.ops
模块中的函数,可以将相邻接的线序列合并成复合线或复合多边形。-
shapely.ops.polygonize(lines):
返回一个由输入线构建的多边形的迭代器。
与MultiLineString
构造函数一样,输入元素可以是任何线性对象。
1>>> from shapely.ops import polygonize
2
3>>> coords = [((0, 0), (1, 1)),((0, 0), (0, 1)),((0, 1), (1, 1)),((1, 1), (1, 0)),((1, 0), (0, 0))]
4>>> lines = MultiLineString(coords)
5>>> lines
6<MULTILINESTRING ((0 0, 1 1), (0 0, 0 1), (0 1, 1 1), (1 1, 1 0), (1 0, 0 0))>
7
8# 将相邻接的线合并成复合多边形
9>>> list(polygonize(lines))
10[<POLYGON ((0 0, 1 1, 1 0, 0 0))>, <POLYGON ((1 1, 0 0, 0 1, 1 1))>]
11
12>>> list(polygonize(coords))
13[<POLYGON ((0 0, 1 1, 1 0, 0 0))>, <POLYGON ((1 1, 0 0, 0 1, 1 1))>]
合并形成的两个多边形要素如下图所示,黑色线为原始线要素:
-
shapely.ops.polygonize_full(lines):
从线的源头创建多边形,返回多边形和剩余的几何对象。
源可以是MultiLineString
,LineString
对象序列,或者LineStrings
的对象序列。
返回一个对象的元组:(多边形、切割边、悬边、无效环线),每个对象都是一个几何集合。其中,悬边是指有一个或两个端点不与另一个端点相交的边;切割边是两端相连但不构成多边形的一部分;无效环线形成的环是无效的(蝴蝶结等)。
示例1(仍以上述复合线为例):
结果中切割边、悬边、无效环线均为空要素,多边形要素包含两个三角形几何要素。
1>>> from shapely.ops import polygonize_full
2
3>>> coords = [((0, 0), (1, 1)),((0, 0), (0, 1)),((0, 1), (1, 1)),((1, 1), (1, 0)),((1, 0), (0, 0))]
4>>> lines = MultiLineString(coords)
5>>> lines
6<MULTILINESTRING ((0 0, 1 1), (0 0, 0 1), (0 1, 1 1), (1 1, 1 0), (1 0, 0 0))>
7
8# polygonize_full(lines)操作
9>>> result, cuts, dangles, invalids = polygonize_full(lines)
10>>> len(result.geoms)
112
12>>> list(result.geoms)
13[<POLYGON ((0 0, 1 1, 1 0, 0 0))>, <POLYGON ((1 1, 0 0, 0 1, 1 1))>]
14>>> list(cuts.geoms)
15[]
16>>> list(dangles.geoms)
17[]
18>>> list(invalids.geoms)
19[]
示例2:
1>>> coords2= [((0, 0), (1, 1)),
2... ((0, 0), (0, 1)),
3... ((0, 1), (1, 1)),
4... ((1, 1), (1, 0)),
5... ((1, 0), (0, 0)),
6... ((3, 3), (4, 4)),
7... ((1, 1), (6, 6)),]
8
9>>> lines2 = MultiLineString(coords2)
10>>> lines2
11<MULTILINESTRING ((0 0, 1 1), (0 0, 0 1), (0 1, 1 1), (1 1, 1 0), (1 0, 0 0)...>
12
13>>> result, cuts, dangles, invalids = polygonize_full(lines2)
14>>> list(result.geoms)
15[<POLYGON ((0 0, 1 1, 1 0, 0 0))>, <POLYGON ((1 1, 0 0, 0 1, 1 1))>]
16>>> list(cuts.geoms)
17[]
18>>> list(dangles.geoms)
19[<LINESTRING (1 1, 6 6)>, <LINESTRING (3 3, 4 4)>]
20>>> list(invalids.geoms)
21[]
结果如下图所示,其中,红色和蓝色三角形为生成的多边形几何集合要素,绿色和黄色线为生成的悬边几何要素:
-
shapely.ops.linemerge(lines):
返回一个LineString
或MultiLineString
,代表所有相邻的线要素的合并。
与shapely.ops.polygonize()
一样,输入元素可以是任何线性对象。
仍以第一部分生成的复合线为例:
1>>> from shapely.ops import linemerge
2
3>>> lines
4<MULTILINESTRING ((0 0, 1 1), (0 0, 0 1), (0 1, 1 1), (1 1, 1 0), (1 0, 0 0))>
5>>> len(lines.geoms)
65
7
8# shapely.ops.linemerge(lines)操作
9>>> linemerge(lines)
10<MULTILINESTRING ((1 1, 1 0, 0 0), (0 0, 1 1), (0 0, 0 1, 1 1))>
11>>> len(linemerge(lines).geoms)
123
13>>> list(linemerge(lines).geoms)
14[<LINESTRING (1 1, 1 0, 0 0)>, <LINESTRING (0 0, 1 1)>, <LINESTRING (0 0, 0 1, 1 1)>]
结果如下图所示,其中,下方灰色线为原始复合线要素,绿色、红色、蓝色线为将相邻线要素合并之后的结果要素:
END
本篇文章来源于微信公众号: 码农设计师