Python GIS神器shapely 2.0新版本来了

1 简介

geopandas之所以如此高效易用,成为Python GIS生态中的翘楚,离不开其底层依赖库shapely对其矢量计算功能的支持。

不仅是作为geopandas的基石,直接使用shapely中极其丰富的各种矢量操作API,也可以帮助我们轻松实现各种细致入微的矢量操作。而就在近期,shapely发布了其颇具里程碑意义的2.0正式版本,为我们带来了更加澎湃的运算性能提升,以及更稳定更丰富的新功能,今天的文章就来带大家一览shapely 2.0版本中的主要新特性🥳。

b1f982da3511d469b0db924b025f2873.png

2 shapely 2.0重要新特性一览

通常我们不会专门去安装shapely,在安装geopandas的过程中它就顺带被安装上了,在我的本地示例虚拟环境中shapely原先的版本为1.8.5,通过执行conda update shapely -c conda-forge -y可将其稳定升级到2.0.0以上的正式版本:

e6c27def40c2223f3004fb2ab60d0aba.png

接下来我们来看看本次大的版本更新中带来了哪些重要内容:

2.1 向量化矢量操作带来高达百倍的性能提升

新版shapely重写了底层对C++库GEOS的封装方式,大幅度降低了冗余计算成本,并且吸收了pygeos中的底层逻辑,对各种常用接口进行「ufunc向量化」运算支持,使得我们可以配合numpy快速实现,以contains()为例,基于shapely的顶级API接口:

d9120a834c97464735a8cc0a2120951f.png

在上面的例子中,相较于标量一对一运算和列表批量运算,新的向量化运算分别取得了500多倍和70多倍的运算加速😉。

目前shapely的所有顶级API,以及shapely.ops等子模块下的顶级API均已支持向量化运算特性,具体见shapely中的API文档是否如下图所示提及ufunc

ce5a77389aafed9cbb962570dd69bf01.png

2.2 矢量对象不可变

在以前的版本中,shapely中的矢量要素对象是可变的,譬如对于LineString要素,可以在被创建后,通过为其coords属性赋值新的坐标串信息以改变其矢量信息:

7b4fe0192f2689082fc0ebf6ae746ae2.png

而从2.0.0开始,shapely中所有的矢量要素变为不可变对象,这意味着它们「可hash」,譬如可以作为字典的键,或pandas分组运算的分组依据等:

4560c6a326dca3773b7611f182a6e20e.png

2.3 矢量要素类可作为顶级API使用

从上面的几个例子中你也可以发现,新版shapely中我们可以直接从shapely导入常用的各种矢量要素类,这将作为from shapely.geometry import XXX方式的备选方式:

1d633d17af142ae4cf290beb275f1bf5.png

2.4 多部件要素不再可视作序列型对象

在以前的版本中,多部件要素譬如MultiPoint可以直接视作数组对象来直接按位置索引或迭代,而从2.0.0开始,原有的方式会引发错误,请注意更换为使用其geoms属性实现相关操作:

9c2d30ee0a031a1c6668dfda7aaa5ae2.png

2.5 矢量要素支持精度控制

2.0.0开始,shapely新增API接口set_precision()get_precision()用于针对矢量要素进行坐标精度设置和精度查询,非常的方便:

e3817c890505f090e96bcae6c143b970.png

2.6 基于GEOS新增大量新功能函数

随着对底层GEOS依赖库的版本更新(当前依赖版本:3.11.1),一大批新的实用功能函数得以被添加到shapely中,由于数量非常众多,下面我仅对其中的部分典型新功能函数做介绍:

  • extract_unique_points()

通过新增的函数extract_unique_points(),我们可以从指定要素中快速提取去重后的折点要素:

da528ebde85c09270950f684e4fa0298.png
  • node()

通过新增的函数node(),我们可以轻松地从线要素中提取出彼此不交叉的片段:

e9498f2f54ddb5dd7e094dcd859a7968.png
  • minimum_bounding_circle()与minimum_bounding_radius()

通过minimum_bounding_circle()minimum_bounding_radius()我们可以快速得到目标要素的最小外接圆及其对应半径:

80788b13115775788ef69508b2198f47.png
  • dwithin()

通过dwithin(),我们可以快速判断要素之间的距离是否小于所给定的阈值:

ece39f9924ed073b95bae3155c9a02a3.png

2.7 新增force_2d()、force_3d()函数

通过新增的快捷函数force_2d()force_3d(),我们可以直接为指定要素移除/添加z轴信息:

87b6ab316f88e5ed207ece2880fa2648.png

篇幅有限,本文只针对shapely 2.0中一些比较重要的内容进行介绍,更多新特性请移步其更新说明文档页:https://shapely.readthedocs.io/en/stable/release/2.x.html


以上就是本文的全部内容,欢迎在评论区与我进行讨论~

-------- End --------

推荐👇同名微信视频号

56c6f1dffc1975657a57492b6415f4a9.png

2c47c90888b95f66041324a51ec9adc9.jpeg
图解Pandas

图文00-内容框架介绍 | 图文01-数据结构介绍 | 图文02-创建数据对象 | 图文03-操作Excel文件 | 图文04-常见的数据访问 | 图文05-常见的数据运算 |  图文06-常见的数学计算 | 图文07-常见的数据统计 | 图文08-常见的数据筛选 |  图文09-常见的缺失值处理 | 图文10-数据合并操作 | 图文11-Groupby分组操作

9bd153641d5c3a347de7effa0ecf568f.jpeg 7eef57c670d7c715a6c04a9fb4221da2.jpeg
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值