c# - 如何计算给定纬度/经度位置的边界框并在 C# 中查询数据库

标签 c# asp.net-mvc geocoding

我已经给出了一个由纬度和经度定义的位置。现在我想计算一个边界框,例如那个点的 500 米。

边界框应定义为latminlngminlatmaxlngmax

我的数据库有将近 152.000 条记录(对象的位置由经纬度定义),如果用户在搜索栏中输入特定对象(按名称搜索),我应该找到特定半径的对象,例如500米以内。

例如这是一条记录:Latitude = 41.72213058512578,Longitude = 44.77684020996094,Name = company1

如果我找到latmin, lngminlatmax, lngmax 如何查询数据库?我想在 C# 中实现这一点。

最佳答案

研究 Haversine 公式。

在您的应用程序或数据库中的存储过程中创建此查询。它将返回给定半径内给定 latpoint 和 longpoint 的 15 个最近位置。半径现在设置为 50,您可以随意更改。

 SELECT z.zip,
        z.primary_city,
        z.latitude, z.longitude,
        p.distance_unit
                 * DEGREES(ACOS(COS(RADIANS(p.latpoint))
                 * COS(RADIANS(z.latitude))
                 * COS(RADIANS(p.longpoint) - RADIANS(z.longitude))
                 + SIN(RADIANS(p.latpoint))
                 * SIN(RADIANS(z.latitude)))) AS distance_in_meters
  FROM zip AS z
  JOIN (   /* these are the query parameters */
        SELECT  42.81  AS latpoint,  -70.81 AS longpoint,
                50.0 AS radius,      111054.0 AS distance_unit
    ) AS p ON 1=1
  WHERE z.latitude
     BETWEEN p.latpoint  - (p.radius / p.distance_unit)
         AND p.latpoint  + (p.radius / p.distance_unit)
    AND z.longitude
     BETWEEN p.longpoint - (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
         AND p.longpoint + (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
  ORDER BY distance_in_meters
  LIMIT 15

将 distance_in_miles 的 111054.0 更改为 69.0

在您的 C# 应用程序中调用存储过程并从列表中的查询中获取数据。

private List<DataModel> getData(double latitude, double longitude, int radius)
{ 
    SqlParameter[] param = 
                     {
                        new SqlParameter("@lat", latitude),
                        new SqlParameter("@lon", longitude),
                        new SqlParameter("@rad", radius)
                     };          
  //Call stored procedure
  var data db.Database.SqlQuery<DataModel("Haversine",param)
  return data.ToList();
} 

关于c# - 如何计算给定纬度/经度位置的边界框并在 C# 中查询数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38863884/

相关文章:

jquery - 使用T4MVC,如何在HTML表单上设置action属性

google-maps - Google Maps V3 API - 超过查询限制,但只有 1 个请求

c# - 将数据网格值绑定(bind)到另一个数据网格

javascript - 将值从 View 传递到动态填充表单的 Controller

c# - 搜索代码库的所有执行路径以查看调用 "Int.TryParse"的位置

c# - 使用 Dependency Resolver 是一种不好的做法吗?

android - 计算我的位置与多个位置之间的距离

javascript - 循环中的 Google Maps V3 地理编码和标记

c# - 在 C# 中,如何验证网络计算机上的用户?

c# - 将返回内核实例的 lambda 传递给 Ninject Web.Common UseNinjectMiddleware 是否可以?