使用IQueryable在另一个坐标的半径范围内查找点

时间:2010-12-29 03:57:30

标签: c# asp.net-mvc algorithm iqueryable geography

我将用户存储在设置了纬度和经度的数据库中。我想在服务层中编写一个过滤方法。

我们正在使用ASP.NET MVC和存储库模式。我们现在将使用实体框架和SQLServer。可以稍后切换到Azure或Amazon。

我的过滤方法如下所示:

    public static IQueryable<IPerson> InRadius(this IQueryable<IPerson> query, Coordinate center, double radius)
    {
        return (from u in query
                where
                    (Math.Pow(u.Location.Coordinate.Latitude - center.Latitude, 2) +
                     Math.Pow(u.Location.Coordinate.Longitude - center.Longitude, 2)) < Math.Pow(radius, 2)
                select u);
    }

看着这个,出了点问题。这是正常三角学的公式。这假设半径与纬度和经度所在的单位的测量值相同。

我对此代码有几个问题:

  1. 因为服务层应该不知道ORM,这个查询是否会在数据库上执行?将Math.Pow(double,double)传递给数据库吗?
  2. 如果无法在数据库上完成,那么过滤此数据的最有效方法是什么。我不想拉下所有内容,然后在我的应用程序中对它们进行排序。
  3. 地理问题:有没有办法将距离(无论是英里,公里)转换为纬度和经度使用的单位?这是针对半径问题的。

2 个答案:

答案 0 :(得分:0)

  1. Math.Pow应该由实体框架映射到sql中的适当方法。
  2. 如果1.不应该是真的,只需通过乘法计算自己的力量,这将在数据库中执行
  3. 我没有足够的知识回答这个问题,但如果我没记错的话,由于地球的形状(取决于参考框架和实际距离),这将非常困难。

答案 1 :(得分:0)

  1. 它可能已映射到POWER,但您必须尝试并确定无误。

  2. 如果它未转换为SQL,只需将Math.Pow(someExpression, 2)更改为someExpression * someExpression即可。这肯定会在数据库上执行。

  3. 您无法使用经度和纬度计算距离。地球表面的情况与笛卡尔平面的情况不同。