KMs中的距离结果不正确-我做错了什么?PHP


Distance in KMs results are off - what am I doing wrong? PHP

因此,我试图根据纬度和经度计算两点之间的距离,并将其打印到屏幕上,它"有效",但正确的答案还很远。顺便说一句,在我的特定情况下,我的意思是187公里。我不知道为什么,我觉得我在做一些非常愚蠢的事情,但我似乎找不到问题所在。到目前为止,我拥有的是:

/**
 * Calculates Geographical Distance from Latitude and Longitude Pairs
 * 
 * @param array $pair1 Array of first Pair
 * @param array $pair2 Array of second Pair
 * 
 * @return string
 */
private function _calculateGeographicalDistanceFromLatLng($pair1, $pair2)
{
    $pi80  = M_PI / 180;
    $pair1[0] *= $pi80;
    $pair1[1] *= $pi80;
    $pair2[0] *= $pi80;
    $pair2[1] *= $pi80;
    $r = 6372.797; // radius of Earth in km
    $dlat = $pair2[0] - $pair1[0];
    $dlng = $pair2[1] - $pair1[1];
    $a = sin($dlat / 2) * sin($dlat / 2) + cos($pair1[0]) * cos($pair2[0]) * sin($dlng / 2) * sin($dlng / 2);
    $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
    $km = $r * $c / 1000;
    if ($this->_unit == "all") {
        $miles = $km * 0.621371192;
        return array("KM" => round($km, 2), "Mile" => round($miles, 2));
    } elseif ($this->_unit == "mile") {
        $miles = $km * 0.621371192;
        return round($miles, 2);
    } else {
        return round($km, 2);
    }
}

当我尝试让它用不同的选项来回应正确的答案时,答案绝对是错误的

$df = new distanceAdvice("Geographic");
$result = $df->findDistance(array("53.219383", "6.566502"),    array("52.090737", "5.121420"));
if (isset($result['error'])) {
echo $result['error']['msg'];
} else {
echo "The geographical distance between the two points based on Latitude and Longitude is: " . $result . " Kilometer.<br />";
}

根据文档,要计算2个点之间的距离,应使用computeDistanceBetween(LatLngFrom, LatLngTo)

谷歌为你处理了所有Mercator Projection的东西,所以我想,你应该使用这个API,而不是自己写。

我知道你对此的痛苦。我不得不将这个大圆距离公式编码到Excel VBA中,用于我自愿参与的NASA地理定位工作。当你在谷歌上搜索时,网上有关于正确配方的令人困惑的信息。有哈维尔辛公式和余弦球面定律公式。此外,ATAN2公式的实现有时略有不同[一些库执行ATAN2(dy,dx),而其他库(如Excel)执行ATAN2

关于Haversine公式(参见https://en.wikipedia.org/wiki/Haversine_formula),尝试更改下面的行。Haversine公式不应该使用ATAN2,不幸的是,谷歌搜索的一些第一个结果提供了错误的公式:

$c = 2 * atan2(sqrt($a), sqrt(1 - $a));

带有

$c = 2 * asin(sqrt($a));

这就是正确的哈弗辛公式。可能有一个边缘案例需要考虑。。。我在Excel中的公式包括:

 $c = 2 * asin(min(1,sqrt($a)));

这一消息来源于美国人口普查(尽管其链接不再有效),因此这里有一篇引用它的帖子:http://www.cs.nyu.edu/visual/home/proj/tiger/gisfaq.html

此外,你会在网上找到不同的距离计算器,使用不同的地球半径值,因为地球实际上不是圆的;即使是"海平面"这个词在整个地球上也不一致和"圆形"。因此,你可能仍然会发现,仅仅因为地球半径值不同,你的距离计算与你用作参考的距离计算略有不同。