2010-07-26 69 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計算輸出的數字有希望證明結果非常清晰,其值顯然是使用畢達哥拉斯計算的(如果我們獲得點與多邊形之間的距離,則底層計算會更復雜)。