从PyGEOS几何后端迁移到Shapely 2.0#

自0.8版本以来,GeoPandas包括对PyGEOS的实验性支持,作为Shapely的替代几何后端。最近,PyGEOS代码库已并入Shapely项目,并作为Shapely 2.0的一部分发布。因此,GeoPandas将弃用对PyGEOS后端的支持,并将继续使用Shapely 2.0作为唯一提供GEOS功能的几何引擎。

考虑到历史上如果安装了该包,PyGEOS引擎会自动使用(这种行为将在GeoPandas 0.14中改变,如果安装了Shapely 2.0将默认使用它),一些下游代码可能依赖于 PyGEOS几何体作为GeometryArray的底层数据可用。

本指南概述了从基于PyGEOS的代码迁移到基于Shapely的代码。

迁移期#

迁移计划为三个版本,跨度约为一年,从2023年第二季度发布的0.13开始。

GeoPandas 0.13#

  • 如果安装了,PyGEOS仍然作为默认后端使用,优于Shapely(1.8或2.0),并会发出关于即将变化的FutureWarning警告。

GeoPandas 0.14#

  • 默认后端为 Shapely 2.0,只有在安装了 Shapely 1.8 而不是 2.0 或更新版本时才会使用 PyGEOS。PyGEOS 后端仍然支持,但用户需要通过环境变量 USE_PYGEOS 来选择使用,如安装说明中所述。

GeoPandas 1.0#

  • GeoPandas将取消对PyGEOS和Shapely<2的支持。

如何准备你的代码以进行转换#

如果您不显式使用 PyGEOS,则无需采取任何措施,因为 GeoPandas 的内部将会处理过渡。如果您直接使用 PyGEOS 并通过 GeoSeries.values.data 访问 PyGEOS 几何图形数组,则需要进行一些更改以避免代码中断。

推荐的方法是使用 Shapely 向量化操作在 GeometryArray 上,而不是访问几何体的 NumPy 数组并对数组使用 PyGEOS/Shapely 操作。

这是在GeoPandas 0.12(或更早版本)中使用的一个常见模式,应该在新代码中避免使用:

>>> import pygeos
>>> geometries = gdf.geometry.values.data
>>> mrr = pygeos.minimum_rotated_rectangle(geometries)

重构这段代码的推荐方式如下(使用Geopandas 0.12或更高版本):

>>> import shapely  # shapely 2.0
>>> mrr = shapely.minimum_rotated_rectangle(gdf.geometry.array)

这段代码无论GeoPandas实际使用哪个几何后端都能正常工作,因为在 GeometryArray级别,它始终返回Shapely几何。尽管请注意,这可能涉及将PyGEOS几何转换为Shapely几何的额外开销。

请注意,虽然在大多数情况下,将 pygeos 简单替换为 shapely 以及将 gdf.geometry.values.data 更改为 gdf.geometry.values 或 类似的 gdf.geometry.array 应该可以工作,但 PyGEOS 和 Shapely 之间的 API 有一些差异。有关详细信息,请参阅 从 PyGEOS 迁移 文档。