У меня есть таблица с пользователями, и мне нужно найти ближайших пользователей по широте и долготе. Мне также нужно расстояние. Я боролся с формулой haversine и альтернативами в течение двух дней, но я сталкиваюсь с некоторыми ошибками.
Скажем в качестве примера, что я использую lat, long для Куала-Лумпур, Малайзия (примерно 3.2, 102).
Использование Пифагора:
SELECT top 10 *,
SQRT(SQUARE(ABS(latitude - 3.2)) + SQUARE(ABS(longitude - 102))) AS distance
FROM lfuser
ORDER BY distance
Это дает мне "правильные" результаты (пользователи рядом с этим пунктом). Но я не могу получить расстояние (в км) от этого, и я знаю, что это не совсем правильно. Поэтому я попытался использовать haversine:
SELECT TOP 10 *,
ROUND(2 * ASIN(SQRT(POWER(SIN(((3.2 / 180) * PI()
- (latitude / 180) * PI()) / 2) ,2) + COS((3.2 / 180) * PI())
* COS((latitude / 180) * PI()) * POWER(SIN(((102 / 180) * PI()
- (longitude / 180) * PI()) / 2), 2))) * 6367, 4) AS distance
FROM lfuser
ORDER BY distance
Странно то, что это дает мне пользователей в других местах. На самом деле лучшим результатом является пользователь из Ганы с широтой = 5,55 и длинной = -0,20.
Это сводит меня с ума ... Конечно, я могу рассчитать приблизительное расстояние, умножив результат Пифагора на 110 км, но мне бы хотелось получить более правильный результат.
Я надеюсь, что кто-то может указать, что не так.
Пожалуйста, не публикуйте ссылки на различные реализации формулы haversine и т. Д. Я смотрю на них уже два дня.