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

【Shapely矢量数据空间分析】4.创建简单几何对象2——多边形、矩形、带空洞的面、空要素


本系列文章是根据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




01
Polygon多边形几何要素

class Polygon(shell[, holes=None]) Polygon构造函数需要两个位置参数。第一个位置参数是一个(x, y[, z])点元祖的有序序列,与LinearRing的情况完全相同。第二个位置参数是一个可选的无序的环状序列,用于指定几何要素的内部”洞”的边界 。

1>>> polygon = Polygon([(00), (11), (10)])
2>>> polygon
3<POLYGON ((0 01 11 00 0))>

一个有效的多边形的环不能相互交叉,而只能在一个点上接触。同样,Shapely不会阻止无效要素的创建,但在对其进行操作时可能会出现异常。

例如,下图左边是一个有效的多边形,它的内环与外环在一点接触。右边是一个无效的多边形,因为它的内环与外环有多于一点的接触。其中,描述环的点以灰色显示。

再如,下图左边是一个无效的多边形,因为它的外环和内环沿着一条线接触,右边也是一个无效的多边形,因为它的两个内环沿着一条线接触。

arealength属性:一个多边形具有非零的面积和非零的长度。

1>>> polygon.area , polygon.length
2(0.5, 3.414213562373095)

bounds属性它的边界是一个元组(minx, miny, maxx, maxy)。

1>>> polygon.bounds
2(0.0, 0.0, 1.0, 1.0)

内环和外环可以通过exteriorinteriors属性进行访问。

 1# 外环
2>>> polygon.exterior
3<LINEARRING (0 01 11 00 0)>
4
5# 外环坐标
6>>> list(polygon.exterior.coords)
7[(0.00.0), (1.01.0), (1.00.0), (0.00.0)]
8
9# 无内环,因此结果为空
10>>> list(polygon.interiors)
11[]

Polygon构造函数也接受LineStringLinearRing实例。

1>>> polygon2 = Polygon(LineString([(00), (11), (01)]))
2>>> polygon2
3<POLYGON ((0 01 10 10 0))>
02
矩形几何要素

因为矩形会经常使用到,因此Shapely有单独的构造函数,可以使用shapely.box()函数方便地构建矩形。

shapely.box(minx, miny, maxx, maxy, ccw=True):根据提供的边界框值生成一个矩形的多边形,默认为逆时针顺序。

1>>> from shapely import box
2
3>>> b = box(0,0,1,1)
4>>> b
5<POLYGON ((1 01 10 10 01 0))>

为了获得一个已知方向的多边形, 可以使用:

shapely.geometry.polygon.orient(polygon, sign=1.0):返回给定多边形正确方向的副本。结果中带符号区域将具有给定的符号。sign为1.0意味着矩形外部环的坐标将是逆时针方向的,内部环(孔)将是顺时针方向的。

1>>> import shapely
2>>> shapely.geometry.polygon.orient(b, sign=1)
3<POLYGON ((1 01 10 10 01 0))>
4
5>>> list(shapely.geometry.polygon.orient(b, sign=1).exterior.coords)
6[(1.00.0), (1.01.0), (0.01.0), (0.00.0), (1.00.0)]
7
8>>> list(shapely.geometry.polygon.orient(b, sign=-1).exterior.coords)
9[(1.00.0), (0.00.0), (0.01.0), (1.01.0), (1.00.0)]
03
创建带空洞的面要素

class Polygon(shell[, holes=None]) Polygon构造函数中的第二个位置参数是一个可选的无序的环状序列,用于指定几何要素的内部”洞”的边界 。

1>>> hole1 = LinearRing([(1,1) , (2,1) , (2,4) , (1,4)])
2>>> hole2 = LinearRing([(3,1) , (3,4) , (4,4)])
3
4>>> polygon_hole = Polygon([(0,0) , (0,5) , (5,5) , (5,0)] , [hole1 , hole2])
5>>> polygon_hole
6<POLYGON ((0 00 55 55 00 0), (1 12 12 41 41 1), (3 13 44...>

带空洞的面要素形状如下图所示:

 1# 获取面外环中的点坐标
2>>> polygon_hole.exterior.coords[:]
3[(0.00.0), (0.05.0), (5.05.0), (5.00.0), (0.00.0)]
4
5# 获取面内环的点坐标
6>>> polygon_hole.interiors[:]
7[<LINEARRING (1 12 12 41 41 1)>, <LINEARRING (3 13 44 43 1)>]
8
9# 两个内环都是LinearRing对象
10>>> polygon_hole.interiors[0].geom_type
11'LinearRing'

可以使用一个循环获取内部空洞的坐标信息:

1>>> for i in range(len(polygon_hole.interiors)):
2...     print(polygon_hole.interiors[i].coords[:])
3...
4[(1.0, 1.0), (2.0, 1.0), (2.0, 4.0), (1.0, 4.0), (1.0, 1.0)]
5[(3.0, 1.0), (3.0, 4.0), (4.0, 4.0), (3.0, 1.0)]
04
空要素

空要素是指其点集为空集,不是None,而是像set([ ])。空要素可以通过调用各种没有参数的构造函数来创建。不过,空要素几乎不支持任何操作。

 1>>> line = LineString()
2
3>>> line.is_empty
4True
5
6>>> line.length
70.0
8
9>>> line.bounds
10(nan, nan, nan, nan)
11
12>>> list(line.coords)
13[]
14
15>>> line.geom_type
16'LineString'


END

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

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments