Поэтому я пытаюсь получить расстояние между двумя точками, основанное на Широта и долготу, вычисленное и напечатанное на экране, оно "работает", но правильный ответ ушел. И в пути я имею в виду 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 для некоторой работы геолокации NASA, на которую я вызвался. Существует некоторая информация о правильной формуле для использования в Интернете при поиске в Google. Существует формула Хаверсина и формула сферического закона Косинеса. Кроме того, формула ATAN2 реализуется несколько по-разному в разы [некоторые библиотеки делают atan2 (dy, dx), а другие библиотеки (например, Excel) делают atan2 (dx, dy]].
Для формулы Хаверсина (см. Https://en.wikipedia.org/wiki/Haversine_formula) попробуйте изменить строку ниже. Формула Хаверсина не должна использовать ATAN2, и, к сожалению, некоторые первые результаты поиска Google содержат неправильную формулу:
$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
Кроме того, различные калькуляторы расстояния, которые вы найдете в Интернете, используют разные значения радиуса Земли, так как земля фактически не круглая; даже термин "уровень моря" не является последовательным и "круглым" по всей Земле. Таким образом, вы все равно можете найти, что ваш расчет расстояний немного отличается от того, что вы используете в качестве ссылки, только из-за разных значений радиуса Земли.
Согласно документации, чтобы рассчитать расстояние между двумя точками, вы должны использовать computeDistanceBetween(LatLngFrom, LatLngTo)
Google обработал все эти вещи Mercator Projection
для вас, поэтому я предполагаю, что вместо того, чтобы писать свои собственные, вы должны использовать этот API.