Shapely 1.8/2.0 迁移指南:几何库的重大变更解析
前言
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.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。
迁移建议
如果需要存储几何对象的附加属性,可以考虑以下替代方案:
- 使用字典结构:
geometry_data = {
'geometry': line,
'name': 'my_geometry'
}
- 使用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属性检查几何体是否为空,而不是依赖类型判断。
其他废弃功能
- 适配器模式:
asShape()等适配器将被移除,建议使用shape()函数 - empty()方法:将被移除,使用
is_empty属性替代 - 级联合并:
cascaded_union将被移除,使用unary_union替代
总结
Shapely 2.0带来了许多改进,但也包含一些破坏性变更。主要变化包括:
- 几何对象变为不可变
- 多部分几何体访问方式变更
- 与NumPy互操作方式的调整
- 空几何体创建行为统一
开发者应尽早适配这些变更,以确保代码在未来版本中能够正常运行。对于复杂的迁移场景,建议逐步更新代码,并充分利用1.8版本提供的警告信息来定位需要修改的部分。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



