使用3个纬度和经度点以及3个距离进行三角测量
存在未知的目标位置(经度和纬度坐标)。 我有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我了解一般原则,即用三个圆圈恰好得到一个重叠点。 我朦胧的是用这个输入来计算这个点所需的数学。
维基百科在这里对代数进行了非常全面的讨论: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位于XY平面中。
对于翻译,只需从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(它在我们的y轴上的“b”坐标系中)。
要做到这一点,我们需要一个p1a方向的单位矢量,它只是p1a *(1 / d)。 把这个单位向量的点积(称为p1a_hat,如果你喜欢的话)和p2a一起,这就是p2b的X坐标。 维基百科文章称这个值为“我”
现在Y坐标很容易。 在坐标变换下,从原点到p2的长度不能改变。 因此,使用毕达哥拉斯定理计算p2a的长度,然后使用毕达哥拉斯定理“向后”得到p2b的Y坐标必须保持长度相同。 这是维基百科称为“J”的变量。 (请注意,我会留给你弄清楚J是正面还是负面)。
现在,您已经获得了维基百科文章用于计算的三个变量d,I和J。 你现在可以将它们转换回公里,乘以地球的半径。 你应该能够从这里做剩下的计算
(顺便说一句,维基百科为坐标变换提供了不同的计算方法,我希望尽可能避免触发)。
我在新成立的GIS Stack Exchange上问了这个问题,并在那里得到了一些很好的答案。
https://gis.stackexchange.com/questions/66/trilateration-using-3-latitude-and-longitude-points-and-3-distances
接受的答案在Python中有一个(可能的)工作解决方案:
https://gis.stackexchange.com/questions/66/trilateration-using-3-latitude-and-longitude-points-and-3-distances/415#415
在Paul Bourke几何页面上
两个圆的交集
链接地址: http://www.djcxy.com/p/14861.html上一篇: Trilateration using 3 latitude and longitude points, and 3 distances
下一篇: Why can't schedule() be called directly from a hardware interrupt?