Мне нужно реализовать поиск близости Geo в моем приложении, но я очень запутался в правильной формуле для использования. После некоторых поисков в Интернете и в StackOverflow я обнаружил, что решения следующие:
- Используйте формулу гаверсина
Используйте Формулу расстояния большого круга- Используйте систему пространственного поиска в базе данных
Вариант №3 действительно не вариант для меня банкомат. Я немного сбит с толку, поскольку всегда думал, что Формула расстояния по Большому кругу и формула Хаверсина были синонимами, но, видимо, я ошибался?
Приведенный выше снимок экрана был взят из великолепного географического (близкого) поиска с помощью MySQL paper и использует следующие функции:
ASIN, SQRT, POWER, SIN, PI, COS
Я также видел варианты от той же формулы (Сферический закон косинусов), например этот:
(3956 * ACOS(COS(RADIANS(o_lat)) * COS(RADIANS(d_lat)) * COS(RADIANS(d_lon) - RADIANS(o_lon)) + SIN(RADIANS(o_lat)) * SIN(RADIANS(d_lat))))
Это использует следующие функции:
ACOS, COS, RADIANS, SIN
Я не математик, но одинаковы ли эти формулы? Я встречал еще несколько вариантов и формул (например, Сферический закон косинусов и формулы Винсенти точнее всего) и это меня еще больше сбивает с толку ...
Мне нужно выбрать хорошую формулу общего назначения для реализации в PHP / MySQL. Может ли кто-нибудь объяснить мне различия между формулами, которые я упомянул выше?
- Какой из них вычисляется быстрее всего?
- Какой из них обеспечивает наиболее точные результаты?
- Какой из них лучший с точки зрения скорости / точности результатов?
Я ценю ваше понимание этих вопросов.
Основываясь на ответе theonlytheory, я протестировал следующие формулы расстояния большого круга:
- Формула Винсенти
- Формула гаверсина
- Сферический закон косинусов
Формула Винсенти очень медленная, но довольно точная (до 0,5 мм).
Формула Хаверсина намного быстрее, чем формула Винсенти, я смог выполнить 1 миллион вычислений примерно за 6 секунд, что вполне приемлемо для моих нужд.
Формула сферического закона косинусов оказалась почти в два раза быстрее, чем формула Хаверсинуса, а разница в точности заключается в пренебрежении для большинства случаев использования.
Вот несколько тестовых мест:
- Штаб-квартира Google (
37.422045,-122.084347) - Сан-Франциско, Калифорния (
37.77493,-122.419416) - Эйфелева башня, Франция (
48.8582,2.294407) - Оперный театр, Сидней (
-33.856553,151.214696)
Штаб-квартира Google - Сан-Франциско, Калифорния:
- Формула Винсенти:
49 087.066 meters - Формула Хаверсина:
49 103.006 meters - Сферический закон косинусов:
49 103.006 meters
Штаб-квартира Google - Эйфелева башня, Франция:
- Формула Винсенти:
8 989 724.399 meters - Формула Хаверсина:
8 967 042.917 meters - Сферический закон косинусов:
8 967 042.917 meters
Штаб-квартира Google - Оперный театр, Сидней:
- Формула Винсенти:
11 939 773.640 meters - Формула Хаверсина:
11 952 717.240 meters - Сферический закон косинусов:
11 952 717.240 meters
Как видите, нет заметной разницы между формулой Хаверсинуса и сферическим законом косинусов, однако оба имеют смещение расстояния до 22 километров по сравнению с формулой Винсенти, потому что он использует эллипсоидальное приближение Земли вместо сферического.

AB=sqrt(pow(($Xb-$Xa),2)+pow(($Yb-$Ya),2)));, я никогда не понимал, что именно он делает ... надеюсь, может вам помочь;) - person Strae   schedule 20.01.2010orig.lat - dest.latне ошибается с координатами[-180, 180]? Что будет, еслиorig.lat = -170иdest.lat = 170? Дистанция 340 град? Нет, на самом деле их всего 20. Как решить эту проблему, если вы работаете с реальными координатами Земли (атласом)? - person Rudie   schedule 16.05.2011pow(lat-lat2, 2) + pow(1/cos(radians(lat)) * min(abs(lon-lon2), 360-abs(lon-lon2)), 2)= ›distance_squared - person Cees Timmerman   schedule 05.04.2012