2017-05-30 14 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を与えます。

私は答えは217842.34845014ある

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

SQL Serverでの計算をチェックしています。 私はまた、Google Earthでライン文字列を作成するプロの距離を確認しました

  <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の結果iを理解するのか迷っています今のところは遠いです。 洞察?おかげさまで

+0

このような質問の通常の問題は、緯度が常に第1および第2の値を超えていると仮定している人です。使用している書式のドキュメントを確認してください。 –

+0

「楽しい」例については、[この質問](https://stackoverflow.com/questions/27297113/a-bug-in-sql-geography-point-lat-long)を参照してください。 'POINT'テキスト表現はジオメトリと地理の両方に使われるので、' lat long'ではなく 'long lat'に写像する' xy'座標を使います。私はここで同じ問題があると思います。 –

+0

Visual Studioで[ウォッチ]ウィンドウを使用して、座標が正しい順序であることを確認しました。私はFromTextの代わりにPointFromTextを使用するようにスワップしました。問題は、FromTextが、予想される球形計算の代わりにユークリッド計算を強制したということです。つまり、FromTextはGeometryであり、私はGeographyが必要です。 – AAsk

答えて

0

よく知られているテキスト表現を使用する場合、POINTへのパラメータはx座標に続いて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この後、生成し、あなたの期待される結果:

だから、あなたはパラメータを渡しているという順序を逆にする必要があります。