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

【Shapely矢量数据空间分析】9.空间分析方法——基于集合论的方法

本系列文章是根据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还提供了构建新几何对象的空间分析方法。

这些方法将总是返回一个新的几何对象。例如,一个不相交的几何体的交集将返回一个空的GeometryCollection,而不是NoneFalse。要测试一个非空的结果,请使用几何对象的is_empty属性。

  • object.boundary:

按集合论,返回一个代表该对象边界的更低一维的几何对象。即,多边形的边界是一条线,一条线的边界是一系列点的集合。一个点的边界是一个空集。

 1>>> coords = [((00), (11)), ((-10), (10))]
2>>> lines = MultiLineString(coords)
3>>> lines
4<MULTILINESTRING ((0 01 1), (-1 01 0))>
5
6>>> lines.boundary
7<MULTIPOINT (-1 00 01 01 1)>
8
9>>> list(lines.boundary.geoms)
10[<POINT (-1 0)>, <POINT (0 0)>, <POINT (1 0)>, <POINT (1 1)>]
11
12>>> print(lines.boundary.boundary)
13GEOMETRYCOLLECTION EMPTY
  • object.centroid:

返回几何对象的几何中心点,即质心。

一个对象的质心可能是组成它的一个点,但这并不是必然的。

1# 线要素
2>>> line = LineString([(00.5), (11.5)])
3>>> print(line.centroid)
4POINT (0.5 1)
5
6# 面要素
7>>> polygon = Polygon([(00), (11), (10)])
8>>> print(polygon.centroid)
9POINT (0.6666666666666666 0.3333333333333333)

其关系图如下所示:

  • object.difference(other):

返回构成该几何对象的且不构成另一个对象的点的集合。即,相减操作。

difference 操作只适用于二维对象,不能用在低维对象上(例如线和点要素),在这些情况下,difference 方法返回一个名为self的对象的副本。

1# buffer()为缓冲区操作
2>>> a = Point(11).buffer(1.5)
3>>> b = Point(21).buffer(1.5)
4
5>>> result = a.difference(b)
6>>> result
7<POLYGON ((1.435 -0.4351.293 -0.4711.147 -0.4931 -0.50.853 -0.4930...>

结果如下图所示(绿色圆为几何对象a,蓝色圆为几何对象b,红色填充部分为返回结果):

  • object.intersection(other):

返回该对象与另一个几何对象的交集。即,相交操作。

1>>> a = Point(11).buffer(1.5)
2>>> b = Point(21).buffer(1.5)
3
4>>> result = a.intersection(b)
5>>> result
6<POLYGON ((2.493 0.8532.471 0.7072.435 0.5652.386 0.4262.323 0.293, ...>

结果如下图所示(绿色圆为几何对象a,蓝色圆为几何对象b,红色填充部分为返回结果):

  • object.symmetric_difference(other):

返回这个对象中不在另一个几何对象中的点的表示,以及另一个对象中不在这个几何对象中的点的表示。即,对称差操作。

1>>> a = Point(11).buffer(1.5)
2>>> b = Point(21).buffer(1.5)
3
4>>> result = a.symmetric_difference(b)
5>>> result
6<MULTIPOLYGON (((1.574 -0.3861.707 -0.3231.833 -0.2471.952 -0.162.06...>

结果如下图所示(绿色圆为几何对象a,蓝色圆为几何对象b,红色填充部分为返回结果):

  • object.union(other):

返回该对象和另一个几何对象的点集的合集。即,合并操作。

返回的对象类型取决于运算对象之间的关系。例如,多边形的合并将是一个多边形或一个复合多边形,这取决于它们是否相交。

1>>> a = Point(11).buffer(1.5)
2>>> b = Point(21).buffer(1.5)
3
4>>> result = a.union(b)
5>>> result
6<POLYGON ((1.435 -0.4351.293 -0.4711.147 -0.4931 -0.50.853 -0.4930...>

结果如下图所示(绿色圆为几何对象a,蓝色圆为几何对象b,红色填充部分为返回结果):


合并操作的语义因几何对象的类型而异。例如,比较多边形合并之后的边界(LineString类型)和它们的边界的合并结果(MultiLineString类型)。

 1# 多边形合并之后的边界
2>>> a.union(b).boundary
3<LINESTRING (1.435 -0.4351.293 -0.4711.147 -0.4931 -0.50.853 -0.493,...>
4>>> a.union(b).boundary.geom_type
5'LineString'
6
7# 边界的合并结果
8>>> a.boundary.union(b.boundary)
9<MULTILINESTRING ((2.5 12.493 0.8532.471 0.7072.435 0.5652.386 0.426...>
10>>> a.boundary.union(b.boundary).geom_type
11'MultiLineString'

对于较多对象的合并操作,union()需要较多计算资源。建议使用更高效的shapely.ops.unary_union()方法。

  • 上述集合论的方法也可以通过运算符来调用:
 1>>> from shapely import wkt
2
3>>> p1 = wkt.loads('POLYGON((0 0,1 0,1 1,0 1,0 0))')
4>>> p2 = wkt.loads('POLYGON((0.5 0, 1.5 0, 1.5 1, 0.5 1, 0.5 0))')
5
6# intersection
7>>> p1 & p2
8<POLYGON ((0.5 00.5 11 11 00.5 0))>
9
10# union
11>>> p1 | p2
12<POLYGON ((0 0, 0 1, 0.5 1, 1 1, 1.5 1, 1.5 0, 1 0, 0.5 0, 0 0))>
13
14# difference
15>>> p1 - p2
16<POLYGON ((0 0, 0 1, 0.5 1, 0.5 0, 0 0))>
17
18# symmetric_difference
19>>> p1 ^ p2
20<MULTIPOLYGON (((0 0, 0 1, 0.5 1, 0.5 0, 0 0)), ((1 1, 1.5 1, 1.5 0, 1 0, 1 ...>
21


END



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

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments