Формулы для расчета географической близости

мне нужно реализовать поиск близости Geo в моем приложении, но я очень смущен относительно правильной формулы для использования. После некоторых поисков в интернете и в StackOverflow я обнаружил, что решения:

  1. использовать Формула Haversine
  2. использовать Формула Расстояния Большого Круга
  3. использовать Пространственного Поиска в базе
#3 действительно не вариант для меня ATM. Теперь я немного смущен, так как я всегда думал, что Формула Расстояния Большого Круга и 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 как линейная комбинация - даже квадратный корень не требуется. Вам просто нужно предварительно вычислить коэффициенты и расстояние среза, которое соответствует желаемому большому расстоянию круга.