SQL 2003 距离 纬度 经度

Posted

技术标签:

【中文标题】SQL 2003 距离 纬度 经度【英文标题】:SQL 2003 Distance Latitude Longitude 【发布时间】:2010-03-22 17:58:01 【问题描述】:

我的桌子上摆满了经销商以及他们的纬度和经度。我正在尝试确定最接近任何给定纬度和经度的前 n 个经销商。我已经有了计算位置之间距离的功能,但我想尽可能少地进行计算(我的表可以包含数千个条目)。目前我必须计算每个条目的距离然后对它们进行排序。有什么方法可以在我进行计算之前进行排序以提高性能?

This 的问题很好,但是我并不总是知道我的范围。我应该选择一个任意高的范围然后改进我的结果吗?我感谢社区可以提供的任何帮助。

declare @Lat real
declare @lon real

Set @lat = 41.05
Set @lon = -73.53 

SELECT top 10
    MemberID,
    Address1,
    City,
    State,
    Zip,
    Phone,
    Lat,
    Lon,
    (SELECT fun_DistanceLatLon] (@Lat,@lon,Lat,Lon)) as mDistance --Calculate distance
FROM
    Dealers
Order by
    (SELECT fun_DistanceLatLon] (@Lat,@lon,Lat,Lon))

【问题讨论】:

【参考方案1】:

您可以对纬度/经度数使用简单的毕达哥拉斯计算并选择前 20 名,而不是对所有记录执行计算。然后您可以使用更准确的函数选择实际的前 10 名。虽然这从一开始就不准确,但它应该足够准确以减少您的数据集。

编辑:像这样的东西

declare @Lat real 
declare @lon real 

Set @lat = 41.05 
Set @lon = -73.53  

SELECT top 10 
    MemberID, 
    Address1, 
    City, 
    State, 
    Zip, 
    Phone, 
    Lat, 
    Lon, 
    (SELECT fun_DistanceLatLon] (@Lat,@lon,Lat,Lon)) as mDistance --Calculate distance 
FROM 
    Dealers 
WHERE
    MemberId IN
(
    SELECT TOP 20
        MemberID
    FROM
        Dealers
    ORDER BY
        SQRT(SQUARE(@Lat - Lat) + SQUARE(@Lon - Lon))
)
Order by 
    (SELECT fun_DistanceLatLon] (@Lat,@lon,Lat,Lon)) 

但是,我建议您同时尝试使用您的数据集并对其进行分析,以查看实际的性能差异可能是什么。

【讨论】:

谢谢。这似乎确实提高了性能(随着记录数量的增加,性能更好)。如果我不需要实际距离,省略内部查询有什么问题,只需使用“按 SQRT(SQUARE(@Lat - Lat) + SQUARE(@Lon - Lon)) 排序” 不,对于短距离,比如 30 英里或更短,毕达哥拉斯精确到几百英尺。要获得更远的距离,请使用 Haversine 函数。【参考方案2】:

我认为您非常喜欢地理空间索引。否则,随着行数变得非常大,您将不得不访问每一行来进行毕达哥拉斯计算。

SQL Server 似乎支持空间数据类型,SQL Server 2008 甚至还拥有“new spatial indexes for high performance queries”。能否使用 SQL Server 空间数据类型,然后对空间索引进行邻近查询?

【讨论】:

以上是关于SQL 2003 距离 纬度 经度的主要内容,如果未能解决你的问题,请参考以下文章

如何计算两对坐标(纬度/经度)之间的距离

SQL Server 计算 2 组纬度/经度列之间的距离

使用纬度和经度返回 SQL Server 2008 中两个位置之间的距离

在 SQL Server 中使用纬度和经度查找两点之间的距离

一个纬度/经度坐标与使用 SQL 的固定坐标之间的近似距离

使用经纬度查找距离的Sql返回错误的距离