(数据科学学习手札129)geopandas 0.10版本重要新特性一览

费弗里 2021-10-27 18:22:01
学习 数据 科学 学学 科学学

本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes

1 简介

就在前不久,我们非常熟悉的Python地理空间分析库geopandas更新到了0.10.0版本,而伴随最近一段时间其针对新版本的一些潜在bug进行的修复,写作本文时最新的正式版本为0.10.2。此次0.10.x版本为我们带来了诸多令人兴奋的新功能新特性,本文就将带大家一睹其中一些比较重要的内容。

2 geopandas 0.10版本重要新特性一览

如果你已经安装了旧版本的geopandas,那么推荐执行下列命令进行geopandas的更新:

conda update geopandas -c https://mirrors.sjtug.sjtu.edu.cn/anaconda/cloud/conda-forge -y

而如果你还没有安装geopandas,那么下面的安装方式是最稳妥的:

conda install geopandas=0.10.2 -c https://mirrors.sjtug.sjtu.edu.cn/anaconda/cloud/conda-forge -y
pip uninstall rtree -y
pip install rtree -i https://pypi.douban.com/simple/
pip install pygeos -i https://pypi.douban.com/simple/

安装/更新完成后,检验一下geopandas是否被正确安装:

下面我们就来看看这次版本更新中有哪些重要新变动吧~

2.1 新增空间最近连接方法sjoin_nearest()

我们都知道利用geopandas中的sjoin(),可以完成基于多种空间拓扑关系的空间连接操作。

但有些时候我们需要判断的并不是左右两表中矢量列相交、包含等直接的拓扑关系,而是左右两表矢量列之间距离至少xx米这类的空间距离关系判断,这在旧版本的geopandas中,通常可以左右两边分别做缓冲区后进行常规空间连接来实现。

而这次新增的sjoin_nearest()就可以支持我们开展上述分析计算功能,它的主要参数有:

  • left_df:连接对应的左GeoDataFrame
  • right_df:连接对应的右GeoDataFrame
  • how:设置连接方式,可选的有'left''right''inner',默认为'inner'
  • max_distance:重要参数,用于设置最大搜索距离阈值,当矢量间的距离小于此阈值时才会进行连接
  • lsuffix:设置左表重名字段后缀文字,默认为'left'
  • rsuffix:设置右表重名字段后缀文字,默认为'right'
  • distance_col:设置连接结果表中记录对应矢量间距离的字段名称,默认不设置时不会在结果表中添加距离信息

下面我们来通过一个简单的例子来体验这个功能:

import geopandas as gpd
from shapely.geometry import Point
# 构造示例点要素表1
gdf1 = gpd.GeoDataFrame(
{
'id1': list('abc'),
'geometry': [
Point(0, 0),
Point(1, 0),
Point(-1, 0)
]
}
)
# 构造示例点要素表2
gdf2 = gpd.GeoDataFrame(
{
'id2': list('def'),
'geometry': [
Point(0.4, 0),
Point(1.2, 0),
Point(-1.3, 0)
]
}
)
ax = gdf1.plot(color='red')
ax = gdf2.plot(color='green', ax=ax)
ax.axis('equal');

颜色即用来区分我们的左右表对应矢量点位置,下面直接运用sjoin_nearest()进行空间最近连接,设置的距离阈值为0.35:

(
gpd
.sjoin_nearest(gdf1, gdf2, max_distance=0.35, distance_col='对应距离')
)

非常的方便快捷:

2.2 新增交互地图式数据探索方法explore()

很多人都知道著名的在线地图可视化组件leafletPython中有对应的库folium,而在这次新版本中,geopandasGeoDataFrameGeoSeries对象新增交互式地图可视化方法explore(),你可以理解为交互式版本的plot()方法。

其参数设置较为丰富,我之后会单独写一篇文章来为大家介绍,下面展示一个简单易懂的例子(注意,如果你的矢量数据非常大,请不要用此方法绘图,在线地图方式适合较小的矢量数据):

provinces = gpd.read_file('省.shp')
provinces.head(3)
...
provinces.explore(
column='类型',
zoom_start=4
)

2.3 sjoin()、sjoin_nearest()、overlay()和clip()亦可作为GeoDataFrame的方法来使用

在以前的版本中,我们只能使用gpd.XXX()的方式来使用sjoin()overlay()clip()等方法,而在这次新版本更新中,我们可以像pandas里的merge()join()那样作为方法使用,好处就是可以更好的书写链式运算过程啦🥳!以上文介绍的sjoin_nearest()为例,只需向sjoin_nearest()方法中传入右表即可:

(
gdf1
.sjoin_nearest(gdf2,
max_distance=0.35,
distance_col='对应距离')
)

2.4 GeoSeries新增批量XY转点方法from_xy()

新版本中为GeoSeries对象新增了from_xy()方法来快速实现坐标转点,下面与gpd.points_from_xy()的效果进行对比:

gpd.points_from_xy(x=range(10), y=range(10))
...
gpd.GeoSeries.from_xy(x=range(10), y=range(10))

2.5 to_file()方法在driver参数缺省时可自动识别导出文件类型

