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

问题描述

| 我有一个用户相关的表,我需要根据纬度,经度找到最近的用户。我也需要距离。我一直在努力使用haversine公式和替代方法,但是已经遇到了一些错误。 让我们举个例子,我在马来西亚吉隆坡使用经纬度(大约为3.2、102)。 使用毕达哥拉斯:
SELECT top 10 *,SQRT(SQUARE(ABS(latitude - 3.2)) + SQUARE(ABS(longitude - 102))) AS distance 
FROM lfuser 
ORDER BY distance
它给我“正确”的结果(接近该点的用户)。但是我无法从中得出距离(以KM为单位),我知道这并不完全正确。因此,我尝试使用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
奇怪的是,这给了我其他地方的用户。实际上,排名前1的结果是加纳的lat = 5.55和long = -0.20的用户。 这让我发疯了……我当然可以通过将毕达哥拉斯的结果乘以110 kms来计算一个近似的距离,但是我想要更正确的结果。 我希望有人指出什么地方出了问题。 请不要发布指向hasversine公式等不同实现方式的链接。我已经看了两天了。     

解决方法

        过去我曾用
Haversine in SQL 2005
,所以我尝试转换程序以适应您的情况。让我知道工作是否顺利 我还认为正确的吉隆坡经度和纬度是
3.139003,101.686855
declare @myLatitude decimal(12,6),@myLongitude decimal(12,@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
希望能帮助到你     ,        现在只是一个快速答案。如果您使用的是SQL Server 2008,则应使用地理位置类型(以您的情况为准)来存储位置。有用于处理点之间距离的内置方法。从这里开始 您可能要在以下方面问这个问题:gis.stackexchange.com,专门研究此领域。