本文示例代码已上传至我的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版本一览的更多相关文章

  1. (数据科学学习手札47)基于Python的网络数据采集实战(2)

    一.简介 马上大四了,最近在暑期实习,在数据挖掘的主业之外,也帮助同事做了很多网络数据采集的内容,接下来的数篇文章就将一一罗列出来,来续写几个月前开的这个网络数据采集实战的坑. 二.马蜂窝评论数据采集 ...

  2. (数据科学学习手札80)用Python编写小工具下载OSM路网数据

    本文对应脚本已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们平时在数据可视化或空间数据分析的过程中经常会 ...

  3. (数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)

    一.简介 接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库,CSS,正则表达式等),在那篇文 ...

  4. (数据科学学习手札32)Python中re模块的详细介绍

    一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...

  5. (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播图

    本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl作为一款强大的开源地理信 ...

  6. (数据科学学习手札55)利用ggthemr来美化ggplot2图像

    一.简介 R中的ggplot2是一个非常强大灵活的数据可视化包,熟悉其绘图规则后便可以自由地生成各种可视化图像,但其默认的色彩和样式在很多时候难免有些过于朴素,本文将要介绍的ggthemr包专门针对原 ...

  7. (数据科学学习手札49)Scala中的模式匹配

    一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...

  8. (数据科学学习手札40)tensorflow实现LSTM时间序列预测

    一.简介 上一篇中我们较为详细地铺垫了关于RNN及其变种LSTM的一些基本知识,也提到了LSTM在时间序列预测上优越的性能,本篇就将对如何利用tensorflow,在实际时间序列预测任务中搭建模型来完 ...

  9. (数据科学学习手札69)详解pandas中的map、apply、applymap、groupby、agg

    *从本篇开始所有文章的数据和代码都已上传至我的github仓库:https://github.com/CNFeffery/DataScienceStudyNotes 一.简介 pandas提供了很多方 ...

  10. (数据科学学习手札61)xpath进阶用法

    一.简介 xpath作为对网页.对xml文件进行定位的工具,速度快,语法简洁明了,在网络爬虫解析内容的过程中起到很大的作用,除了xpath的基础用法之外(可参考我之前写的(数据科学学习手札50)基于P ...

随机推荐

  1. NSIS隐藏窗口标题栏自带的按钮(最大化,最小化,关闭X)

    这个问题实在八月份逛csdn论坛的时候偶然遇到的,当时比较好奇楼主为啥要隐藏关闭按钮,就顺口问了下,结果楼主已经弃楼,未给出原因,猜着可能是为了做自定义页面美化,无法改变按纽外观之类的,后来琢磨了下, ...

  2. [题解] LOJ 3300 洛谷 P6620 [省选联考 2020 A 卷] 组合数问题 数学,第二类斯特林数,下降幂

    题目 题目里要求的是: \[\sum_{k=0}^n f(k) \times X^k \times \binom nk \] 这里面出现了给定的多项式,还有组合数,这种题目的套路就是先把给定的普通多项 ...

  3. MSQL-->存储引擎

    概述 MySQL体系结构图 Innodb引擎是在mysql的5.5版本之后的默认存储引擎. Index是在引擎层次的,不同的存储引擎index的用法不同. 存储引擎就是存储数据,建立索引,更新查询数据 ...

  4. 【pytest官方文档】解读- 插件开发之hooks 函数(钩子)

    上一节讲到如何安装和使用第三方插件,用法很简单.接下来解读下如何自己开发pytest插件. 但是,由于一个插件包含一个或多个钩子函数开发而来,所以在具体开发插件之前还需要先学习hooks函数. 一.什 ...

  5. RAID5 IO处理之写请求代码详解

    我们知道RAID5一个条带上的数据是由N个数据块和1个校验块组成,其校验块由N个数据块通过异或运算得出,这样才能在任意一个成员磁盘失效时通过其他N个成员磁盘恢复出用户写入的数据.这也就要求RAID5条 ...

  6. 华为交换机GVRP基础配置

    GVRP基础配置 int G0/0/1 port link-type trunk 配置接口类型为trunk port trunk allow-pass vlan all 允许所有VLAN通过 int ...

  7. 配置文件yaml和ini

    前言 本文主要介绍配置文件yaml和ini的读取. 一.yaml文件 YAML是一个可读性高,易于理解,用来表达数据序列化的格式.语法与python的语法类似.文件后缀  .yaml 下面是yaml文 ...

  8. 知识图谱-生物信息学-医学论文(BMC Bioinformatics-2022)-挖掘阿尔茨海默病相关KG来确定潜在的相关语义三元组用于药物再利用

    论文标题: Mining On Alzheimer's Diseases Related Knowledge Graph to Identity Potential AD-related Semant ...

  9. 【MySQL】01_运算符、函数

    运算符 运算符是保留字或主要用于 SQL 语句的 WHERE 子句 中的字符,用于执行操作,例如:比较和算术运算. 这些运算符用于指定 SQL 语句中的条件,并用作语句中多个条件的连词. 常见运算符有 ...

  10. KNN算法之集美大学

     在本篇文章中,我即将以在集美大学收集到的一些数据集为基础,使用KNN算法进行一系列的操作 一.KNN算法 首先,什么是KNN算法呢,这得用到老祖宗说的一句话"近朱者赤近墨者黑", ...