Этот код из блога небрежный:
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) см. В этой статье .