2015-11-01 66 views
1

我想要找到地球上兩點之間的距離(使用WGS84)和System.Data.Entity.Spatial.DbGeography看起來像一個很好的呼喊,但我沒有收到來自距離函數預期的結果時,點有一個海拔:System.Data.Entity.Spatial.DbGeography與高程距離

var geogA = DbGeography.PointFromText("POINT(179.04 89.77 100)", 4326); 
var geogB = DbGeography.PointFromText("POINT(179.04 89.77 200)", 4326); 
var distance = geogA.Distance(geogB); //distance is 0, not 100 

我期待的距離能夠採取高度考慮,以及 - 我在這裏缺少一些東西明顯?我相信這一定是相當微不足道的,但我對它背後的數學知之甚少,所以我可能沒有資格發表這樣的聲明。

我的直覺告訴我,只是在這裏使用畢達哥拉斯,但我不是100%肯定這是正確的。

+0

我不知道你的代碼是否會直接在SQL中工作,即STGeomFromText,但它在.NET代碼中不起作用。 –

+0

是的,我會看看我是否可以找到包含這個dll的副本,看看我是否得到不同的結果。看起來,至少DbGeography的文檔是直接從SQLGeography類複製的:https://msdn.microsoft.com/en-gb/library/microsoft.sqlserver.types.sqlgeography(v = sql.105) .aspx –

回答

1

在SQL Server庫Z(Elevation)更像是一個標籤或一個純粹的用戶定義的屬性。

所以它不用於任何計算。這使得它類似於M,它也只對我的特定數據集有意義。

如果從數學的角度來看,海拔實際上對您來說很重要,那麼在您獲得地理距離結果後,您必須執行此加/減操作。注意從較高的高程減去。

您正在添加兩個數字(表面上的距離)+(海拔增量)。如果你使用畢達哥拉斯定理,你必須考慮地理圖書館爲你做的許多微妙的邏輯。

+0

將Z的差異添加到距離中並不會實際得到2個點之間的最短距離,而是測量,向下和跨越(a和b),我想從畢達哥拉斯的角度來理解c。但我不相信這實際上是正確的方法。有用的是知道Z只是屬性的「標籤」,並不用於任何計算。 –

+0

我會在24-48小時內將其打開,然後將其標記爲「我是否在這裏丟失了明顯的東西?」的答案。 –

+0

也許你的場景並不是建立在地理空間例程中的內置「地球表面」概念的最佳服務。在你的場景中需要一個真正的3點幾何系統。幾何和地理類型很有用,但你只需要做一些額外的工作。我預計在15到30英里外,地球曲率會影響「海拔高度」超過實際海拔高度,這樣畢達哥拉斯數學會誤導實際距離。 –