私は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を理解するのか迷っています今のところは遠いです。 洞察?おかげさまで
このような質問の通常の問題は、緯度が常に第1および第2の値を超えていると仮定している人です。使用している書式のドキュメントを確認してください。 –
「楽しい」例については、[この質問](https://stackoverflow.com/questions/27297113/a-bug-in-sql-geography-point-lat-long)を参照してください。 'POINT'テキスト表現はジオメトリと地理の両方に使われるので、' lat long'ではなく 'long lat'に写像する' xy'座標を使います。私はここで同じ問題があると思います。 –
Visual Studioで[ウォッチ]ウィンドウを使用して、座標が正しい順序であることを確認しました。私はFromTextの代わりにPointFromTextを使用するようにスワップしました。問題は、FromTextが、予想される球形計算の代わりにユークリッド計算を強制したということです。つまり、FromTextはGeometryであり、私はGeographyが必要です。 – AAsk