Мне нужно реализовать поиск географической близости в моем приложении, но я очень запутался в отношении правильной формулы для использования.После некоторых поисков в Интернете и в StackOverflow я обнаружил, что следующие решения:
- Использование формулы Haversine
- Использование GreatФормула расстояния по кругу
- Использование Пространственная поисковая система в базе данных
Вариант № 3 действительно не подходит для меня ATM,Теперь я немного сбит с толку, поскольку всегда считал, что Формула Великого круга и Формула Хаверсайна были синонимом , но, очевидно, я ошибался?
Приведенный выше снимок экрана был сделан с удивительной Geo (близости) поиска с бумагой MySQL и используетследующие функции:
ASIN, SQRT, POWER, SIN, PI, COS
Я также видел варианты от той же формулы ( Сферический закон косинусов ) , как этоone:
(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 мм) .
Формула Haversine намного быстрее, чем Формула Винсенти, я смог выполнить 1 миллион вычислений за 6 секунд, что вполне приемлемо для моих потребностей.
Сферический закон формулы косинусов показал, что почти в два разастоль же быстрые , как и формула Хаверсайна, и разница в точности равна пренебрежению для большинства случаев использования.
Вот несколько тестовых мест:
- Google HQ (
37.422045
, -122.084347
) - Сан-Франциско, Калифорния (
37.77493
, -122.419416
) - Эйфелева башня, Франция (
48.8582
, 2.294407
) - Оперный театр, Сидней (
-33.856553
, 151.214696
)
Google HQ - Сан-Франциско, Калифорния:
- Формула Винсенти:
49 087.066 meters
- Формула Хаверсин:
49 103.006 meters
- Сферический закон косинусов:
49 103.006 meters
Google HQ - Эйфелева башня, Франция:
- Формула Винсента:
8 989 724.399 meters
- Формула Хаверсайна:
8 967 042.917 meters
- Сферический закон косинусов:
8 967 042.917 meters
Google HQ - Opera House, Сидней:
- Формула Винсенти:
11 939 773.640 meters
- Формула Хаверсин:
11 952 717.240 meters
- Сферический закон косинусов:
11 952 717.240 meters
Как видите, между формулой Хаверсайна и Сферическим законом косинусов нет заметной разницы , однако оба имеют смещение расстояния столь же высокоекак 22 километра по сравнению с формулой Винсенти, поскольку она использует эллипсоидальное приближение Земли вместо сферического.