Shapely 1.8/2.0 迁移指南:几何库的重大变更解析

Shapely 1.8/2.0 迁移指南:几何库的重大变更解析

【免费下载链接】shapely Manipulation and analysis of geometric objects 【免费下载链接】shapely 项目地址: https://gitcode.com/gh_mirrors/sh/shapely

前言

Shapely 是一个用于处理几何对象的Python库,广泛应用于地理信息系统(GIS)、空间分析和数据可视化等领域。随着版本的演进,Shapely 1.8 是一个过渡版本,引入了多项警告,为即将到来的2.0版本做准备。2.0版本则是一个重大更新,内部重构带来了显著的性能提升,同时也包含了一些破坏性变更。

本文将详细解析这些变更,帮助开发者平滑过渡到新版本。

几何对象将变为不可变

现状与变更

在Shapely 1.x版本中,几何对象是可变的,开发者可以直接修改其坐标:

from shapely.geometry import LineString
line = LineString([(0,0), (2, 2)])
line.coords = [(0, 0), (10, 0), (10, 10)]  # 直接修改坐标

从1.8版本开始,这种操作会触发警告,而在2.0版本中,所有几何对象将变为不可变。这一变更带来两个重要影响:

  1. 不可变性:几何对象一旦创建就不能再修改
  2. 可哈希性:几何对象可以作为字典的键或集合的元素使用
迁移建议

不再支持直接修改现有几何对象的坐标,开发者需要创建新的几何对象:

# 旧方式(1.x版本)
line.coords = [(0, 0), (10, 0), (10, 10)]

# 新方式(2.0版本)
new_line = LineString([(0, 0), (10, 0), (10, 10)])

自定义属性设置将被移除

现状与变更

在1.x版本中,可以为几何对象添加自定义属性:

line.name = "my_geometry"  # 添加自定义属性

1.8版本会发出警告,2.0版本将直接抛出AttributeError。

迁移建议

如果需要存储几何对象的附加属性,可以考虑以下替代方案:

  1. 使用字典结构:
geometry_data = {
    'geometry': line,
    'name': 'my_geometry'
}
  1. 使用GeoPandas的GeoDataFrame(如果已在使用GeoPandas)

多部分几何体不再支持序列操作

现状与变更

在1.x版本中,多部分几何体(MultiPoint、MultiLineString等)支持类似列表的操作:

mp = MultiPoint([(1, 1), (2, 2), (3, 3)])
for part in mp:  # 迭代
    print(part)
    
print(mp[1])  # 索引访问
len(mp)  # 获取长度

1.8版本会发出警告,2.0版本将完全移除这些功能。

迁移建议

使用.geoms属性访问几何部分:

# 迭代
for part in mp.geoms:
    print(part)

# 索引访问
print(mp.geoms[1])

# 获取长度
len(mp.geoms)

# 转换为列表
list(mp.geoms)

与NumPy的互操作性变更

坐标数组接口变更

1.x版本中,几何对象可以直接转换为NumPy数组:

np.asarray(line)  # 直接转换

1.8版本会发出警告,2.0版本将移除这一功能。

迁移建议

使用.coords属性进行转换:

np.array(line.coords)  # 通过坐标序列转换

创建几何对象数组

创建包含几何对象的NumPy数组时,建议采用两步法以避免警告:

geoms = [Point(0, 0), Point(1, 1), Point(2, 2)]
arr = np.empty(len(geoms), dtype="object")

with warnings.catch_warnings():
    warnings.filterwarnings("ignore", category=ShapelyDeprecationWarning)
    arr[:] = geoms

对于需要支持多版本Shapely的代码,可以定义一个上下文管理器:

import contextlib
import warnings
from packaging import version

# ...(版本检测代码)

@contextlib.contextmanager
def ignore_shapely2_warnings():
    with warnings.catch_warnings():
        warnings.filterwarnings("ignore", category=ShapelyDeprecationWarning)
        yield

空几何体创建的一致性改进

现状与变更

1.x版本中,创建空几何体的方式不一致:

Polygon()  # 返回GeometryCollection
wkt.loads("POLYGON EMPTY")  # 返回正确的空Polygon

2.0版本将统一行为,确保所有创建方式都返回正确类型的空几何体。

迁移建议

使用.is_empty属性检查几何体是否为空,而不是依赖类型判断。

其他废弃功能

  1. 适配器模式asShape()等适配器将被移除,建议使用shape()函数
  2. empty()方法:将被移除,使用is_empty属性替代
  3. 级联合并cascaded_union将被移除,使用unary_union替代

总结

Shapely 2.0带来了许多改进,但也包含一些破坏性变更。主要变化包括:

  1. 几何对象变为不可变
  2. 多部分几何体访问方式变更
  3. 与NumPy互操作方式的调整
  4. 空几何体创建行为统一

开发者应尽早适配这些变更,以确保代码在未来版本中能够正常运行。对于复杂的迁移场景,建议逐步更新代码,并充分利用1.8版本提供的警告信息来定位需要修改的部分。

【免费下载链接】shapely Manipulation and analysis of geometric objects 【免费下载链接】shapely 项目地址: https://gitcode.com/gh_mirrors/sh/shapely

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值