Проблемы с поиском расстояния до других пользователей Sql Server 2005 - Haversine - PullRequest
0 голосов
/ 14 июня 2011

У меня есть таблица с пользователями, и мне нужно найти ближайших пользователей по широте и долготе. Мне также нужно расстояние. Я боролся с формулой 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 и т. Д. Я смотрю на них уже два дня.

Ответы [ 2 ]

2 голосов
/ 14 июня 2011

В прошлом я использовал Haversine in SQL 2005, поэтому я пытался преобразовать свою процедуру, чтобы адаптировать ее к вашему случаю.Дайте мне знать, если все в порядке

Я также предположил, что правильные значения долготы и широты Куала-Лумпур: 3.139003, 101.686855

declare @myLatitude decimal(12,6), @myLongitude decimal(12,6), @EarthRadius decimal(12,6)
select @myLatitude = 3.139003, @myLongitude = 101.686855, @EarthRadius = 6378.137

SELECT top 10 *, 
    (@EarthRadius * ACOS((SIN(PI() *  @myLatitude /180) 
     * SIN(PI() * Latitude/180))
     + (COS(PI() *  @myLatitude /180) 
     * COS(PI() * Latitude/180) 
     * COS(PI() * Longitude/180 - PI() * @myLongitude /180))))
    as distance
FROM lfuser 
ORDER BY distance

Надеюсь, это поможет

0 голосов
/ 14 июня 2011

Просто быстрый ответ на данный момент.Если вы используете SQL Server 2008, вы должны использовать гео-типы (укажите в вашем случае), чтобы сохранить местоположение.Есть встроенные методы для обработки расстояния между точками.Начните с здесь и здесь

Вы можете задать этот вопрос по адресу: gis.stackexchange.com, который специализируется в этой области.

...