Найти точки с радиусом другой координаты с помощью IQueryable - PullRequest
2 голосов
/ 29 декабря 2010

У меня есть пользователи, хранящиеся в базе данных, для которой установлены широта и долгота.Я хочу написать метод фильтра в моем слое обслуживания.

Мы используем 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 голосов
/ 29 декабря 2010
  1. Вероятно, он сопоставлен с POWER, но вы должны попробовать и выяснить это наверняка.

  2. Если это не переводится в SQL, просто измените Math.Pow(someExpression, 2) на someExpression * someExpression. Это обязательно будет выполнено в базе данных.

  3. Вы не можете рассчитать расстояния, используя долготу и широту таким образом. На поверхности Земли все обстоит иначе, чем на декартовой плоскости.

0 голосов
/ 29 декабря 2010
  1. Math.Pow должен быть сопоставлен структурой сущностей с подходящим методом в sql.
  2. если 1. не должно быть истиной, просто рассчитайте мощность самостоятельно умножением, которое будет выполнено в базе данных
  3. У меня недостаточно знаний, чтобы ответить на этот вопрос, но если я правильно помню, это будет довольно сложно из-за формы земли (в зависимости от системы отсчета и фактического расстояния).
...