维基百科对此进行了相当全面的代数讨论:
http://en.wikipedia.org/wiki/Trilateration
第一步,维基百科没有真正涵盖的是将您的纬度/经度坐标转换为笛卡尔坐标:
x0 = cos( lon0 ) * cos( lat0 ) , y0 = sin( lon0 ) * cos( lat0 ) , z0 = sin( lat0 )
x1 = cos( lon1 ) * cos( lat0 ) , y1 = sin( lon1 ) * cos( lat1 ) , z1 = sin( lat1 )
x2 = cos( lon2 ) * cos( lat0 ) , y2 = sin( lon2 ) * cos( lat2 ) , z2 = sin( lat2 )
为了简化计算,我已经将单位转换为“地球半径”而非千米。
针对您的数据,我得到了以下结果:
p0 p1 p2
X -0.420442596 -0.420430618 -0.42040255
Y -0.67380418 -0.673826567 -0.673825967
Z 0.607631426 0.607614889 0.607634975
下一步是简化坐标,具体细节可以在维基百科文章中了解。首先将点 p0 移动至原点,接着旋转使得点 p1 在 X 轴上,而点 p2 在 X-Y 平面内。
对于移动操作,只要从 p1 和 p2 中减去 p0 即可:
p0a p1a p2a
X 0 1.19779E-05 4.00462E-05
Y 0 -2.23864E-05 -2.17865E-05
Z 0 -1.65372E-05 3.5486E-06
旋转也不难。P1b得到(x,y) = (d,0),其中d就是从原点到P1a的距离(应用勾股定理)。
对于P2b,我们需要将P2a分解成两个分量:一个平行于P1a的分量(即位于我们的x轴上),另一个垂直于P1a的分量(即位于"b"坐标系中的y轴上)。
为此,我们需要一个沿着P1a方向的单位向量,它只是P1a *(1 / d)。将此单位向量(如果您喜欢,请称其为P1a_hat)与P2a进行点积,那么这就是P2b的X坐标。维基百科文章将此值称为“ I”。
现在Y坐标很容易计算。在坐标变换下,从原点到P2的长度不能改变。因此使用勾股定理计算P2a的长度,然后反向使用勾股定理,以获得使长度保持不变的P2b的Y坐标。这就是维基百科所称的“ J”变量。(请注意,有一个模棱两可的问题,关于J是否为正或为负数,我将让您自行解决)。
现在,您已经有了Wikipedia文章用于计算的三个变量d、I和J。通过乘以地球半径,您现在可以将它们转换回公里。从这里开始,你应该能够完成余下的计算。
(顺便说一句,维基百科为坐标变换提供了不同的计算方法。我喜欢在可能的情况下避免三角函数)