KMs 结果中的距离不对 - 我做错了什么? PHP
Distance in KMs results are off - what am I doing wrong? PHP
所以我试图根据计算并打印到屏幕上的纬度和经度来计算两点之间的距离,它 'works' 但正确答案还差得远。顺便说一下,在我的特殊情况下,我的意思是 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 />";
}
根据 documentation,要计算两点之间的距离,您应该使用 computeDistanceBetween(LatLngFrom, LatLngTo)
Google 为您处理了所有这些 Mercator Projection
事情,所以我想,与其自己编写,不如使用这个 API.
我知道你对此的痛苦。我不得不将这个大圆距离公式编码为 Excel VBA,以用于我自愿参与的一些 NASA 地理定位工作。当您进行 google 搜索时,网络上关于正确使用公式的信息令人困惑。有 Haversine 公式和 Spherical Law of Cosines 公式。此外,ATAN2 公式的实现有时略有不同 [一些库执行 atan2(dy, dx) 而其他库(如 Excel)执行 atan2(dx, dy]]。
对于 Haversine 公式(参见 https://en.wikipedia.org/wiki/Haversine_formula),请尝试更改下面的行。 Haversine 公式不应该使用 ATAN2,不幸的是 Google 搜索的一些初步结果提供了错误的公式:
$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
和
$c = 2 * asin(sqrt($a));
这就是正确的 Haversine 公式。可能存在需要考虑的边缘情况......我在 Excel 中的公式包括:
$c = 2 * asin(min(1,sqrt($a)));
来源来自 U.S。人口普查(尽管它的 link 不再有效)所以这里有一篇引用它的帖子:
http://www.cs.nyu.edu/visual/home/proj/tiger/gisfaq.html
此外,您会在网上发现不同的距离计算器使用不同的地球半径值,因为地球实际上不是圆的;甚至 "sea level" 一词在整个地球上也不一致 "round"。所以你可能仍然会发现你的距离计算与你用作参考的任何东西略有不同,只是因为地球半径值不同。
所以我试图根据计算并打印到屏幕上的纬度和经度来计算两点之间的距离,它 'works' 但正确答案还差得远。顺便说一下,在我的特殊情况下,我的意思是 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 />";
}
根据 documentation,要计算两点之间的距离,您应该使用 computeDistanceBetween(LatLngFrom, LatLngTo)
Google 为您处理了所有这些 Mercator Projection
事情,所以我想,与其自己编写,不如使用这个 API.
我知道你对此的痛苦。我不得不将这个大圆距离公式编码为 Excel VBA,以用于我自愿参与的一些 NASA 地理定位工作。当您进行 google 搜索时,网络上关于正确使用公式的信息令人困惑。有 Haversine 公式和 Spherical Law of Cosines 公式。此外,ATAN2 公式的实现有时略有不同 [一些库执行 atan2(dy, dx) 而其他库(如 Excel)执行 atan2(dx, dy]]。
对于 Haversine 公式(参见 https://en.wikipedia.org/wiki/Haversine_formula),请尝试更改下面的行。 Haversine 公式不应该使用 ATAN2,不幸的是 Google 搜索的一些初步结果提供了错误的公式:
$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
和
$c = 2 * asin(sqrt($a));
这就是正确的 Haversine 公式。可能存在需要考虑的边缘情况......我在 Excel 中的公式包括:
$c = 2 * asin(min(1,sqrt($a)));
来源来自 U.S。人口普查(尽管它的 link 不再有效)所以这里有一篇引用它的帖子: http://www.cs.nyu.edu/visual/home/proj/tiger/gisfaq.html
此外,您会在网上发现不同的距离计算器使用不同的地球半径值,因为地球实际上不是圆的;甚至 "sea level" 一词在整个地球上也不一致 "round"。所以你可能仍然会发现你的距离计算与你用作参考的任何东西略有不同,只是因为地球半径值不同。