40

我正在使用 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)
4

2 回答 2

71

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

于 2010-07-26T14:42:36.567 回答
13

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

以下 SQL 应在 SQL Server 2008 R2 及更高版本上运行。(爱丁堡韦弗利和伦敦查令十字车站 bing 地图的位置数据来源):

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 行的结果是:

ST距离几何: 5.39881707506376,与毕达哥拉斯的距离: 5.39881707506376

GEOGRAPHY 类型的结果是:

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

GEOGRAPHY 计算中的“331 英里”左右的转换与 Bing 地图上显示的两点之间的距离非常吻合(显然这不能证明任何事情,但它暗示了类似的基础计算)。

GEOMETRY 计算输出的数字有望证明结果非常清楚地以度为单位,该值显然是使用毕达哥拉斯计算的(如果我们得到点和多边形之间的距离,基础计算会更加复杂)。

于 2014-12-12T10:13:20.073 回答