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