第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()。
阅读全文