(数据科学学习手札147)Python GIS利器shapely全新2.0版本一览
本文示例代码已上传至我的
Github
仓库https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
大家好我是费老师,我写过很多篇介绍geopandas
相关技术的文章,而geopandas
之所以如此高效易用,成为Python GIS生态中的翘楚,离不开其底层依赖库shapely
对其矢量计算功能的支持。
不仅是作为geopandas
的基石,直接使用shapely
中极其丰富的各种矢量操作API,也可以帮助我们轻松实现各种细致入微的矢量操作。而就在几天前,shapely
发布了其颇具里程碑意义的2.0
正式版本,为我们带来了更加澎湃的运算性能提升,以及更稳定更丰富的新功能,今天的文章费老师我就来带大家一览shapely 2.0
版本中的主要新特性。
2 shapely 2.0重要新特性一览
通常我们不会专门去安装shapely
,在安装geopandas
的过程中它就顺带被安装上了,在我的本地示例虚拟环境中shapely
原先的版本为1.8.5
,通过执行conda update shapely -c conda-forge -y
可将其稳定升级到2.0.0
以上的正式版本:
接下来我们来看看本次大的版本更新中带来了哪些重要内容:
2.1 向量化矢量操作带来高达百倍的性能提升
新版shapely
重写了底层对C++库GEOS
的封装方式,大幅度降低了冗余计算成本,并且吸收了pygeos
中的底层逻辑,对各种常用接口进行ufunc向量化运算支持,使得我们可以配合numpy
快速实现,以contains()
为例,基于shapely
的顶级API接口:
在上面的例子中,相较于标量一对一运算和列表批量运算,新的向量化运算分别取得了500多倍和70多倍的运算加速。
目前shapely
的所有顶级API,以及shapely.ops
等子模块下的顶级API均已支持向量化运算特性,具体见shapely
中的API文档是否如下图所示提及ufunc
:
2.2 矢量对象不可变
在以前的版本中,shapely
中的矢量要素对象是可变的,譬如对于LineString
要素,可以在被创建后,通过为其coords
属性赋值新的坐标串信息以改变其矢量信息:
而从2.0.0
开始,shapely
中所有的矢量要素变为不可变对象,这意味着它们可hash,譬如可以作为字典的键,或pandas
分组运算的分组依据等:
2.3 矢量要素类可作为顶级API使用
从上面的几个例子中你也可以发现,新版shapely
中我们可以直接从shapely
导入常用的各种矢量要素类,这将作为from shapely.geometry import XXX
方式的备选方式:
2.4 多部件要素不再可视作序列型对象
在以前的版本中,多部件要素譬如MultiPoint
可以直接视作数组对象来直接按位置索引或迭代,而从2.0.0
开始,原有的方式会引发错误,请注意更换为使用其geoms
属性实现相关操作:
2.5 矢量要素支持精度控制
从2.0.0
开始,shapely
新增API接口set_precision()
和get_precision()
用于针对矢量要素进行坐标精度设置和精度查询,非常的方便:
2.6 基于GEOS新增大量新功能函数
随着对底层GEOS
依赖库的版本更新(当前依赖版本:3.11.1
),一大批新的实用功能函数得以被添加到shapely
中,由于数量非常众多,下面我仅对其中的部分典型新功能函数做介绍:
- extract_unique_points()
通过新增的函数extract_unique_points()
,我们可以从指定要素中快速提取去重后的折点要素:
- node()
通过新增的函数node()
,我们可以轻松地从线要素中提取出彼此不交叉的片段:
- minimum_bounding_circle()与minimum_bounding_radius()
通过minimum_bounding_circle()
和minimum_bounding_radius()
我们可以快速得到目标要素的最小外接圆及其对应半径:
- dwithin()
通过dwithin()
,我们可以快速判断要素之间的距离是否小于所给定的阈值:
2.7 新增force_2d()、force_3d()函数
通过新增的快捷函数force_2d()
和force_3d()
,我们可以直接为指定要素移除/添加z轴信息:
篇幅有限,本文只针对shapely 2.0
中一些比较重要的内容进行介绍,更多新特性请移步其更新说明文档页:https://shapely.readthedocs.io/en/stable/release/2.x.html
以上就是本文的全部内容,欢迎在评论区与我进行讨论~
(数据科学学习手札147)Python GIS利器shapely全新2.0版本一览的更多相关文章
- (数据科学学习手札47)基于Python的网络数据采集实战(2)
一.简介 马上大四了,最近在暑期实习,在数据挖掘的主业之外,也帮助同事做了很多网络数据采集的内容,接下来的数篇文章就将一一罗列出来,来续写几个月前开的这个网络数据采集实战的坑. 二.马蜂窝评论数据采集 ...
- (数据科学学习手札80)用Python编写小工具下载OSM路网数据
本文对应脚本已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们平时在数据可视化或空间数据分析的过程中经常会 ...
- (数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)
一.简介 接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库,CSS,正则表达式等),在那篇文 ...
- (数据科学学习手札32)Python中re模块的详细介绍
一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...
- (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播图
本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl作为一款强大的开源地理信 ...
- (数据科学学习手札55)利用ggthemr来美化ggplot2图像
一.简介 R中的ggplot2是一个非常强大灵活的数据可视化包,熟悉其绘图规则后便可以自由地生成各种可视化图像,但其默认的色彩和样式在很多时候难免有些过于朴素,本文将要介绍的ggthemr包专门针对原 ...
- (数据科学学习手札49)Scala中的模式匹配
一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...
- (数据科学学习手札40)tensorflow实现LSTM时间序列预测
一.简介 上一篇中我们较为详细地铺垫了关于RNN及其变种LSTM的一些基本知识,也提到了LSTM在时间序列预测上优越的性能,本篇就将对如何利用tensorflow,在实际时间序列预测任务中搭建模型来完 ...
- (数据科学学习手札69)详解pandas中的map、apply、applymap、groupby、agg
*从本篇开始所有文章的数据和代码都已上传至我的github仓库:https://github.com/CNFeffery/DataScienceStudyNotes 一.简介 pandas提供了很多方 ...
- (数据科学学习手札61)xpath进阶用法
一.简介 xpath作为对网页.对xml文件进行定位的工具,速度快,语法简洁明了,在网络爬虫解析内容的过程中起到很大的作用,除了xpath的基础用法之外(可参考我之前写的(数据科学学习手札50)基于P ...
随机推荐
- vue2.x引入threejs
@ 目录 vue2.x引入threejs npm安装 使用指定版本: 其他插件 实例 强调 vue2.x引入threejs npm安装 npm install three 使用指定版本: npm in ...
- go使用JWT进行跨域认证最全教学
JWT前言 JWT是JSON Web Token的缩写.JWT本身没有定义任何技术实现,它只是定义了一种基于Token的会话管理的规则,涵盖Token需要包含的标准内容和Token的生成过程. JWT ...
- P7113 [NOIP2020] 排水系统 (拓扑排序)
(不想打高精,也不想学习其他大佬的神仙写法,打了90分的错解). 本题容易想到用拓扑排序处理,涉及分数的加法,用long long会超时,不过通分时先除后乘卡一下也可以拿90分. 结构体真是个复杂的东 ...
- kali配置
IP设置 配置文件:/etc/networking/interface 临时IP ifconfig eth0 192.168.31.111/24 永久IP auto eth0 #iface eth0 ...
- 驱动开发:内核枚举LoadImage映像回调
在笔者之前的文章<驱动开发:内核特征码搜索函数封装>中我们封装实现了特征码定位功能,本章将继续使用该功能,本次我们需要枚举内核LoadImage映像回调,在Win64环境下我们可以设置一个 ...
- 齐博x1小程序集群一个重要功能升级,可以根据圈子会员组显示不同的菜单。
如下图所示,虽然之前圈子小程序可以自定义会员中心菜单,但是存在一个问题,就是所有会员,比如圈主与普通会员的菜单都将是一样的. 现在升级后,就可以设置不同的圈子会员组,拥有不同的菜单. 比如一个商家,店 ...
- 函数柯里化实现sum函数
需求 实现sum函数,使其可以传入不定长参数,以及不定次数调用 //示例 console.log(sum(1,2)(3)()) //6 console.log(sum(2,3,4,5)(1,2)(3) ...
- 微信抢红包小技巧(python模拟100万次)
之前,在网上看到一篇文章,说多人抢红包时,微信红包金额的分配规则是0.01元到当前剩余金额平均数的2倍(最后一个人金额为当前剩下的所有金额),所以写了一个python程序,模拟量一百万次,分析了一下抢 ...
- Git新技能-stash操作
最近开发的工期非常紧迫,一直在忙各种杂七杂八的事情,负责人都还没有创建好测试环境, 所以代码也不能部署.可是项目经理催促开发进度又催得很急,新的开发需求必须在指定的时间内 完成,我们只得想办法去克服困 ...
- 源码级深度理解 Java SPI
作者:vivo 互联网服务器团队- Zhang Peng SPI 是一种用于动态加载服务的机制.它的核心思想就是解耦,属于典型的微内核架构模式.SPI 在 Java 世界应用非常广泛,如:Dubbo. ...