【问题标题】:SQL Server 2008 R2 Geography Distance?SQL Server 2008 R2 地理距离?
【发布时间】:2011-09-17 05:05:51
【问题描述】:

我创建了一个包含以下列的表格:

Text:varchar(255)
Location:geography

它们包含来自荷兰的一些城市作为数据(从谷歌地图获得坐标):

Rotterdam - POINT (51.925637 4.493408 4326)
Utrecht - POINT (52.055868 5.103149 4326)
Nijmegen - POINT (51.801822 5.828247 4326)
Breda - POINT (51.542919 4.77356 4326)

我想知道数据库中所有城市到鹿特丹的距离,所以我执行了这个查询:

Select 
    Text, Location, 
    Location.STDistance(geography::Point(51.925638, 4.493408, 4326)) as Distance 
from Messages

但结果我得到每个城市的距离接近 6800000。

这可能是什么原因造成的?

我能想到的唯一原因是我使用了错误的 SRID,但我不知道应该改用哪个。

谢谢!

编辑:

只是为了它,我去玩数字,我得到了一些奇怪的结果:

Distance from Rotterdam to Rotterdam: 6828459.57 (A) (weird but true)
Distance from Rotterdam to Breda: 6779956.10 (B)
Distance from Rotterdam to Nijmegen: 6695336.38 (C)

这就是有趣的地方:

(A) - (B) = 48504 m = 48 km
(A) - (C) = 133123 m = 133 km

这些值大致是这些城市之间的距离。

【问题讨论】:

    标签: .net sql sql-server distance geography


    【解决方案1】:

    试试这样的结构。

    DECLARE @a geography, @b geography
    SET @a = geography::Point(51.925637, 4.493408,4326)
    SET @b= geography::Point(51.542919, 4.77356,4326)
    SELECT @a.STDistance(@b)
    

    【讨论】:

      【解决方案2】:

      根据这个测试用例,它似乎工作得很好:

      DECLARE @rotterdam geography = geography::Point(51.925637, 4.493408,4326);
      with tmp(txt, geo)
      as
        (
         select 'Rotterdam',geography::Point(51.925637, 4.493408,4326)
         UNION ALL  
         select 'Utrecht',geography::Point(52.055868, 5.103149,4326)
         UNION ALL  
         select 'Nijmegen',geography::Point(51.801822, 5.828247,4326)
         UNION ALL  
        select 'Breda',geography::Point(51.542919, 4.77356,4326)
        )
        SELECT t.txt, t.geo.STDistance(geography::Point(51.925637, 4.493408,4326)) from tmp t 
      

      所以您的实际查询看起来不错,这让我想知道问题是否是由于您的表中的数据不正确。 能否确认数据正确存储在表中?

      我还建议将您比较的地理值存储在单独的值中,如@TrickyNixons 示例中所示。

      【讨论】:

      • 我仍然不确定我做错了什么,但你的代码有效,所以我会从那开始。谢谢=)
      • @SaphuA 不客气。作为旁注,在可为空的 GEOGRAPHY 数据类型列上使用空间索引时要非常小心。存在一些严重的性能问题,因此即使您必须重塑架构,也要使 GEOGRAPHY 列不可为空。
      • Tomas 关于可空地理类型的空间索引性能问题的评论很棒。更多信息在这里:stackoverflow.com/questions/4954875/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 2013-02-07
      • 2011-06-19
      相关资源
      最近更新 更多