本系列文章是根据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
buffer()
缓冲分析,Shapely
的几何对象还有几种方法可以构建新对象。-
object.convex_hull:
返回包含对象中所有点的最小凸包,除非对象中点的数量少于3。对于两个点,凸面体退化为LineString;对于1个点,结果为Point。
1# 单点
2>>> Point(0,0).convex_hull
3<POINT (0 0)>
4
5# 两个点
6>>> points1 = MultiPoint([(0,0) , (2,2)])
7>>> points1
8<MULTIPOINT (0 0, 2 2)>
9>>> res1 = points1.convex_hull
10>>> res1
11<LINESTRING (0 0, 2 2)>
12
13# 多点
14>>> points2 = MultiPoint([(0,0) , (0,2) , (2,2) , (3,1) , (1,0) , (1,1)])
15>>> points2
16<MULTIPOINT (0 0, 0 2, 2 2, 3 1, 1 0, 1 1)>
17>>> res2 = points2.convex_hull
18>>> res2
19<POLYGON ((0 0, 0 2, 2 2, 3 1, 1 0, 0 0))>
2个点(左)和6个点(右)的凸包如下图所示:
-
object.envelope:
返回包含该对象的点或最小的外包矩形(边与坐标轴平行)。对于1个点,结果为Point。
1# 单点
2>>> Point(0,0).envelope
3<POINT (0 0)>
4
5# 两个点
6>>> points1 = MultiPoint([(0, 0), (2, 2)])
7>>> res1 = points1.envelope
8>>> res1
9<POLYGON ((0 0, 2 0, 2 2, 0 2, 0 0))>
10
11# 多点
12>>> points2 = MultiPoint([(0,0) , (0,2) , (2,2) , (3,1) , (1,0) , (1,1)])
13>>> res2 = points2.envelope
14>>> res2
15<POLYGON ((0 0, 3 0, 3 2, 0 2, 0 0))>
2个点(左)和6个点(右)的最小外包矩形如下图所示:
-
object.minimum_rotated_rectangle:
返回包含该对象的最小外接矩形。与envelope
不同的是,这个矩形不需与坐标轴平行。如果对象的凸包是一个退化物(线或点),则返回该退化物(线或点)。
1# 单点
2>>> Point(0,0).minimum_rotated_rectangle
3<POINT (0 0)>
4
5# 两个点
6>>> points1 = MultiPoint([(0, 0), (2, 2)])
7>>> res1 = points1.minimum_rotated_rectangle
8>>> res1
9<LINESTRING (0 0, 2 2)>
10
11# 多点
12>>> points2 = MultiPoint([(0,0),(2,2),(3,1)])
13>>> res2 = points2.minimum_rotated_rectangle
14>>> res2
15<POLYGON ((3 1, 2.6 2.2, -0.4 1.2, 0 0, 3 1))>
2个点(左)和3个点(右)的最小外包矩形如下图所示:
-
object.parallel_offset():
1object.parallel_offset(distance,
2 side,
3 resolution=16,
4 join_style=1,
5 mitre_limit=5.0)
返回一个在其右边或左边与该对象有一定距离的LineString
或MultiLineString
几何对象。
该方法为旧版方法,为了向后兼容,Shapely
目前保留了这个方法,但建议使用下面介绍的offset_curve()
来代替。
-
object.offset_curve():
1object.offset_curve(distance,
2 side,
3 quad_segs=16,
4 join_style=1,
5 mitre_limit=5.0)
返回一个在其右边或左边与该对象有一定距离的LineString
或MultiLineString
几何对象。该方法仅适用于LinearRing
和LineString
对象。
-
distance
参数:必须是一个浮点数。 -
side
参数:可以是’左’或’右’。左和右是按照LineString的给定几何点的方向来确定的。右边的偏移量以原始LineString或LineRing的相反方向得到,而左边的偏移量则以相同的方向得到。 -
quad_segs
参数:对象的每个顶点周围的偏移量的分辨率resolution ,与buffer()方法中的参数一样。 -
join_style
参数:用于设置线段之间的外角。接受的整数值是1(圆形)、2(斜角)和3(斜面)。具体请参阅shapely.geometry.JOIN_STYLE。 -
mitre_limit
参数:用于控制精确的斜接角。平行线的转角将比大多数斜接样式离原对象更远。这个更远的距离与指定距离的比率是斜接比率。比值超过极限的角将被斜接。
简单线要素三种左侧平行偏移结果和右侧偏移结果如下图所示:
mitre_limit
参数的效果如下所示:
-
object.simplify():
1object.simplify(tolerance,
2 preserve_topology=True)
返回几何对象的简化表示。
简化对象中的所有点都将在原始几何体的容错距离之内。默认情况下,会使用一种较慢的算法来保留拓扑结构。如果保留拓扑结构被设置为 “False
”,就会使用更快的Douglas-Peucker
算法。
1>>> p = Point(0.0, 0.0)
2>>> x = p.buffer(1.0)
3>>> x
4<POLYGON ((1 0, 0.995 -0.098, 0.981 -0.195, 0.957 -0.29, 0.924 -0.383, 0.882...>
5>>> x.area
63.1365484905459398
7>>> len(x.exterior.coords)
865
9
10# 简化操作
11>>> s = x.simplify(0.05, preserve_topology=False)
12>>> s
13<POLYGON ((1 0, 0.924 -0.383, 0.707 -0.707, 0.383 -0.924, 0 -1, -0.383 -0.92...>
14>>> s.area
153.061467458920719
16>>> len(s.exterior.coords)
1717
使用0.2(左)和0.5(右)的容差值对一个近似圆形的多边形进行简化,结果如下图所示:
需要注意的是,不保留拓扑结构的简化可能导致无效的几何对象,而且简化可能对坐标顺序敏感:两个仅在坐标顺序上不同的几何体可能被简化为不同结果。
END
本篇文章来源于微信公众号: 码农设计师