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

存在未知的目标位置(经度和纬度坐标)。 我有3个经纬度坐标对,每对距离目标位置公里。 我如何计算目标位置的坐标?

例如,说我有以下数据点

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

我想要的是作为input并返回37.417959,-121.961954作为输出的函数的胆量是什么样的?

我明白如何计算两点之间的距离,从http://www.movable-type.co.uk/scripts/latlong.html我明白了一般原则,三个圆圈,你正好有一个重叠点。 我朦胧的是用这个input来计算这个点所需要的math。

维基百科对这里的代数进行了非常深入的讨论: 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)。 把这个单位向量的点积(称为p1a_hat,如果你喜欢的话)和p2a,这就是p2b的X坐标。 维基百科文章称这个值为“我”

现在Y坐标很容易。 在坐标变换下,原点到p2的长度不能改变。 所以使用毕达哥拉斯定理计算p2a的长度,然后使用毕达哥拉斯定理“向后”得到p2b的Y坐标必须保持长度相同。 这是维基百科称为“J”的variables。 (请注意,我会留给你弄清楚J是正面的还是负面的)。

现在,您已经获得了维基百科文章用于计算的三个variablesd,I和J。 您现在可以将它们转换回公里,乘以地球的半径。 你应该可以从这里做剩下的计算

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

我在新成立的GIS Stack Exchange上问了这个问题,并在那里得到了一些很好的答案。

https://gis.stackexchange.com/questions/66/trilateration-using-3-latitude-and-longitude-points-and-3-distances

在Python中接受的答案有(可能)工作解决scheme:

https://gis.stackexchange.com/questions/66/trilateration-using-3-latitude-and-longitude-points-and-3-distances/415#415

在Paul Bourke几何页面上

两个圆的交集

考虑以下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上使用。

这使得您可以input,其中A1表示以中心A和半径D1为圆心:

  • {A1,B2,C3}
  • {A1,B3,C2}
  • {A2,B1,C3}
  • {A2,B3,C1}
  • {A3,B1,C2}
  • {A3,B2,C1}

你应该能够把纬度/长度转换成知道地球半径的X,Y,Z以及沿着地壳的弯曲距离到直线距离的距离,从那里你可以看到它们中的哪一个相交于一个共同点。 请记住,由于浮动不完整而导致的误差很小。

Interesting Posts