Дистанция в KMs не работает - что я делаю не так? PHP

0

Поэтому я пытаюсь получить расстояние между двумя точками, основанное на Широта и долготу, вычисленное и напечатанное на экране, оно "работает", но правильный ответ ушел. И в пути я имею в виду 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 />";
}
  • 0
    Какой ответ вы получаете, что "далеко"? Как вы думаете, правильный ответ? Как вы проверяете его «правильность»?
Теги:
google-maps-api-3
latitude-longitude
geocode

2 ответа

0
Лучший ответ

Я знаю вашу боль по этому поводу. Мне нужно было закодировать эту формулу большого круга в 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

Кроме того, различные калькуляторы расстояния, которые вы найдете в Интернете, используют разные значения радиуса Земли, так как земля фактически не круглая; даже термин "уровень моря" не является последовательным и "круглым" по всей Земле. Таким образом, вы все равно можете найти, что ваш расчет расстояний немного отличается от того, что вы используете в качестве ссылки, только из-за разных значений радиуса Земли.

  • 0
    Боже мой, это полностью сделало работу отлично :-) Большое спасибо .. сэкономил мне так много времени. Я уже задавался вопросом, сошел ли я с ума
1

Согласно документации, чтобы рассчитать расстояние между двумя точками, вы должны использовать computeDistanceBetween(LatLngFrom, LatLngTo)

Google обработал все эти вещи Mercator Projection для вас, поэтому я предполагаю, что вместо того, чтобы писать свои собственные, вы должны использовать этот API.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню