c# - LINQ -最短距离由GPS纬度和经度
本文关键字:纬度 经度 GPS 短距离 LINQ | 更新日期: 2023-09-27 17:54:28
我有数据库,在它我有类酒店与gps坐标。我想要得到离我选择的坐标最近的地方
我认为它应该是这样的(我在这里找到了许多示例代码,就像这个):
var coord = new GeoCoordinate(latitude, longitude);
var nearest = (from h in db.hotels
let geo = new GeoCoordinate(h.gps.lat, h.gps.lng)
orderby geo.GetDistanceTo(coord)
select h).Take(10);
问题是,当我试图搜索一些东西时,我有这个错误:
LINQ只支持无参数构造函数和初始化式
实体
我试着谷歌一下,我发现把那个链接分成两个可以帮助我,但我不确定怎么做。谢谢你的帮助。
可以使用对象初始化式来代替参数化构造函数:
var nearest = (from h in db.hotels
let geo = new GeoCoordinate{ Latitude = h.gps.lat, Longitude = h.gps.lng}
orderby geo.GetDistanceTo(coord)
select h).Take(10);
但是你可能会有由GetDistanceTo方法引起的问题,你能提供该方法的实现吗?
我有一个合理的关于成功使用这个哈弗辛距离公式的实现
var startPoint = new { Latitude = 1.123, Longitude = 12.3 };
var closest = entities.Something.OrderBy(x => 12742 * SqlFunctions.Asin(SqlFunctions.SquareRoot(SqlFunctions.Sin(((SqlFunctions.Pi() / 180) * (x.Latitude - startPoint.Latitude)) / 2) * SqlFunctions.Sin(((SqlFunctions.Pi() / 180) * (x.Latitude - startPoint.Latitude)) / 2) +
SqlFunctions.Cos((SqlFunctions.Pi() / 180) * startPoint.Latitude) * SqlFunctions.Cos((SqlFunctions.Pi() / 180) * (x.Latitude)) *
SqlFunctions.Sin(((SqlFunctions.Pi() / 180) * (x.Longitude - startPoint.Longitude)) / 2) * SqlFunctions.Sin(((SqlFunctions.Pi() / 180) * (x.Longitude - startPoint.Longitude)) / 2)))).Take(5);
我在这里张贴我的解决方案,我现在正在使用。但我选择GwynnBliedd的答案,因为他解决了我的问题。
我添加了DbGeography类型到我的类,我使用它而不是在数据库中保存纬度和经度。
locationField = DbGeography.FromText(String.Format("POINT({0} {1})", orig.gps.lat.ToString().Replace(",", "."), orig.gps.lng.ToString().Replace(",", ".")));
那么使用linq:
就很容易了var coord = DbGeography.FromText(String.Format("POINT({0} {1})", latitude.ToString().Replace(",", "."), longitude.ToString().Replace(",", ".")));
var nearest = (from h in db.hotels
where h.location != null
orderby h.location.Distance(coord)
select h).Take(limit);
return nearest;
目前这是有效的解决方案,它很好。有时我会使用这个,但很少有用户在这里说,我可能会尝试UDF实现哈弗斯公式(如在这个答案)。