2010-07-26 136 views
32

我正在使用geography.STDistance()返回两个单点位置之间的距离。我很好奇哪个测量用于返回值?它是在KM的,英里还是其他的?SQL Server 2008 GEOGRAPHY STDistance()值

我得到的结果回到了250k以上,但我不知道如果我的TSQL做错了,因为这些是历史位置(即它们不再存在),所以我不能只做一个快速查找。

declare @p1 geography 

declare @p2 geography 

SELECT @p1 = Location from tblLocations where Id = 1 
SELECT @p2 = Location from tblLocations where Id = 2 

select @p1.STDistance(@p2) 

回答

56

我想返回测量取决于Spatial Reference Identifiers (SRIDs) 您的地理数据类型。默认值是4326,单位为米。在DB中有一张表格,您可以查看Select * from sys.spatial_reference_systems

7

只是为了覆盖到达这里寻找答案的人在使用GEOMETRY类型使用STDistance时,结果“以与坐标值本身相同的度量单位表示”(从'开始Spatial与SQL Server 2008')对于WGS84/SRID 4326数据是以度为单位的。

以下SQL应该在SQL Server 2008 R2及更高版本上运行(爱丁堡Waverley和London Charing Cross的位置数据源站点地图):

DECLARE @edinGeom GEOMETRY = GEOMETRY::STGeomFromText('POINT(-3.1917 55.9517)', 4326) 
DECLARE @cxGeom GEOMETRY = GEOMETRY::STGeomFromText('POINT(-0.1252 51.5083)', 4326) 
SELECT @edinGeom.STDistance(@cxGeom), sqrt(square(3.1917-0.1252) + square(55.9517-51.5083)) AS 'Distance from Pythagoras'; 

DECLARE @MetersPerMile FLOAT = 1609.344; 
DECLARE @edinGeog GEOGRAPHY = GEOGRAPHY::STGeomFromText('POINT(-3.1917 55.9517)', 4326) 
DECLARE @cxGeog GEOGRAPHY = GEOGRAPHY::STGeomFromText('POINT(-0.1252 51.5083)', 4326) 
SELECT @edinGeog.STDistance(@cxGeog), @edinGeog.STDistance(@cxGeog)/@MetersPerMile; 

第一次的结果3行使用几何类型有:

STDistance的Geom: 5.39881707506376,距毕达哥拉斯: 5.39881707506376

为地理类型的结果是:

STDistance的GeOG: 534226.761544321,转换以英里数: 331.953119745885

'331英里'左右从GEOGRAPHY计算器与Bing地图上显示的转换关系很好地匹配为两点之间的距离(显然这不是任何证据,但它表明了类似的基础计算)。

由GEOMETRY计算输出的数字有希望证明结果非常清晰,其值显然是使用毕达哥拉斯计算的(如果我们获得点与多边形之间的距离,则底层计算会更复杂)。