第20章中关于仿射变换与坐标操作有哪些详细内容?
摘要:layout: default title: "第20章:仿射变换与坐标操作" 第20章:仿射变换与坐标操作 仿射变换是几何学中的基本操作,能够对空间要素进行平移、旋转、缩放和倾斜等变换,
第20章:仿射变换与坐标操作
仿射变换是几何学中的基本操作,能够对空间要素进行平移、旋转、缩放和倾斜等变换,同时保持直线和平行性不变。本章将全面介绍 GeoPandas 中仿射变换的实现方法,以及底层坐标的提取、修改和精度控制等操作。
20.1 仿射变换概述
20.1.1 什么是仿射变换
仿射变换(Affine Transformation)是线性变换加平移的组合,包含以下基本类型:
平移(Translation):将几何体沿 X/Y 方向移动指定距离
旋转(Rotation):将几何体绕某一点旋转指定角度
缩放(Scaling):将几何体按比例放大或缩小
倾斜(Skew):将几何体沿某一轴进行剪切变换
性质
说明
保持直线性
直线变换后仍为直线
保持平行性
平行线变换后仍然平行
保持比例关系
同一直线上点的比值不变
不保持角度
角度可能变化(纯旋转除外)
20.1.2 仿射变换矩阵
二维仿射变换用 6 个参数 [a, b, d, e, xoff, yoff] 表示,变换公式为:
x' = a * x + b * y + xoff
y' = d * x + e * y + yoff
参数
含义
恒等变换值
a
X 方向缩放因子
1
b
Y 对 X 的倾斜因子
0
d
X 对 Y 的倾斜因子
0
e
Y 方向缩放因子
1
xoff
X 方向平移量
0
yoff
Y 方向平移量
0
注意: 恒等变换(不做任何改变)对应的矩阵参数为 [1, 0, 0, 1, 0, 0]。
20.2 GeoSeries.affine_transform() 方法
20.2.1 方法签名与参数
GeoSeries.affine_transform(matrix)
参数
类型
说明
matrix
list/tuple
6 元素仿射矩阵 [a, b, d, e, xoff, yoff]
返回值为变换后的 GeoSeries。
20.2.2 基础用法示例
import geopandas as gpd
from shapely.geometry import Polygon
gdf = gpd.GeoDataFrame(
{"name": ["矩形A", "矩形B"]},
geometry=[
Polygon([(0, 0), (2, 0), (2, 1), (0, 1)]),
Polygon([(3, 0), (5, 0), (5, 1), (3, 1)])
]
)
# 应用恒等变换
result = gdf.geometry.affine_transform([1, 0, 0, 1, 0, 0])
print(result)
输出:
0 POLYGON ((0 0, 2 0, 2 1, 0 1, 0 0))
1 POLYGON ((3 0, 5 0, 5 1, 3 1, 3 0))
dtype: geometry
20.3 平移变换(translate)
20.3.1 使用 affine_transform 实现平移
平移矩阵为 [1, 0, 0, 1, xoff, yoff]:
import geopandas as gpd
from shapely.geometry import Polygon
gdf = gpd.GeoDataFrame(
{"name": ["建筑物"]},
geometry=[Polygon([(0, 0), (4, 0), (4, 3), (0, 3)])]
)
# 向右平移 10,向上平移 5
gdf["translated"] = gdf.geometry.affine_transform([1, 0, 0, 1, 10, 5])
print(gdf["translated"].iloc[0])
输出:
POLYGON ((10 5, 14 5, 14 8, 10 8, 10 5))
20.3.2 使用 Shapely translate 函数
from shapely.affinity import translate
# 逐要素平移
gdf["translated"] = gdf.geometry.apply(
lambda geom: translate(geom, xoff=10, yoff=5)
)
注意: affine_transform() 是向量化操作,性能优于逐要素 apply。数据量较大时应优先使用 affine_transform()。
