noh*_*hat 24 geocoding latitude-longitude trilateration
存在未知的目标位置(纬度和经度坐标).我有3个纬度和经度坐标对,每对与目标位置的距离以千米为单位.如何计算目标位置的坐标?
例如,假设我有以下数据点
37.418436,-121.963477 0.265710701754km
37.417243,-121.961889 0.234592423446km
37.418692,-121.960194 0.0548954278262km
Run Code Online (Sandbox Code Playgroud)
我想要的是作为输入并37.417959,-121.961954作为输出返回的函数的内容是什么样的?
我理解如何计算两点之间的距离,来自http://www.movable-type.co.uk/scripts/latlong.html我理解一般原则,即三个圆圈恰好得到一个重叠点.我朦胧的是用这个输入计算这一点所需的数学.
Dan*_*nes 41
维基百科在这里对代数进行了非常详尽的讨论: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 )
Run Code Online (Sandbox Code Playgroud)
(为了简化计算,我捏造了一些东西,所以我们以"地球半径"而不是公里为单位工作)
对于你的数据,我明白了
p0 p1 p2
X -0.420442596 -0.420430618 -0.42040255
Y -0.67380418 -0.673826567 -0.673825967
Z 0.607631426 0.607614889 0.607634975
Run Code Online (Sandbox Code Playgroud)
维基百科文章中介绍的下一步是通过平移点来简化坐标,使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
Run Code Online (Sandbox Code Playgroud)
轮换并不困难.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. 你现在可以通过乘以地球的半径将它们转换回公里.您应该可以从这里完成剩余的计算
(顺便提一下,维基百科为坐标转换提供了不同的计算.我希望在可能的情况下避免触发).