SQL 2003距离纬度经度

时间:2010-03-22 17:58:02

标签: sql-server tsql geolocation

我有一张满是经销商的桌子以及他们的纬度和经度。我试图确定任何给定的纬度和经度的最近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))

2 个答案:

答案 0 :(得分: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)) 

但是,我建议您尝试使用数据集并对其进行分析,以了解实际的性能差异。

答案 1 :(得分:1)

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

看起来SQL Server支持空间数据类型,而SQL Server 2008甚至拥有“new spatial indexes for high performance queries”。您可以使用SQL Server空间数据类型,然后针对空间索引进行邻近查询吗?