伴随球面定律的不准确...特别是沿纬度?

时间:2012-03-08 23:14:51

标签: php latitude-longitude cosine

我在PHP应用程序中使用余弦公式有一个奇怪的问题..

function CalculateDistanceCosine($decA, $decB)
{
    $lon1 = $decA[0]; //This would be equal to point A's longitude, and so on..
    $lat1 = $decA[1]; 
    $lon2 = $decB[0];   
    $lat2 = $decB[1];

    //echo $lon1." ".$lat1."<br/>";
    //echo $lon2." ".$lat2."<br/>";

    $distance  = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon2-$lon1));
    $distance  = acos($distance);
    $distance  = rad2deg($distance);
    $distance  = $distance * 60 * 1.1515;
    $distance  = round($distance, 4);

    return $distance;   
}

我对此的输入将是这样的:

45.468055555556 -73.741388888889 //- The coordinates for Montreal International Airport
28.428888888889 -81.315833333333 //- Orlando International Airport

然而,在使用它时,我犯了一些错误......,“从蒙特利尔到奥兰多的距离是576公里 - 非常错误。”

有趣的是它沿经度轴非常准确。例如,如果我输入了:

50 -73.741388888889 
50 -81.315833333333 

错误现在只有大约50KM,非常可以接受。

换句话说,为什么忽视纬度差异?

不幸的是,我尝试过Harvesine公式,结果相似。

2 个答案:

答案 0 :(得分:0)

你看过这里了吗:Using the Cosine law to calculate distance between 2 points in Objective C??在使用余弦定律进行距离计算之后,距离不会转换回度,而是与地球半径相乘。 IMO你忘记了地球半径。

答案 1 :(得分:0)

我相信你的主要问题是你的经度与经度相混淆。您没有向我们展示错误的代码,但请记住,在您的数组中,您需要先经度,然后是纬度,才能使您的功能正常工作。在您给出的示例中,您首先列出了纬度,然后是经度。

你的代码肯定会计算出这两点之间的距离,如576所示(我将在一分钟内提到单位),但这些点实际上并不是你认为的那样:)尝试将你的功能改为如下:

$lat1 = $decA[0]; //This would be equal to point A's *latitude*, and so on..
$lon1 = $decA[1]; 
$lat2 = $decB[0];   
$lon2 = $decB[1];

...或者只是传递预期顺序的值。

另外,我无法识别您的距离乘数,但看起来您可能会以英里计算结果,而不是公里。几公里,试试:

$distance  = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon2-$lon1));
$distance  = acos($distance);
$distance  = $distance * 6372.8;
$distance  = round($distance, 4);

(它只是跳过转换回度和更改的乘数,基本公式保持不变。)

鉴于上述变化,您的距离约为2,008公里。那是对的吗?我担心我从未去过蒙特利尔,奥兰多或其他任何地方......