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

Posted

技术标签:

【中文标题】查找与其他用户 Sql Server 2005 的距离的问题 - Haversine【英文标题】:Problems finding distance to other users Sql Server 2005 - Haversine 【发布时间】:2011-06-14 06:01:55 【问题描述】:

我有一张用户表,我需要根据 lat、long 找到最近的用户。我也需要距离。两天来,我一直在努力使用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

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

这快把我逼疯了……我当然可以通过将毕达哥拉斯的结果乘以 110 公里来计算近似距离,但我想要更正确的结果。

希望有人能指出问题所在。

请不要发布指向haversine公式等不同实现的链接。我已经看了两天了。

【问题讨论】:

【参考方案1】:

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

希望对你有帮助

【讨论】:

【参考方案2】:

现在只是一个快速的答案。如果您使用的是 SQL Server 2008,则应使用地理类型(在您的情况下为点)来存储位置。有用于处理点之间距离的内置方法。开始here和here

您可能想在专门研究该领域的 gis.stackexchange.com 上提出这个问题。

【讨论】:

是的,但不幸的是,这是 SqlServer 2005 @Jesper - 可能值得将该版本信息添加到您的问题中 - 它非常相关,您不觉得吗?

以上是关于查找与其他用户 Sql Server 2005 的距离的问题 - Haversine的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中用啥方法向SQL server2005中插入一条数据并返回他的主键值

sql server 2005 中怎么创建组和数据库的映射关系

SQL SERVER–2005–在数据库中查找具有外键约束的表

彻底的卸载SQL Server2005

SQL 查询以查找该月的最后一天

在SQL Server表查询中查找不同的用户