在新版本中,若未在to_file()中指定driver参数,geopandas会自动根据文件后缀名来自动推断要导出的矢量文件类型:

import os
gdf1.to_file('test.shp')
gdf1.to_file('test.geojson')
[file for file in os.listdir() if 'test.' in file]

2.6 支持对矢量数据自动推断合适的横轴墨卡托坐标参考系

其实这个特性在0.9版本中就已加入,但是还有一些小问题,而新版本中这个功能更加完善,效果如下:

2.7 sjoin()中的op参数改名为predicate

为了让参数名更加的贴切,在以前版本sjoin()中用于设置拓扑关系的参数op在这次新版本中被改名为predicate,大家在使用时要留意:


大家在了解到这些新功能和变动后,在使用新版geopandas时,如果遇到未知bug,欢迎在https://github.com/geopandas/geopandas/issues及时提交说明,一起帮助geopandas变得更加好用和完善。

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

版权声明
本文为[费弗里]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/feffery/p/15472342.html

  1. LPC55S69 MicroPython模组和库函数
  2. LPC55S69 IoT Kit专属 Micropython模组和库函数简介
  3. 使用soundcard在Python中操作声卡
  4. 自动化快速上手--Python(7)--【字典】--每天半小时
  5. Python之循环结构【包括列表、for语句、range()函数、while语句、循环嵌套、break、continue、算法优化等】
  6. Python模块安装与异常处理详解(numpy、pygame、matplotlib等)
  7. Python__init__.py作用
  8. python 爬取网页时出现多种错误
  9. Python中关于大量绘制速度曲线的问题
  10. python-async的安装和使用方法
  11. Matlab的fread(fild,1,int32)迁移到python变成什么
  12. 想用python开发一个音频过滤器,请指导?
  13. python使用openpyxl读取Excel文件显示No such file or directory
  14. xmoji虚拟头像交互如何使用python(像深度学习)制作?
  15. python 打开页面页面的链接,为什么总是报错呀?
  16. Python中DataLoader的batch_size、shuffle的疑惑。
  17. python安装pymssql库,可以import,但无法调用函数
  18. 【Python学习教程】常用的8个Python数据可视化库!
  19. python处理csv中的时间
  20. 数据结构,元音统计(Python)
  21. python的site-packages复制直接到其他电脑环境上能用吗
  22. Pycharm如何给项目配置python解释器
  23. conda创建python虚拟环境
  24. Python selenium的爬虫无法完整爬取整个页面的内容
  25. 高清版!这18张 Python 数据科学速查表,让你的代码变得更强大!
  26. python代码不会敲,请好心老哥帮助我一下
  27. Python敲七输出符合的个数
  28. Python 有人能给提供简单的思路嘛
  29. python单次运行写入csv成功,循环写入失败
  30. python利用os模块进行增量备份
  31. 【算法学习】807. 保持城市天际线(java / c / c++ / python / go / rust)
  32. 如何利用python输出等腰杨辉三角
  33. python按键执行倒计时小程序不能实现要求,要怎么改才好?
  34. Python request模块post请求的问题
  35. Django连接已有Oracle时的主键设置问题,没主键无法查询怎么办?
  36. 如何用python的dictionary编写一个联系人通讯录程序
  37. 如果Python里range反向输出,不输出步长会怎么样?
  38. 一个关于Python pip的问题: 出现Cannot open \python\Scripts\pip-script.py报错
  39. 富婆闺蜜非让我用Python给她写个淘宝双十一抢购脚本,那只能安排了
  40. 【全网最全】python正则表达式大全,所有讲解都在这,包教包会,学不会找我!
  41. AI python课和 python课都是198 这两个课是同一个课程内容吗?有什么区别和相似点?
  42. python的__new__()疑问
  43. Python代码阅读(第24篇):根据筛选函数将列表元素分成两组
  44. python怎么实现动态障碍物按固定路径行走
  45. Python代码阅读(第24篇):根据筛选函数将列表元素分成两组
  46. Python题目,希望帮我解答一下辛苦
  47. python +selenium 如何获取下拉列表,默认选中值
  48. 有个pb文件做好的模型,对此模型的操作想用python封装成api,怎么做?
  49. 请问,mac的Pycharm中新建项目时候的Base interpreter选项里有两个Python3.8,该选哪个?
  50. python如何读取指定文件名的excel并分别汇总
  51. 如何写利用python将fastq文件转换成fasta文件的脚本
  52. python小工具
  53. 新猿0基础python教程 如何写好接口文档
  54. 请问我哪里错了呀,数值计算,python运算符号出错,但是我看不出来
  55. Python游戏开发,Pygame模块,Python从零开始带大家实现一个魔塔小游戏(2)
  56. Python爬虫实战,requests模块,Python实现抓取王者荣耀全套皮肤
  57. Python游戏开发,Pygame模块,Python从零开始带大家实现一个魔塔小游戏(3)
  58. 大神们这个问题用python怎么解决啊
  59. 简单理解python装饰器
  60. 货物托运收费问题用python 求解 一直输出错误