我正试图从结果中扣除2D变换参数。
给定的是未知X-Y坐标系中的大量样本以及WGS84(经度,纬度)中各自的对应样本。由于面积很小,我们可以假设目标系统也是平坦的。
可悲的是,我不知道使用了哪种缩放,旋转,翻译,我甚至不确定是否有1或2个翻译。
我试图创建一个冗长的方程式系统,但这对我来说太复杂了。基本几何也失败了,因为转换的顺序是未知的,我将不得不检查每个可能的组合顺序。
这个问题有系统的方法吗?
答案 0 :(得分:2)
确定缩放系数很简单,只需选择任意两个点并找到它们在X-Y空间和WGS84空间之间的距离,它们的比例就是缩放系数。
旋转和平移有点棘手,但当您了解到应用任意数量的旋转或平移(仅在2维中!)的结果可以减少到一个未知点的单个旋转时,并不是那么困难。一些未知的角度。
突然你有N个点来确定3个未知数,旋转轴(x和y坐标)和旋转角度。
计算旋转如下:
Pr = R*(Pxy - Paxis_xy) + Paxis_xy
Pr
是X-Y空间中的旋转点,然后需要转换为WGS84空间(如果坐标系的轴不同)。
R
是您熟悉的rotation matrix,具体取决于您的旋转角度
Pxy
是X-Y空间中未旋转的点
Paxis_xy
是X-Y空间中的旋转轴。
要实际找到3个未知数,您需要通过找到的比例因子取消比例缩放WGS84点(或等效地缩放XY点)并移动点以使两个坐标系具有相同的原点。
首先,找到旋转角度:取两对相应的点P1, P1'
和P2, P2'
并写出
P1' = R(P1-A) + A
P2' = R(P2-A) + A
为了简洁,我换了A = Paxis_xy
。减去这两个方程得出:
P2'-P1' = R(P2-P1)
B = R * C
Bx = cos(a) * Cx - sin(a) * Cy
By = cos(a) * Cx + sin(a) * Cy
By + Bx = 2 * cos(a) * Cx
(By + Bx) / (2 * Cx) = cos(a)
...
(By - Bx) / (2 * Cy) = sin(a)
a = atan2(sin(a), cos(a)) <-- to get the right quadrant
你有自己的角度,你也可以快速检查cos(a) * cos(a) + sin(a) * sin(a) == 1
以确保你所有的计算都正确或你的系统确实是一个保持方向的等距(仅由翻译和旋转组成) )。
既然我们知道a
我们知道R
,那么我们就会找到A
:
P1` = R(P1-A) + A
P1' - R*P1 = (I-R)A
A = (inverse(I-R)) * (P1' - R*P1)
inversion of a 2x2 matrix is easy。
编辑:上述内容有误,或者更具体地说是一个需要单独处理的案例。
翻译和旋转的一种组合不会减少到单个旋转,而是单个翻译。您可以根据固定点来考虑它(操作后有多少点不变)
平移没有固定点(所有点都已更改),旋转有1个固定点(轴不会更改)。事实证明,两个旋转留下1个固定点并且平移和旋转留下1个固定点,其中(有一点证明固定点的数量告诉您执行的操作)是这些的任意组合导致的原因一次轮换。
这对您来说意味着如果您的角度为0
,那么使用上述方法也会给您A = 0
,这可能不正确。在这种情况下,您必须执行A = P1' - P1
。
答案 1 :(得分:1)
如果我正确理解了这个问题,你有 n 点(X 1 ,Y 1 ),......,(X < sub> n ,Y n ),相应的点,比方说,(x 1 ,y 1 ),... ,(x n ,y n )在另一个坐标系中,前者应该通过旋转,缩放和平移从后者获得。
请注意,此数据不会确定固定的旋转/缩放点,也不会确定应“应”应用的顺序。另一方面,如果您事先知道这些或任意选择它们,您将找到一个旋转,平移和缩放因子,将数据转换为应该。
例如,您可以选择任意一点,例如,p 0 = [X 1 ,Y 1 ] T (列向量)作为旋转的固定点&amp;缩放并从其他两个点中减去其坐标,得到p 2 = [X 2 -X 1 ,Y 2 < / sub> -Y 1 ] T ,p 3 = [X 3 -X 1 ,Y 3 -Y 1 ] T 。同样取列向量q 2 = [x 2 -x 1 ,y 2 -y 1 ] T ,q 3 = [x 3 -x 1 ,y 3 子> -y <子> 1 子>] Ť。现在[p 2 p 3 ] = A * [q 2 q 3 ],其中A是unknwon表示旋转缩放的2x2矩阵。你可以解决它(除非你不幸并选择退化点)为A = [p 2 p 3 ] * [q 2 q < sub> 3 ] -1 其中 -1 表示矩阵逆(2x2矩阵[q 2 q 3] 子>])。现在,如果坐标系之间的变换确实是旋转 - 缩放 - 平移,则所有点都应满足P k = A *(Q k -q 0 )+ p 0 ,其中P k = [X k ,Y k ] < sup> T ,Q k = [x k ,y k ] T ,q < sub> 0 = [x 1 ,y 1 ] T ,k = 1,..,n。
如果需要,您可以很容易地从A的组件中确定缩放和旋转参数,或者组合b = -A * q 0 + p 0 以获得P k = A * Q k + b。
上述方法对噪声或选择退化点的反应不好。如有必要,可以通过应用例如主成分分析来解决这个问题,如果MATLAB或其他一些线性代数工具可用,它也只是几行代码。