Поэтому я пытаюсь вычислить расстояние между двумя точками на основе широты и долготы и вывести их на экран, оно «работает», но правильный ответ еще не получен. И, кстати, я имею в виду 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 />";
}
Я знаю вашу боль по этому поводу. Мне пришлось закодировать эту формулу с большим круговым расстоянием в Excel VBA для какой-то геолокации НАСА, для которой я предложил. Существует запутанная информация о правильной формуле для использования в Интернете при поиске в Google. Есть формула Хаверсина и формула Сферического Закона Косинуса. Кроме того, формула 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)));
И источник для этого пришел из переписи населения США (хотя его ссылка больше не действительна), так что вот публикация, которая ссылается на это:
http://www.cs.nyu.edu/visual/home/proj/tiger/gisfaq.html
Кроме того, в разных калькуляторах расстояний вы найдете разные значения радиуса Земли, поскольку Земля на самом деле не круглая; даже термин «уровень моря» не является последовательным и «круглым» по всей Земле. Таким образом, вы все равно можете обнаружить, что ваш расчет расстояния немного отличается от того, что вы используете в качестве ориентира, просто из-за разных значений радиуса Земли.
Согласно документация, чтобы рассчитать расстояние между двумя точками, вы должны использовать computeDistanceBetween(LatLngFrom, LatLngTo)
Google обработал все эти Mercator Projection
вещи для вас, так что я думаю, вместо того, чтобы писать свои собственные, вы должны использовать этот API.