Преобразование миль в градусы широты и долготы с использованием геопии - PullRequest
0 голосов
/ 01 декабря 2010

Фон

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

Код

В приведенном ниже фрагменте, похоже, используются функции geopy , которые с тех пор были удалены. Он грубо сужает набор запросов, ограничивая диапазон широты и долготы.

    # Prune down the set of all locations to something we can quickly check precisely
    rough_distance = geopy.distance.arc_degrees(arcminutes=geopy.distance.nm(miles=distance)) * 2
    queryset = queryset.filter(
        latitude__range=(latitude - rough_distance, latitude + rough_distance), 
        longitude__range=(longitude - rough_distance, longitude + rough_distance)
    )

Задача

Поскольку некоторые из используемых функций геопии были удалены / перемещены, я пытаюсь переписать этот раздел. Тем не менее, я не понимаю вычисления - едва пройденная геометрия, и мои исследования смутили меня больше, чем помогли.

Кто-нибудь может помочь? Я был бы очень признателен.

Ответы [ 5 ]

1 голос
/ 12 октября 2013

В случае, если кто-то еще смотрит на это сейчас, так как я попытался использовать геопию и просто ударил ее, современный эквивалент приведенного выше фрагмента rough_distance:

1 голос
/ 01 декабря 2010

Этот код из блога небрежный:

  def near(self, latitude=None, longitude=None, distance=None):
    if not (latitude and longitude and distance):
      return []

Если широта == 0 (экватор) или долгота == 0 (гринвичский меридиан), она возвращается немедленно. Должно быть if latitude is None or longitude is None .......

@ Ответ TokenMacGuy является улучшением, но:

(a) Основная идея «ограничивающей рамки» состоит в том, чтобы избежать запроса SQL или аналогичного, вычисляющего расстояние до всех точек, которые в противном случае удовлетворяют запросу. С соответствующими индексами запрос будет выполняться намного быстрее. Это делается за счет ухода клиента (1) для вычисления координат ограничивающей рамки (2) для вычисления и проверки точного расстояния для каждого результата, возвращаемого запросом.

Если шаг 2 пропущен, вы получите ошибки даже на экваторе. Например, «найти все пиццерии в радиусе 5 миль» означает, что вы получите ответы на расстоянии до 7,07 миль (это квадратный метр (5 * 2 + 5 * 2)) в углах коробки.

Обратите внимание, что код, который вы показываете, кажется произвольным удваивающим радиус. Это будет означать, что вы получите очки 14,1 миль.

(b) Как сказал @TokenMacGuy, вдали от экватора становится все хуже. Рассчитанная таким образом ограничивающая рамка не включает все интересующие вас точки - если, конечно, вы не перебиваете, удваивая радиус.

(c) Если круг интересов включает в себя либо Северный, либо Южный полюс, расчет ужасно неточен и требует корректировки. Если круг интересов пересекается 180-градусным меридианом (то есть международной линией дат без зигзагов), результаты являются бессмысленными; вам необходимо выявить этот случай и применить запрос из двух частей (одна часть для каждой стороны меридиана).

Решения проблем (b) и (c) см. В этой статье .

1 голос
/ 01 декабря 2010

Земля не сфера, только примерно так.Если вам нужен более точный расчет, используйте pyproj .Тогда можно вычислить местоположение на основе эталонного эллипсоид (например WGS84).

1 голос
/ 01 декабря 2010

Ответ Мартино правильный с точки зрения того, что на самом деле делает фрагмент, но важно отметить, что 1 минута дуги представляет собой очень разные расстояния в зависимости от местоположения.На экваторе запрос охватывает ограничивающий прямоугольник с наименьшей осью, окружающий круг диаметром distance, но за пределами экватора ограничивающий прямоугольник не полностью содержит этот круг.

1 голос
/ 01 декабря 2010

Похоже, что distance в милях преобразуется в морские мили, каждая из которых равна минуте дуги, что составляет 1/60 от степени дуги каждая. Это значение затем удваивается, а затем добавляется и вычитается из заданной широты и долготы. Эти четыре значения можно использовать для формирования ограничивающего прямоугольника вокруг координат.

Вы можете найти любые необходимые коэффициенты преобразования в Википедии . Там также есть соответствующая статья под названием Горизонтальное представление положения , в которой обсуждаются плюсы и минусы альтернатив долготному и широтному позиционированию, позволяющие избежать некоторых их сложностей. Другими словами, о соображениях, связанных с заменой широты и долготы на другое представление горизонтального положения в вычислениях.

...