SQL-запрос расстояния без тригонометрии - PullRequest
2 голосов
/ 01 июля 2011

У меня есть база данных SQLite, которая не поддерживает триггерные функции.Я хотел бы отсортировать набор пар lat, lng в моей таблице по расстоянию по сравнению со второй парой lat, lng.Я знаком со стандартной формулой расстояния haversine для сортировки пар lat, lng по расстоянию.

В этом случае меня не особо заботит точность, мои точки разделены большими расстояниями, поэтому я не против округлить расстояния, рассматривая кривые как прямые линии.

Мойвопрос, есть ли общепринятая формула для такого рода запросов?Запомните, нет тригонометрических функций!

Ответы [ 4 ]

7 голосов
/ 01 июля 2011

Если вам нужны правильные пространственные данные в вашей модели, используйте SpatiaLite, пространственную версию SQLite:

http://www.gaia -gis.it /atialite /

Это как PostGIS для PostgreSQL.Вся ваша функциональность SQLite будет работать идеально и без изменений, и вы также получите пространственные функции.

7 голосов
/ 01 июля 2011

Если ваши точки находятся на разумном расстоянии друг от друга (то есть не за половиной мира и не за линией даты), вы можете внести поправку в разницу между широтой и долготой (поскольку градус долготы короче, кромена экваторе), а затем просто рассчитайте расстояние, как если бы земля была плоской.

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

Пример, где @lat и @lng - ваша текущая позиция, а 2 - поправка на разницу:

select *
from Points
order by (lat - @lat) * (lat - @lat) + ((lng - @lng) * 2) * ((lng - @lng) * 2)

Вы можете рассчитать поправку на разницудля определенной широты как 1 / cos(lat).


Сис Тиммерман придумала эту формулу, которая также работает через строку даты:

pow(lat-lat2, 2) + pow(2 * min(abs(lon-lon2), 360 - abs(lon-lon2)), 2)
1 голос
/ 01 июля 2011

Вы всегда можете обрезать расширение ряда Тейлора синуса и использовать тот факт, что sin ^ 2 (x) + cos ^ 2 (x) = 1, чтобы получить приближение косинуса. Единственная сложная часть будет с использованием теоремы Тейлора, чтобы оценить количество слагаемых, которые вам понадобятся для данной степени точности .

0 голосов
/ 02 мая 2013

Смена "*" на "/" у меня работает:

выберите * из точек упорядочить по (lat - @lat) * (lat - @lat) + ((lng - @lng) / 2) * ((lng - @lng) / 2)

...