гаверсинус / сферический закон косинусов / винсенти в запросе sql

Я тестирую различные формулы для поиска определенных точек на Земле в пределах заданного радиуса от заданной широты / долготы. Я использовал «сферический закон косинусов» и то, что я считаю реализацией Хаверсина.

Для следующих формул это переменные:

[$ lat / $ lon] = пункт отправления

[широта / долгота] = вторая точка

[$ radius] = радиус

Сферический закон косинусов

3959 * acos( cos( radians('.$lat.') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('.$lon.') ) + sin( radians('.$lat.') ) * sin( radians( latitude ) ) ) ) <= '.$radius.';

Гаверсин (по крайней мере, я так думаю!)

3959*3.1415926*sqrt((latitude-'.$lat.')*(latitude-'.$lat.') + cos(latitude/57.29578)*cos('.$lat.'/57.29578)*(longitude-'.$lon.')*(longitude-'.$lon.'))/180) <= '.$radius.';';

Сначала я наткнулся на много информации, в которой говорилось, что Хаверсин был золотым стандартом в отношении точности. Однако существует также мнение, что сферический закон косинусов более точен, чем хаверсинус, если измеряемое расстояние превышает 5 метров или около того. Более того, некоторые говорят, что Винсенти превосходит их по точности.

Три вопроса:

Моя формула Haversine на самом деле Haversine или что-то еще?

Есть мысли о том, какой из них наиболее точный?

Может ли кто-нибудь предоставить мне формулировку Винсенти в соответствии с приведенными выше форумами?

Благодарность!


person zargosh    schedule 13.06.2016    source источник


Ответы (2)


Ваша так называемая формула Хаверсина совершенно неверна.

Во-первых, он содержит 7 левых скобок и 8 правых скобок.

Во-вторых, преобразование из градусов в радианы в некоторых случаях выполняется путем деления на 57,29578, тогда есть постоянное число пи спереди и постоянное 180 сзади.

В-третьих, haversine(x) = sin(x / 2) ** 2, а я нигде не вижу / 2.

В-четвертых, спереди должен быть asin вызов функции.

Правильная формула здесь

person John Machin    schedule 16.03.2017

Мой ответ будет более конкретным для вашего первого и второго ответа

Q1: Моя формула Haversine на самом деле Haversine или что-то еще?

Я не понимаю вашу формулу гаверсинуса, которую вы сделали. Запишите один или точно запрос SQl для формулы гаверсинуса: С сайта разработчика Google Нажмите здесь, чтобы узнать подробности

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;

Этот оператор SQL найдет 20 ближайших местоположений, находящихся в радиусе 25 миль от координаты 37, -122. Он вычисляет расстояние на основе широты / долготы этой строки и целевой широты / долготы, а затем запрашивает только строки, в которых значение расстояния меньше 25, упорядочивает весь запрос по расстоянию и ограничивает его до 20 результатов. Чтобы искать по километрам, а не по милям, замените 3959 на 6371.

Вы можете внести изменения в этот SQL-запрос, чтобы он был именно тем, что вы хотите.

Q2: Какие есть идеи, какие из них наиболее точные?

Нет окончательного ответа, кто может победить?!, Но мы можем с этим справиться:

1. Гаверсин быстрее.

2. Сферический закон косинусов более точен для малых расстояний.

Что касается третьего квартала, я знаю, что Формула Винсенти - самая точная, но самая медленная.

person Ramy hakam    schedule 05.10.2016
comment
Q1: Ваша рекомендуемая формула начинается с SELECT id, ( 3959 * acos( ... acos обозначает ее как формулу сферического закона косинусов, а не формулу гаверсинуса. Q2.1 гаверсин НЕ быстрее. Сферический закон косинусов Q2.2 МЕНЬШЕ точен при малых разностях. - person John Machin; 16.03.2017