街道和点之间的距离,如果纬度和经度

时间:2014-09-04 21:08:45

标签: php math geolocation

我有3个纬度和经度:

x: 1.000000000 1.000000000

是的: 2.000000000 2.000000000

z: 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;
}

1 个答案:

答案 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轴到达北方)

  1. 围绕z轴X旋转 - > X1,Y-> Y1,Z-> Z1,因此X1的经度为零。
  2. 围绕y轴X1旋转 - > X2,Y1-> Y2,Z1-> Z2,因此X2的纬度为零。
  3. 围绕z轴旋转X2-> X3,Y2-> Y3,Z2-> Z3,因此Y3的纬度为零
  4. 我们现在赤道上有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