找到与其他用户的距离的问题Sql Server 2005 - Haversine

时间:2011-06-14 06:01:55

标签: sql-server distance haversine

我有一个用户表,我需要根据lat,long找到最近的用户。我也需要距离。两天来,我一直在努力研究半胱氨酸的配方和替代品,但我面临一些错误。

让我们假设我使用lat,长期用于马来西亚吉隆坡(大约3.2,102)。

使用毕达哥拉斯:

SELECT top 10 *, 
    SQRT(SQUARE(ABS(latitude - 3.2)) + SQUARE(ABS(longitude - 102))) AS distance 
FROM lfuser 
ORDER BY distance

它给了我“正确”的结果(靠近那一点的用户)。但我无法获得距离(以KM为单位),我知道这并不完全正确。所以我试图使用hasrsine:

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

奇怪的是,这给了我其他地方的用户。实际上,前1名结果是加纳的用户,lat = 5.55,long = -0.20。

这让我发疯了...我当然可以通过将毕达哥拉斯结果乘以110公里来计算近似距离,但我希望得到更正确的结果。

我希望有人可以指出错误。

请不要发布链接到不同的半正式公式的实现。我已经看了两天了。

2 个答案:

答案 0 :(得分:2)

过去我曾使用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

希望有所帮助

答案 1 :(得分:0)

现在快速回答一下。如果您使用的是SQL Server 2008,则应使用地理类型(在您的情况下指向)来存储位置。有一些处理点之间距离的内置方法。开始herehere

你可能想问这个问题:gis.stackexchange.com专门研究这个领域。