gpt4 book ai didi

c# - 在 ASP.NET Core 2 和 Entity Framework Core 2 中查询表中的附近位置

转载 作者:行者123 更新时间:2023-12-02 17:11:16 26 4
gpt4 key购买 nike

我正在尝试进行查询,以便在我的 SQL 数据库中找到给定经度和纬度点范围内(比如说 50 英里)内的所有位置。

我填充了一些帖子,在帖子表中我有两列用于存储创建帖子时的经度和纬度。表格如下所示:

My SQL Server 2012 Post Table

我浏览了很多关于如何尝试实现这一点的示例,但它们似乎行不通。我通过研究得知 ASP.NET Core 不支持 DbGeography,其他文章只是过时了。

找到这个 article ,但它使用 DbGeography,所以这不起作用。

在 GitHub 上找到:here我只是不知道这是否可行。

仅供引用,这是我的 Post 模型的样子:

public class Post
{
public int Id { get; set; }
public string Title { get; set; }

public double Lat { get; set; }
public double Lng { get; set; }

public DateTime Created { get; set; }
public Category Category { get; set; }
public int CategoryId { get; set; }

// Other navigation properties...
}

这就是我现在进行查询以在前端的 Google map 上显示点的方式:

public class HomeController : Controller
{
private readonly ApplicationDbContext _context;

public HomeController(ApplicationDbContext context)
{
_context = context;
}


[HttpGet]
public JsonResult GetGalleryLocations()
{

var data = _context.Posts
.Include(c => c.Category)
.ToList();

return Json(data);
}
}

有没有人知道如何实现这样的查询?

最佳答案

如果您从数据库中提取适合您所需距离的圆圈周围的正方形的数据,然后在客户端微调到仅圆圈中的帖子,怎么样?

给定你的初始数据

var myLat = 25.05;
var myLon = -80.3;
var radiusInMile = 50;

您可以计算包含该圆的正方形的边界

var minMilePerLat = 68.703;
var milePerLon = Math.Cos(myLat) * 69.172;
var minLat = myLat - radiusInMile / minMilePerLat;
var maxLat = myLat + radiusInMile / minMilePerLat;
var minLon = myLon - radiusInMile / milePerLon;
var maxLon = myLon + radiusInMile / milePerLon;

然后就可以查询数据库,找到正方形内的那些帖子,把它们带到客户端,只保留圆圈内的帖子

var data = _context.Posts
.Where(p => (minLat <= p.Lat && p.Lat <= maxLat) && (minLon <= p.Lng && p.Lng <= maxLon))
.AsEnumerable()
.Select(p => new { p, Dist = distanceInMiles(myLon, myLat, p.Lng, p.Lat) })
.Where(p => p.Dist <= radiusInMile);

distanceInMiles函数定义为

public double ToRadians(double degrees) => degrees * Math.PI / 180.0;
public double distanceInMiles(double lon1d, double lat1d, double lon2d, double lat2d) {
var lon1 = ToRadians(lon1d);
var lat1 = ToRadians(lat1d);
var lon2 = ToRadians(lon2d);
var lat2 = ToRadians(lat2d);

var deltaLon = lon2 - lon1;
var c = Math.Acos(Math.Sin(lat1) * Math.Sin(lat2) + Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(deltaLon));
var earthRadius = 3958.76;
var distInMiles = earthRadius * c;

return distInMiles;
}

我正在使用余弦的球面定律来计算距离,我认为这足以解决这个问题。如果您需要更高的准确性,您可以将公式升级为更复杂的公式,例如 haversine 或 Vincenty。

关于c# - 在 ASP.NET Core 2 和 Entity Framework Core 2 中查询表中的附近位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49138620/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com