我使用的是Entity Framework v6.1.3(DbGeography)和14.0.314.76(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。 我还验证了Google地球专业版创建一个字符串
的距离 <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)
使用“熟知文本”表示时,POINT
的参数是x
坐标,后跟y
坐标。将此映射到地理位置时,会打破&#34;预期的&#34;约定,因为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。