我有3个纬度和经度:
x: 1.000000000 1.000000000
是的: 2.000000000 2.000000000z: 3.000000000 3.000000000
我需要计算Z与X形成的线之间的最小距离 - > Y,请帮助
直到现在解决我的问题的PHP代码:
function calc ($a, $ay, $b, $by,$c, $cy) {
$a = array($a, $ay, 0);// i use 0 altitude always
$b = array($b, $by, 0);
$c = array($c, $cy, 0);
$ab = array(
(($a[1] * $b[2]) - ($b[1] * $a[2])),
(($a[2] * $b[0]) - ($b[2] * $a[0])),
(($a[0] * $b[1]) - ($b[0] * $a[1]))
);
$normal = pow(pow($ab[0],2)+pow($ab[1],2)+pow($ab[2],2),0.5);
$d = array(
($ab[0]/$normal),
($ab[1]/$normal),
($ab[2]/$normal)
);
$e_ = (($d[0] * $c[0]) + ($d[1] * $c[1]) + ($d[2] * $c[2]));
$e = acos($e_);
$res = pi()/2 - $e;
$res = $res * 6378.1;
return $res;
}
答案 0 :(得分:2)
我们需要在这里做一些球形几何。如果我们只是在飞机上工作那么问题就很容易https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line在球体上的事情变得棘手。
首先,由X形成的线是什么意思 - >是的。我们可能意味着一个很棒的圈子https://en.wikipedia.org/wiki/Great_circle 例如赤道。
假设点X,Y位于赤道上,那么Z与赤道之间的距离将与Z的纬度成正比。
解决问题的一种方法是旋转我们的点,使X和Y位于赤道上,然后找到Z的纬度。执行此操作的过程是(设置轴使x轴通过0 ,0,y轴到达东方,z轴到达北方)
我们现在赤道上有X3和Y3,可以找到Z3的纬度。实际距离为地球半径*纬度-Z3-in-radians
奇怪的是@abiessu评论实际上并不正确,通过1N 1E的大圆圈和2N 2E并不完全贯穿3N 3E。我把距离做了14厘米。
更简单的计算方法是找到X和Y的叉积,W = X ^ Y.此向量是通过X,Y和球体中心的平面的法线。现在找到点积W。 Z这是W-和Z * len(W)* len(Z)之间的角度。因此,将点积除以两个长度,得到a,并找到平面上方Z的倾角θπ/ 2-a。将其乘以半径以获得距离。
以1N 1E的点为例,取单位球上的点
1.0N 1.0E(0.999695,0.017450,0.017452)
b 2.0N 2.0E(0.998782,0.034878,0.034899)
3.0N 3.0E(0.997261,0.052264,0.052336)
a ^ b(0.000000,-0.017458,0.017439)
d =单位(a ^ b)(0.000011,-0.707484,0.706730)
d。 c 0.000022543731833669922
e = acos(d.c)= 1.570773783063061(弧度)
pi / 2 - e = 0.000022543731835522607
0.14378617602014673km距地球距离,半径6378.1km