Формулы для расчета географической близости
мне нужно реализовать поиск близости Geo в моем приложении, но я очень смущен относительно правильной формулы для использования. После некоторых поисков в интернете и в StackOverflow я обнаружил, что решения:
- использовать Формула Haversine
использовать Формула Расстояния Большого Круга- использовать Пространственного Поиска в базе
Формула Haversine http://i46.tinypic.com/30shbn6.png
приведенный выше снимок экрана был взят из awesome Geo (близость) поиск с MySQL бумага, и использует следующие функции:
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
я не эксперт по математике, но являются ли эти формулы одинаковыми? Я наткнулся на некоторые больше вариаций и формул (например,косинусов и Vincenty это формулы - что представляется наиболее точным) и это делает меня еще более запутанной...
мне нужно выбрать хорошую формулу общего назначения для реализации в PHP / MySQL. Может ли кто-нибудь объяснить мне различия между формулами, о которых я упоминал выше?
- какой из них самый быстрый для вычисления?
- какой из них обеспечивает наиболее точную результаты?
- какой из них является лучшим с точки зрения скорости / точности результатов?
я ценю ваше понимание этих вопросов.
на основе theonlytheory ответ я проверил следующие формулы расстояния Большого Круга:
- Формула Vincenty
- Haversine Формула
- косинусов
на Vincenty Формула мертвые медленно, однако это довольно точно (до 0,5 мм).
на Формула Haversine намного быстрее, чем Формула Винсенти, я смог выполнить 1 миллион вычислений примерно за 6 секунд, что в значительной степени приемлемо для моих нужд.
на косинусов Формула показала почти в два раза быстрее как Формула Гаверсинуса, и разница в точности neglectfulness для большинства случаев использования.
вот некоторые тестовые места:
-
Google HQ (
37.422045
,-122.084347
) -
Сан-Франциско (
37.77493
,-122.419416
) -
Эйфелева Башня, Франция (
48.8582
,2.294407
) -
Оперный Театр, Сидней (
-33.856553
,151.214696
)
Google HQ-Сан-Франциско, Ка:
- Vincenty Формуле:
49 087.066 meters
- Haversine Формуле:
49 103.006 meters
- косинусов:
49 103.006 meters
штаб-квартира Google-Эйфелева башня, Франция:
- Vincenty Формуле:
8 989 724.399 meters
- Haversine Формуле:
8 967 042.917 meters
- косинусов:
8 967 042.917 meters
Google HQ-Оперный театр, Сидней:
- Vincenty Формуле:
11 939 773.640 meters
- Haversine Формуле:
11 952 717.240 meters
- косинусов:
11 952 717.240 meters
как вы можете видеть есть нет заметной разницы между Формула Гаверсинуса и косинусов, однако оба расстояние смещения до 22 километров по сравнению с Формулой Винсенти, потому что она использует эллипсоидальную приближение земли вместо сферического.
2 ответов
закон косинусов и Формула Гаверсинуса будут давать идентичные результаты при условии машины с бесконечной точностью. Формула Haversine более надежна для ошибок с плавающей запятой. Однако сегодняшние машины имеют двойную точность порядка 15 значимых цифр, и закон косинусов может отлично работать для вас. Обе эти формулы предполагают сферическую землю, тогда как итеративное решение Vicenty (наиболее точное) предполагает эллипсоидальную землю (на самом деле Земля даже не эллипсоид - это геоид). Несколько ссылок: http://www.movable-type.co.uk/scripts/gis-faq-5.1.html
становится лучше: обратите внимание, что широта, которая будет использоваться в законе косинусов, а также Haversine-это геоцентрическая широта, которая отличается от геодезической широты. Для сферы это одно и то же.
который быстро вычислить?
для того, чтобы от самого быстрого до самого медленного: закон косинусов (5 триг. звонки) - > haversine (включает в себя sqrt) - > Vicenty (должны решить это итеративно в цикле for)
какой из них самый точный?
.какой из них лучше всего, когда скорость и точность считаются?
Если ваша проблемная область такова, что для расстояний, которые вы пытаетесь вычислить, Земля может считаться плоской, то вы можете разработать (я не буду приводить подробности) формулу вида x = kx * разница в долготе, y = ky * разница в широте. Затем расстояние = sqrt (dxdx + dydy). Если ваша проблемная область такова, что ее можно решить с квадратом расстояния, вам не придется принимать sqrt, и эта формула будет настолько быстрой, насколько вы сможете получить. Он имеет дополнительное преимущество, что вы можете рассчитать вектор расстояние-x расстояние в восточном направлении, и y расстояние в северном направлении. В противном случае поэкспериментируйте с 3 и выберите то, что лучше всего работает в вашей ситуации.
Итак, вы хотите:
- сортировать записи по расстоянию от p0
- выберите только записи, расстояние от p0 которых меньше r
фокус в том, что вам точно не нужно вычислять большое расстояние круга для этого! Вы можете сделать с любой функция от пары точек до реального значения это строго растет с большим расстоянием круга между точками. Есть много таких функций, и некоторые из них намного быстрее чтобы вычислить, чем различные формулы для точного большого расстояния круга. Одной из таких функций является евклидово расстояние в 3D. Преобразование широты и долготы в 3D-точку на сфере не включает обратные тригонометрические функции.
Как только у вас есть x,Y,Z, вы можете понять, что вам на самом деле не нужно расстояние от p0 до вашей точки, потому что вы также можете использовать расстояние от касательной плоскости в p0. Это расстояние также строго растет с большим расстоянием круга, и вычисляется из X, Y, Z как линейная комбинация - даже квадратный корень не требуется. Вам просто нужно предварительно вычислить коэффициенты и расстояние среза, которое соответствует желаемому большому расстоянию круга.