我在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公式,结果相似。
答案 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公里。那是对的吗?我担心我从未去过蒙特利尔,奥兰多或其他任何地方......