SQL Server 2008 R2地理距离?

时间:2011-06-17 13:37:31

标签: .net sql sql-server distance geography

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

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

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

2 个答案:

答案 0 :(得分:4)

尝试这样的结构。

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)

答案 1 :(得分: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示例所示。