工作开发中常常会遇到坐标系转换的问题,关于如何实现不同坐标系之间的转换的论述非常之多,基于实际应用项目,大都提出了一种较好的解决方法。两年前,我也从网上下载了一篇文章——《坐标系转换公式》(青岛海洋地质研究所戴勤奋译),文中对各种变换模型都有详细的描述,如莫洛金斯基-巴德卡斯转换模型、赫尔黙特转换模型、布尔莎模型以及多项式转换,算是一篇比较全面介绍坐标系转换方面的文章。
我想大家对常用转换模型的理解方面一般不会有大太困难,如果基于当前流行GIS平台(如超图、ArcGIS、MapInfo)的基础上作二次开发,我想也不会有什么困难,只要找准了它们提供的接口,理顺一下思路,我们也能实现用户提出的需求。但是对于内核算法、参数求解的过程我们却一无所知,很多时候我们自己觉得解决了这个问题,也就不会太去关注底层实现的算法问题了。不过,说实话要去真正弄清楚各个模型之间的关系确实是一件头痛的事情,没有一定的数学功底还真的是不知道它在说些什么。
二、仿射变换
仿射变换是空间直角坐标变换的一种,它是一种二维坐标到二维坐标之间的线性变换,保持二维图形的“平直线”和“平行性”,其可以通过一系列的原子变换的复合来实现,包括平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)。
此类变换可以用一个3×3的矩阵来表示,其最后一行为(0, 0, 1)。该变换矩阵将原坐标(x, y)变换为新坐标(x', y'),这里原坐标和新坐标皆视为最末一行为(1)的三维列向量,原列向量左乘变换矩阵得到新的列向量:
[x'] [m00 m01 m02] [x] [m00*x+m01*y+m02]
[y'] = [m10 m11 m12] [y] = [m10*x+m11*y+m12]
[1 ] [ 0 0 1 ] [1] [ 1 ]
用代数式表示如下:
x’ = m00*x+m01*y+m02;
y’ = m10*x+m11*y+m12;
如果将它写成按旋转、缩放、平移三个分量的复合形式,则其代数式如下:
其示意图如下:
几种典型的仿射变换:
1.public