Shapely几何对象操作指南:从基础到实践
概述
Shapely是一个强大的Python库,专注于平面几何对象的集合论分析和操作。它基于GEOS库(Java Topology Suite的C++移植版本),为Python开发者提供了处理点、线、面等几何对象的能力,而无需依赖空间数据库系统。
核心概念
空间数据模型
Shapely实现了三种基本几何对象类型:
- 点(Point):零维对象,仅包含一个坐标点
- 线(LineString/LinearRing):一维对象,由一系列有序点组成
- 面(Polygon):二维对象,由外环和可选的内环(孔洞)组成
每种几何对象都有三个互斥的点集:内部(interior)、边界(boundary)和外部(exterior)。
几何关系
Shapely提供了一系列自然语言关系谓词:
contains
:包含intersects
:相交overlaps
:重叠touches
:接触- 等等
这些关系基于DE-9IM(Dimensionally Extended 9-Intersection Model)矩阵理论实现。
坐标系统
Shapely工作在笛卡尔平面坐标系中,不支持坐标系统转换。所有操作都假设几何对象位于同一平面。
几何对象详解
通用属性和方法
所有几何对象共享一些基本属性和方法:
# 面积(面对象才有非零值)
geom.area
# 边界框(minx, miny, maxx, maxy)
geom.bounds
# 长度(线对象才有非零值)
geom.length
# 几何类型
geom.geom_type
# 计算到另一几何对象的最小距离
geom.distance(other)
# 计算Hausdorff距离(1.6.0新增)
geom.hausdorff_distance(other)
# 获取几何对象内的代表性点
geom.representative_point()
点(Point)
from shapely import Point
# 创建点对象
p = Point(0.0, 0.0)
# 访问坐标
p.x # 0.0
p.y # 0.0
p.coords # [(0.0, 0.0)]
线(LineString)
from shapely import LineString
# 创建线对象(至少需要2个点)
line = LineString([(0, 0), (1, 1)])
# 访问坐标序列
list(line.coords) # [(0.0, 0.0), (1.0, 1.0)]
环(LinearRing)
from shapely import LinearRing
# 创建环对象(自动闭合)
ring = LinearRing([(0, 0), (1, 1), (1, 0)])
# 坐标序列自动闭合
list(ring.coords) # [(0.0, 0.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)]
面(Polygon)
from shapely import Polygon
# 创建简单多边形
poly = Polygon([(0, 0), (1, 1), (1, 0)])
# 创建带孔洞的多边形
poly_with_hole = Polygon(
[(0, 0), (0, 10), (10, 10), (10, 0)], # 外环
[[(1, 1), (1, 2), (2, 2), (2, 1)]] # 内环列表
)
# 访问外环和内环
poly.exterior # 外环LinearRing对象
poly.interiors # 内环列表
注意事项
- Z坐标:Shapely会忽略z坐标值,所有计算都在x-y平面进行
- 几何有效性:Shapely不会自动验证几何对象的有效性
- 性能考虑:避免在几何对象中包含重复点
- 环的自相交:虽然可以创建自相交的环,但操作时可能引发异常
实际应用示例
创建矩形多边形
from shapely.geometry import box
# 创建矩形(左下角x,y, 右上角x,y)
rect = box(0, 0, 1, 1)
计算几何关系
point = Point(0.5, 0.5)
polygon = Polygon([(0, 0), (0, 1), (1, 1), (1, 0)])
# 判断点是否在多边形内
point.within(polygon) # True
# 计算两个几何对象的交集
line = LineString([(0, 0), (1, 1)])
line.intersection(polygon) # 返回相交部分的几何对象
总结
Shapely为Python提供了强大的几何计算能力,特别适合需要在不依赖空间数据库的情况下进行空间分析的场景。通过理解其核心概念和对象模型,开发者可以高效地处理各种空间关系计算和几何操作任务。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考