Shapely:Python 平面几何对象操作库
Shapely:Python 平面几何对象操作库
Shapely 是一个 BSD 许可的 Python 包,处理平面几何对象的操作和分析。GitHub 上获得了 4,453 个 Star。
底层依赖 GEOS 库,这也是 PostGIS 和 JTS 的几何引擎,经过多年生产环境验证。Shapely 把 GEOS 的几何操作封装成了 Python 接口,同时提供基于 NumPy ufunc 的高性能数组操作。
它不直接处理数据序列化格式或坐标系统,这方面的需求可以交给 Fiona、PyProj 等专业包来完成。

两层接口设计
Shapely 提供了两种操作几何对象的方式。
标量几何接口处理单个几何对象。比如创建一个点,然后做缓冲区分析:
>>> from shapely import Point
>>> patch = Point(0.0, 0.0).buffer(10.0)
>>> patch
<POLYGON ((10 0, 9.952 -0.98, 9.808 -1.951, ...>
>>> patch.area
313.6548490545941
矢量化 ufunc 接口用 NumPy 数组批量操作几何数据,避免手动写 for 循环:
>>> import shapely
>>> import numpy as np
>>> geoms = np.array([Point(0, 0), Point(1, 1), Point(2, 2)])
>>> polygon = shapely.box(0, 0, 2, 2)
>>> shapely.contains(polygon, geoms)
array([False, True, False])
这里的 ufunc 是 NumPy 的通用函数概念,底层循环用 C 实现,逐个操作数组元素并支持广播机制。相比 Python 层的 for 循环,性能提升明显。
多线程支持
Shapely 的函数在执行期间会释放 GIL(全局解释器锁),多个线程可以同时调用几何计算,不会互相阻塞。这在单个 Python 进程内就能利用多核 CPU 做并行处理,对于处理大批量空间数据的场景很实用。
数据交换格式
Shapely 支持 WKT(Well-Known Text)和 WKB(Well-Known Binary)两种通用地理数据格式的序列化:
>>> from shapely.wkt import dumps, loads
>>> dumps(loads('POINT (0 0)'))
'POINT (0.0000000000000000 0.0000000000000000)'
也支持 GeoJSON 格式与其他 Python GIS 包对接:
>>> import json
>>> from shapely.geometry import mapping, shape
>>> s = shape(json.loads('{"type": "Point", "coordinates": [0.0, 0.0]}'))
>>> print(json.dumps(mapping(s)))
{"type": "Point", "coordinates": [0.0, 0.0]}

安装与版本要求
Shapely 2.2 的依赖要求为 Python >= 3.11、GEOS >= 3.10、NumPy >= 1.23。安装推荐使用预编译分发版:
pip install shapely
conda install shapely --channel conda-forge
当前版本对依赖版本要求较高,升级前建议确认环境中的 GEOS 和 NumPy 版本是否满足条件。
社区与支持
Shapely 的社区活跃度不错,相关问题可以在 GIS StackExchange 上搜索 shapely 标签。Bug 报告和功能建议通过 GitHub Issues 提交。从 2007 年发布至今,Shapely 在 GIS 生态中持续维护了超过十五年。
ly 标签。Bug 报告和功能建议通过 GitHub Issues 提交。从 2007 年发布至今,Shapely 在 GIS 生态中持续维护了超过十五年。
更多推荐
所有评论(0)