存在未知的目标位置(纬度和经度坐标)。我有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

第一步(未在Wikipedia条目中真正涵盖)是将纬度/经度坐标转换为笛卡尔坐标:

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

Wikipedia文章中介绍的下一步是简化坐标,方法是平移点,使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方向上的单位 vector ,即p1a *(1 / d)。将这个单位 vector 的点积(如果需要,将其称为p1a_hat)与p2a相乘,这就是p2b的X坐标。 Wikipedia文章将此值称为“I”

现在,Y坐标很容易。在坐标变换下,从原点到p2的长度不能改变。因此,使用勾股定理计算p2a的长度,然后使用勾股定理“向后”获得p2b的Y坐标必须保持长度不变。那就是维基百科称为“J”的变量。 (请注意,我将让您弄清楚J是正数还是负数)。

现在,您已经获得了Wikipedia文章用于计算的三个变量d,I和J。您现在可以乘以地球半径,将其转换回公里。您应该可以从这里开始其余的计算

(顺便说一句,维基百科对坐标变换给出了不同的计算。我想尽可能避免触发)。

关于geocoding - 使用3个经纬度点和3个距离进行三边测量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2813615/

10-08 23:31