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只支持无参数构造函数和初始化式

实体

我试着谷歌一下,我发现把那个链接分成两个可以帮助我,但我不确定怎么做。谢谢你的帮助。

c# - LINQ -最短距离由GPS纬度和经度

可以使用对象初始化式来代替参数化构造函数:

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实现哈弗斯公式(如在这个答案)。