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

【Shapely矢量数据空间分析】11.空间分析方法——其他构造新对象的方法


本系列文章是根据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 02 2)>
9>>> res1 = points1.convex_hull
10>>> res1
11<LINESTRING (0 02 2)>
12
13# 多点
14>>> points2 = MultiPoint([(0,0) , (0,2) , (2,2) , (3,1) , (1,0) , (1,1)])
15>>> points2
16<MULTIPOINT (0 00 22 23 11 01 1)>
17>>> res2 = points2.convex_hull
18>>> res2
19<POLYGON ((0 00 22 23 11 00 0))>

2个点(左)和6个点(右)的凸包如下图所示:

  • object.envelope:

返回包含该对象的点或最小的外包矩形(边与坐标轴平行)。对于1个点,结果为Point。

 1# 单点
2>>> Point(0,0).envelope
3<POINT (0 0)>
4
5# 两个点
6>>> points1 = MultiPoint([(00), (22)])
7>>> res1 = points1.envelope
8>>> res1
9<POLYGON ((0 02 02 20 20 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 03 03 20 20 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([(00), (22)])
7>>> res1 = points1.minimum_rotated_rectangle
8>>> res1
9<LINESTRING (0 02 2)>
10
11# 多点
12>>> points2 = MultiPoint([(0,0),(2,2),(3,1)])
13>>> res2 = points2.minimum_rotated_rectangle
14>>> res2
15<POLYGON ((3 12.6 2.2, -0.4 1.20 03 1))>

2个点(左)和3个点(右)的最小外包矩形如下图所示:

  • object.parallel_offset():

1object.parallel_offset(distance,
2                       side, 
3                       resolution=16
4                       join_style=1
5                       mitre_limit=5.0)

返回一个在其右边或左边与该对象有一定距离的LineStringMultiLineString几何对象。

该方法为旧版方法,为了向后兼容,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)

返回一个在其右边或左边与该对象有一定距离的LineStringMultiLineString几何对象。该方法仅适用于LinearRingLineString对象。

  • distance参数:必须是一个浮点数。

  • side参数:可以是’左’或’右’。左和右是按照LineString的给定几何点的方向来确定的。右边的偏移量以原始LineString或LineRing的相反方向得到,而左边的偏移量则以相同的方向得到。

  • quad_segs参数:对象的每个顶点周围的偏移量的分辨率resolution ,与buffer()方法中的参数一样。

  • join_style参数:用于设置线段之间的外角。接受的整数值是1(圆形)、2(斜角)和3(斜面)。具体请参阅shapely.geometry.JOIN_STYLE。

  • mitre_limit参数:用于控制精确的斜接角。平行线的转角将比大多数斜接样式离原对象更远。这个更远的距离与指定距离的比率是斜接比率。比值超过极限的角将被斜接。

需要注意的是,该方法有时可能会返回一个MultiLineString,而非预期的一个简单的LineString(例如,一个稍微弯曲的LineString的偏移)。

简单线要素三种左侧平行偏移结果和右侧偏移结果如下图所示:

mitre_limit参数的效果如下所示:

  • object.simplify():

1object.simplify(tolerance, 
2                preserve_topology=True)

返回几何对象的简化表示。

简化对象中的所有点都将在原始几何体的容错距离之内。默认情况下,会使用一种较慢的算法来保留拓扑结构。如果保留拓扑结构被设置为 “False”,就会使用更快的Douglas-Peucker法。

 1>>> p = Point(0.00.0)
2>>> x = p.buffer(1.0)
3>>> x
4<POLYGON ((1 00.995 -0.098, 0.981 -0.1950.957 -0.290.924 -0.3830.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 00.924 -0.3830.707 -0.7070.383 -0.9240 -1, -0.383 -0.92...>
14>>> s.area
153.061467458920719
16>>> len(s.exterior.coords)
1717

使用0.2(左)和0.5(右)的容差值对一个近似圆形的多边形进行简化,结果如下图所示:

需要注意的是,不保留拓扑结构的简化可能导致无效的几何对象,而且简化可能对坐标顺序敏感:两个仅在坐标顺序上不同的几何体可能被简化为不同结果。

END


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

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments