繁体   English   中英

SQL Server 2008 GEOGRAPHY STDistance()值

[英]SQL Server 2008 GEOGRAPHY STDistance() value

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

我得到的结果高达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)

我认为返回测量取决于您的地理数据类型的空间参考标识符(SRID) 默认值为4326,单位为米。 数据库中有一个表,您可以Select * from sys.spatial_reference_systems检查Select * from sys.spatial_reference_systems

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

以下SQL应在SQL Server 2008 R2及更高版本上运行。 (爱丁堡Waverley和伦敦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;

使用GEOMETRY类型的前3行的结果是:

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

GEOGRAPHY类型的结果是:

STDistance Geog: 534226.761544321, 转换为英里: 331.953119745885

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

GEOMETRY计算输出的数字有望证明结果非常明显,其值显然是用毕达哥拉斯计算的(如果得到点和多边形之间的距离,基础计算会更复杂)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM