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

【Shapely矢量数据空间分析】14.其他操作——合并线状要素


本系列文章是根据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 = [((00), (11)),((00), (01)),((01), (11)),((11), (10)),((10), (00))]
4>>> lines = MultiLineString(coords)
5>>> lines
6<MULTILINESTRING ((0 01 1), (0 00 1), (0 11 1), (1 11 0), (1 00 0))>
7
8# 将相邻接的线合并成复合多边形
9>>> list(polygonize(lines))
10[<POLYGON ((0 01 11 00 0))>, <POLYGON ((1 10 00 11 1))>]
11
12>>> list(polygonize(coords))
13[<POLYGON ((0 01 11 00 0))>, <POLYGON ((1 10 00 11 1))>]

合并形成的两个多边形要素如下图所示,黑色线为原始线要素:


  • shapely.ops.polygonize_full(lines):

从线的源头创建多边形,返回多边形和剩余的几何对象。

源可以是MultiLineStringLineString对象序列,或者LineStrings的对象序列。

返回一个对象的元组:(多边形、切割边、悬边、无效环线),每个对象都是一个几何集合。其中,悬边是指有一个或两个端点不与另一个端点相交的边;切割边是两端相连但不构成多边形的一部分;无效环线形成的环是无效的(蝴蝶结等)。

示例1(仍以上述复合线为例):

结果中切割边、悬边、无效环线均为空要素,多边形要素包含两个三角形几何要素。

 1>>> from shapely.ops import polygonize_full
2
3>>> coords = [((00), (11)),((00), (01)),((01), (11)),((11), (10)),((10), (00))]
4>>> lines = MultiLineString(coords)
5>>> lines
6<MULTILINESTRING ((0 01 1), (0 00 1), (0 11 1), (1 11 0), (1 00 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 01 11 00 0))>, <POLYGON ((1 10 00 11 1))>]
14>>> list(cuts.geoms)
15[]
16>>> list(dangles.geoms)
17[]
18>>> list(invalids.geoms)
19[]

示例2:

 1>>> coords2= [((00), (11)),
2...         ((00), (01)),
3...         ((01), (11)),
4...         ((11), (10)),
5...         ((10), (00)),
6...         ((33), (44)),
7...         ((11), (66)),]
8
9>>> lines2 = MultiLineString(coords2)
10>>> lines2
11<MULTILINESTRING ((0 01 1), (0 00 1), (0 11 1), (1 11 0), (1 00 0)...>
12
13>>> result, cuts, dangles, invalids = polygonize_full(lines2)
14>>> list(result.geoms)
15[<POLYGON ((0 01 11 00 0))>, <POLYGON ((1 10 00 11 1))>]
16>>> list(cuts.geoms)
17[]
18>>> list(dangles.geoms)
19[<LINESTRING (1 16 6)>, <LINESTRING (3 34 4)>]
20>>> list(invalids.geoms)
21[]

结果如下图所示,其中,红色和蓝色三角形为生成的多边形几何集合要素,绿色和黄色线为生成的悬边几何要素:


  • shapely.ops.linemerge(lines):

返回一个LineStringMultiLineString,代表所有相邻的线要素的合并。

shapely.ops.polygonize()一样,输入元素可以是任何线性对象。

仍以第一部分生成的复合线为例:

 1>>> from shapely.ops import linemerge
2
3>>> lines
4<MULTILINESTRING ((0 01 1), (0 00 1), (0 11 1), (1 11 0), (1 00 0))>
5>>> len(lines.geoms)
65
7
8# shapely.ops.linemerge(lines)操作
9>>> linemerge(lines)
10<MULTILINESTRING ((1 11 00 0), (0 01 1), (0 00 11 1))>
11>>> len(linemerge(lines).geoms)
123
13>>> list(linemerge(lines).geoms)
14[<LINESTRING (1 11 00 0)>, <LINESTRING (0 01 1)>, <LINESTRING (0 00 11 1)>]

结果如下图所示,其中,下方灰色线为原始复合线要素,绿色、红色、蓝色线为将相邻线要素合并之后的结果要素:


END


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

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments