1 简介
大家好我是费老师,就在前两天,Python
生态中的GIS
运算神器geopandas
发布了其0.14.0
新版本,在这次新版本更新中,不仅是新增了许多矢量计算API
,还开始为日后正式发布1.0
版本做准备,对一些底层依赖版本进行改动。今天的文章中,我就将为大家一一介绍相关的更新内容:
2 geopandas 0.14版本更新内容
2.1 安装新版本geopandas
需要注意的是,从0.14
版本开始,geopandas
将最低支持的python
版本提升至3.9
:
因此,推荐大家以3.9
版本作为建立GIS
运算Python
环境的基础,这里我们以conda
为例,直接建立新的虚拟环境来做演示(下面的命令中为了加速下载过程使用到相关国内conda
资源镜像):
conda create -n geopandas-demo python=3.9 -c https://mirrors.sustech.edu.cn/anaconda/pkgs/main/ -y conda activate geopandas-demo conda install geopandas pyogrio jupyterlab -c https://mirrors.sustech.edu.cn/anaconda/cloud/conda-forge -y
直接在终端中执行上述命令即可一步到位完成虚拟环境的创建,以及新版geopandas
、jupyterlab
的安装:
2.2 geopandas 0.14版本底层依赖变动
在0.14
版本中,geopandas
底层将默认使用shapely
(>=2.0版本)进行高性能矢量运算,因此geopandas
仅会在shapely
缺失但pygeos
已安装时,才会调用pygeos
。且geopandas
将会在未来要发布的1.0
正式版本中,直接移除对pygeos
,以及旧版shapely
(<2.0版本)的支持:
2.3 新增一系列矢量计算方法
在这次新版本中,基于shapely
为GeoSeries/GeoDataFrame
新引入了一系列矢量计算方法,具体有:
2.3.1 新增concave_hull()方法
有别于先前已有的convex_hull
方法,新增的concave_hull()
方法用于为矢量列中的每个要素计算「最小凹多边形」,与convex_hull
计算结果的对比示例如下:
import random from shapely.geometry import MultiPoint # 示例GeoSeries demo_geometries = gpd.GeoSeries( [ MultiPoint([(random.uniform(0, 1), random.uniform(0, 1)) for i in range(25)]) ] ) ax = demo_geometries.plot() # concave_hull()计算结果 demo_geometries.concave_hull().plot(ax=ax, facecolor='none', edgecolor='red') # 对比convex_hull()计算结果 demo_geometries.convex_hull.plot(ax=ax, facecolor='none', edgecolor='green');
2.3.2 新增delaunay_triangles()方法
新增了用于计算Delaunay三角网的delaunay_triangles()
方法,计算示例如下:
2.3.3 新增extract_unique_points()方法
新增extract_unique_points()
方法,用于直接从任意类型目标矢量中提取全部折点要素:
2.3.4 新增frechet_distance()方法
新增frechet_distance()
方法,用于计算弗雷歇距离(fréchet distance),是一种用来度量路径之间相似度的经典数学方法:
举个例子,我们构造如下的四条路径线要素,肉眼上很容易看出a
与b
,c
与d
各自相似度最高:
而通过frechet_distance()
计算两两之间的弗雷歇距离,也可以从数值计算角度准确计算得到彼此最相似的路径:
2.3.5 新增minimum_rotated_rectangle()方法
新增minimum_rotated_rectangle()
方法,用于为矢量列中各个要素计算最小外接矩形,譬如:
2.3.6 新增offset_curve()方法
新增offset_curve()
方法,用于为目标要素构建偏移曲线,即与原始要素相似但偏移一定的距离:
2.3.7 新增remove_repeated_points()方法
新增remove_repeated_points()
方法,用于沿要素坐标串定义方向,将距离在阈值以内的坐标点视作重复点要素进行移除,默认阈值为0,你可以在实际应用中灵活调整阈值,从而起到简化要素的目的:
2.3.8 新增segmentize()方法
新增segmentize()
方法,用于对目标矢量列中的各要素,按照设定的等间距进行增密操作,譬如在原有仅起点终点连成线要素基础上,按照1单位距离进行增密的结果如下:
2.3.9 新增shortest_line()方法
新增shortest_line()
方法,用于计算任意两个要素之间最短距离连线:
2.4 sjoin_nearest()新增exclusive参数
新版本中为sjoin_nearest()
新增参数exclusive
,默认为False
,当设置为True
时,会在计算过程中自动忽略与自身要素相同的最近邻要素,非常的实用,省得我们在做sjoin_nearest()
最近邻搜索计算之前手动排除要素自身: