三点经纬度和三个距离的三边定位

24

我有一个未知的目标位置(纬度和经度坐标)。我有3个纬度和经度坐标对,每个对应着到目标位置的距离(单位为千米)。如何计算目标位置的坐标?

例如,假设我有以下数据点:

37.418436,-121.963477   0.265710701754km
37.417243,-121.961889   0.234592423446km
37.418692,-121.960194   0.0548954278262km

我想知道以这个输入作为参数的函数内部是什么样子,以便返回37.417959,-121.961954

我了解如何计算两点之间的距离,从http://www.movable-type.co.uk/scripts/latlong.html中可以理解使用三个圆确定一个重叠点的一般原则。但我还不清楚用这个输入来计算该点所需的数学方法。


13
似乎实际上是“三边测量法”,而非“三角测量法”,因为“三角测量法”涉及角度。 - nohat
解决方案:http://gis.stackexchange.com/questions/66/trilateration-using-3-latitude-and-longitude-points-and-3-distances - zengr
4个回答

44

维基百科对此进行了相当全面的代数讨论: 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。通过乘以地球半径,您现在可以将它们转换回公里。从这里开始,你应该能够完成余下的计算。
(顺便说一句,维基百科为坐标变换提供了不同的计算方法。我喜欢在可能的情况下避免三角函数)

今天早上我再仔细研究时,发现将经纬度转换为笛卡尔坐标系(称为ECEF)的传统方法是将X作为cos(lon)的函数,将Y作为sin(lon)的函数。我之前颠倒了这些。这对最终计算结果没有影响,只是意味着我在中间步骤中使用了一个非传统的坐标系统。但我已经将方程式更正为更传统的形式。 - Dan Menes
1
顺便提一下,为了达到最高的精度,您需要考虑海拔高度以及纬度/经度坐标是基于椭球面而不是球面参考面。请参见此处:http://en.wikipedia.org/wiki/ECEF和此处:http://www.satsleuth.com/GPS_ECEF_Datum_transformation.htm。 - Dan Menes
看起来我反转了cos(lat)和sin(lat)。当时时间有点晚了。抱歉。现在已经修复。(实际上我计算做对了,但是将方程式抄写错了) - Dan Menes
1
谢谢,这就是我想要的90%,非常有帮助,你值得获得奖金。基于这个答案,我应该能够得到我需要的东西。 - nohat
这篇文章对我帮助很大,非常感谢。只有一个小问题,我收到的点是笛卡尔坐标系。我想知道如何将它们转换为本地坐标系以便在地图上放置?是否有任何公式或方法? - Pow
你能提供一本书给我们吗,我可以找到你所做的事情吗?谢谢。 - Suisse

3

1

这是一个损坏的链接。 - zengr

0
考虑以下9个圆:
点A、B、C和距离d1、d2、d3
- A的中心,半径为d1 - A的中心,半径为d2 - A的中心,半径为d3 - B的中心,半径为d1 - B的中心,半径为d2 - B的中心,半径为d3 - C的中心,半径为d1 - C的中心,半径为d2 - C的中心,半径为d3
这些是可能的圆。现在我们可以剔除其中一些,因为我们知道如果在A上使用了d1,则不会在B上使用。
这使得您的可能输入,其中A1表示以A为中心,半径为D1的圆:
- {A1,B2,C3} - {A1,B3,C2} - {A2,B1,C3} - {A2,B3,C1} - {A3,B1,C2} - {A3,B2,C1}
你应该能够通过知道地球半径、沿着地球外壳的曲线距离和直线距离之间的距离,将经纬度转换为X、Y、Z,并从那里看出哪些相交于一个公共点。记得要考虑由于浮点数不完美而产生的小误差。

我已经知道哪个半径与哪个中心相对应了;我需要的是根据输入的纬度/经度数据计算交点的公式。 - nohat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接