使用3个纬度和经度点以及3个距离进行三边测量

时间:2010-05-11 18:58:28

标签: geocoding latitude-longitude trilateration

存在未知的目标位置(纬度和经度坐标)。我有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我理解一般原则,即三个圆圈恰好得到一个重叠点。我朦胧的是用这个输入计算这一点所需的数学。

4 个答案:

答案 0 :(得分:40)

维基百科在这里对代数进行了非常详尽的讨论: 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垂直(在“b”坐标系中在y轴上)。

为此,我们需要一个方向为p1a的单位向量,它只是p1a *(1 / d)。用p2a取这个单位向量的点积(如果你愿意,把它称为p1a_hat),那就是p2b的X坐标。维基百科文章称这个值为“我”

现在Y坐标很简单。从原点到p2的长度在坐标变换下不能改变。因此,使用毕达哥拉斯定理计算p2a的长度,然后使用毕达哥拉斯定理“向后”得到p2b的Y坐标必须保持长度相同。这是维基百科称之为“J”的变量。 (注意,我会留下一个含糊不清的地方,让你弄清楚J是正还是负)。

现在你已经得到了维基百科文章用于计算的三个变量d,I和J.你现在可以通过乘以地球的半径将它们转换回公里。你应该可以从这里完成剩下的计算

(顺便提一下,维基百科为坐标转换提供了不同的计算。我希望在可能的情况下避免触发。)

答案 1 :(得分:2)

我在新组建的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

答案 2 :(得分:1)

答案 3 :(得分: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,知道地球的半径,以及从地壳的弯曲距离到直线距离的距离,从那里你可以看到它们在一个共同点相交。请记住,由于浮动不完整,允许误差很小。