本系列文章是根据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
class Polygon(shell[, holes=None])
:Polygon
构造函数需要两个位置参数。第一个位置参数是一个(x, y[, z])
点元祖的有序序列,与LinearRing
的情况完全相同。第二个位置参数是一个可选的无序的环状序列,用于指定几何要素的内部”洞”的边界 。
1>>> polygon = Polygon([(0, 0), (1, 1), (1, 0)])
2>>> polygon
3<POLYGON ((0 0, 1 1, 1 0, 0 0))>
一个有效的多边形的环不能相互交叉,而只能在一个点上接触。同样,Shapely
不会阻止无效要素的创建,但在对其进行操作时可能会出现异常。
例如,下图左边是一个有效的多边形,它的内环与外环在一点接触。右边是一个无效的多边形,因为它的内环与外环有多于一点的接触。其中,描述环的点以灰色显示。
再如,下图左边是一个无效的多边形,因为它的外环和内环沿着一条线接触,右边也是一个无效的多边形,因为它的两个内环沿着一条线接触。
area
、length
属性:一个多边形具有非零的面积和非零的长度。
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)
内环和外环可以通过exterior
和interiors
属性进行访问。
1# 外环
2>>> polygon.exterior
3<LINEARRING (0 0, 1 1, 1 0, 0 0)>
4
5# 外环坐标
6>>> list(polygon.exterior.coords)
7[(0.0, 0.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)]
8
9# 无内环,因此结果为空
10>>> list(polygon.interiors)
11[]
Polygon
构造函数也接受LineString
和LinearRing
实例。
1>>> polygon2 = Polygon(LineString([(0, 0), (1, 1), (0, 1)]))
2>>> polygon2
3<POLYGON ((0 0, 1 1, 0 1, 0 0))>
因为矩形会经常使用到,因此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 0, 1 1, 0 1, 0 0, 1 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 0, 1 1, 0 1, 0 0, 1 0))>
4
5>>> list(shapely.geometry.polygon.orient(b, sign=1).exterior.coords)
6[(1.0, 0.0), (1.0, 1.0), (0.0, 1.0), (0.0, 0.0), (1.0, 0.0)]
7
8>>> list(shapely.geometry.polygon.orient(b, sign=-1).exterior.coords)
9[(1.0, 0.0), (0.0, 0.0), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0)]
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 0, 0 5, 5 5, 5 0, 0 0), (1 1, 2 1, 2 4, 1 4, 1 1), (3 1, 3 4, 4...>
带空洞的面要素形状如下图所示:
1# 获取面外环中的点坐标
2>>> polygon_hole.exterior.coords[:]
3[(0.0, 0.0), (0.0, 5.0), (5.0, 5.0), (5.0, 0.0), (0.0, 0.0)]
4
5# 获取面内环的点坐标
6>>> polygon_hole.interiors[:]
7[<LINEARRING (1 1, 2 1, 2 4, 1 4, 1 1)>, <LINEARRING (3 1, 3 4, 4 4, 3 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)]
空要素是指其点集为空集,不是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
本篇文章来源于微信公众号: 码农设计师