2017-05-30 62 views
0

我使用的是Entity Framework v6.1.3(DbGeography)和14.0.314.76(SqlGeography)。這兩個都是最新版本。使用DbGeography和SqlGeography獲取不同答案:爲什麼?

DbGeography代碼

 public static double GetDistance(double p1Latitude, double p1Longitude, double p2Latitude, double p2Longitude, int SRID = 4326) 
    { 
     System.Data.Entity.Spatial.DbGeography p1 = System.Data.Entity.Spatial.DbGeography.FromText(String.Format("POINT({0} {1} {2})", p1Latitude, p1Longitude, SRID)); 
     System.Data.Entity.Spatial.DbGeography p2 = System.Data.Entity.Spatial.DbGeography.FromText(String.Format("POINT({0} {1} {2})", p2Latitude, p2Longitude, SRID)); 
     return (double)p1.Distance(p2); 
    } 

SqlGeography代碼

public static double GetDistance(double p1Latitude, double p1Longitude, double p2Latitude, double p2Longitude, int SRID = 4326) 
    { 
     SqlGeography p1 = SqlGeography.Point(p1Latitude, p1Longitude, SRID); 
     SqlGeography p2 = SqlGeography.Point(p2Latitude, p2Longitude, SRID); 
     return (double)p1.STDistance(p2); 
    } 

DbGeography給179403.75129861536和SqlGeography給217842.34845013986。

我已經在SQL Server

declare @p1 geography = geography::Point(-11.98260953020022, 54.51564130011218,4326) 
declare @p2 geography = geography::Point(-10.55307433448692, 53.14334572793153,4326) 
select @p1.STDistance(@p2) 

答案是217842.34845014檢查計算。 我也驗證了谷歌地球的距離Pro創建線串

  <coordinates> 
     54.51564130011218,-11.98260953020022,0 53.14334572793153,-10.55307433448692,0 
     </coordinates> 

長度爲217832.

的Dbgeography電話是:

double x = EF.GetDistance(-11.98260953020022, 54.51564130011218, -10.55307433448692, 53.14334572793153); 

的SqlGeography電話是:

  double y = Geography.SQLServerTypes.GetDistance(-11.98260953020022, 54.51564130011218, -10.55307433448692, 53.14334572793153); 

我不知道爲什麼DbGeography結果我到目前爲止。 任何見解? 謝謝。

+0

像這樣的問題的常見問題是人們假設緯度總是經過第一次和第二次經度。檢查所用表格的文檔。 –

+0

對於一個「有趣」的例子,看看[這個問題](https://stackoverflow.com/questions/27297113/a-bug-in-sql-geography-point-lat-long)。由於'POINT'文本表示法既用於幾何圖形又用於地理,它使用'x y'座標,它映射到'long lat'而不是'lat long'。我認爲你在這裏有同樣的問題。 –

+0

我已經驗證了在Visual Studio中使用觀察窗口的座標是否正確。我交換使用PointFromText而不是FromText&我現在得到相同的答案。我認爲問題在於FromText強制執行歐幾里德計算而不是預期的球面計算。即如你所說,FromText是幾何,我需要地理。 – AAsk

回答

0

使用Well Known Text表示法時,參數POINTx座標,後面跟着y座標。將其映射到地理區域時,由於x對應於經度,因此打破了「預期」慣例,y對應於緯度。

所以你需要扭轉的是你傳遞的參數的順序:

public static double GetDistance(double p1Latitude, double p1Longitude, 
        double p2Latitude, double p2Longitude, int SRID = 4326) 
{ 
    System.Data.Entity.Spatial.DbGeography p1 = 
    System.Data.Entity.Spatial.DbGeography.FromText(String.Format("POINT({0} {1} {2})", 
      p1Longitude, p1Latitude, SRID)); 
    System.Data.Entity.Spatial.DbGeography p2 = 
    System.Data.Entity.Spatial.DbGeography.FromText(String.Format("POINT({0} {1} {2})", 
      p2Longitude, p2Latitude, SRID)); 
    return (double)p1.Distance(p2); 
} 

的217842.34845014423這就產生您預期的結果。

相關問題