Привет, у меня есть необходимость рассчитать расстояние между двумя точками, имеющими широту и длину.
Я хотел бы избежать любого вызова внешнего API.
Я пытался реализовать формулу Haversine в PHP:
Вот код:
class CoordDistance
{
public $lat_a = 0;
public $lon_a = 0;
public $lat_b = 0;
public $lon_b = 0;
public $measure_unit = 'kilometers';
public $measure_state = false;
public $measure = 0;
public $error = '';
public function DistAB()
{
$delta_lat = $this->lat_b - $this->lat_a ;
$delta_lon = $this->lon_b - $this->lon_a ;
$earth_radius = 6372.795477598;
$alpha = $delta_lat/2;
$beta = $delta_lon/2;
$a = sin(deg2rad($alpha)) * sin(deg2rad($alpha)) + cos(deg2rad($this->lat_a)) * cos(deg2rad($this->lat_b)) * sin(deg2rad($beta)) * sin(deg2rad($beta)) ;
$c = asin(min(1, sqrt($a)));
$distance = 2*$earth_radius * $c;
$distance = round($distance, 4);
$this->measure = $distance;
}
}
Тестируя это с некоторыми заданными точками, которые имеют публичные расстояния, я не получаю надежного результата.
Я не понимаю, есть ли ошибка в исходной формуле или в моей реализации
php
coordinates
geocoding
haversine
maxdangelo
источник
источник
Ответы:
Недавно я написал пример формулы haversine и опубликовал ее на своем сайте:
➽ Обратите внимание, что вы получаете расстояние обратно в той же единице, что и при передаче с параметром
$earthRadius
. Значение по умолчанию - 6371000 метров, поэтому результат будет также в [м]. Чтобы получить результат в милях, вы можете, например, пройти 3959 миль,$earthRadius
и результат будет в [ми]. На мой взгляд, это хорошая привычка придерживаться единиц СИ, если нет особой причины поступать иначе.Редактировать:
Как Treya правильно указали, Haversine формула имеет недостатки с диаметрально противоположными точками из - за ошибки округления (хотя это является стабильным для малых расстояний). Чтобы обойти их, вы могли бы вместо этого использовать формулу Винсенти.
источник
Я нашел этот код, который дает мне надежные результаты.
полученные результаты :
источник
Это просто дополнение к @martinstoeckli и @Janith Chinthana . Для тех, кому интересно, какой алгоритм самый быстрый, я написал тест производительности . Лучший результат показывает оптимизированная функция от codexworld.com :
Вот результаты теста:
источник
1.1515 * 1.609344 = 1.853
, Спасибо, исправлено до 1.853.Здесь простой и совершенный код для расчета расстояния между двумя широтой и долготой. Следующий код был найден здесь - http://www.codexworld.com/distance-between-two-addresses-google-maps-api-php/
источник
Для тех, кто любит короче и быстрее (не вызывая deg2rad ()).
источник
Попробуйте это дает потрясающие результаты
источник
Довольно старый вопрос, но для тех, кто интересуется PHP-кодом, который возвращает те же результаты, что и Google Maps, следующее делает работу:
Я проверил с различными координатами, и это работает отлично.
Я думаю, что это должно быть быстрее, чем некоторые альтернативы тоже. Но не проверял это.
Подсказка: Google Maps использует 6378137 в качестве радиуса Земли. Так что использование его с другими алгоритмами также может работать.
источник
Для точных значений сделайте это так:
Хм, я думаю, что должен сделать это ...
Редактировать:
Для формул и, по крайней мере, JS-реализаций попробуйте: http://www.movable-type.co.uk/scripts/latlong.html
Смею меня ... я забыл deg2rad все значения в функции круга ...
источник
Здравствуйте, код для получения расстояния и времени, используя два разных широты и долготы
Вы можете проверить пример ниже ссылки получить время между двумя различными местоположениями, используя широту и долготу в php
источник
Попробуйте эту функцию, чтобы рассчитать расстояние между точками широты и долготы
Тогда используйте функцию как
Надеюсь, поможет
источник
Множитель изменяется в каждой координате из-за теории расстояния большого круга, как здесь написано:
http://en.wikipedia.org/wiki/Great-circle_distance
и вы можете рассчитать ближайшее значение, используя эту формулу, описанную здесь:
http://en.wikipedia.org/wiki/Great-circle_distance#Worked_example
ключ преобразует значение каждого градуса - минуты - секунды во все значения градуса:
источник
Один из самых простых способов:
Он округлит до 2 десятичных знаков.
источник