Вопрос по android, python – Найти предметы в определенном диапазоне заданной координаты

4

У меня есть веб-приложение на основе Django, которое хранит местоположения.

У меня есть мобильное приложение для Android, которое извлекает местоположения из веб-приложения и сохраняет их в веб-приложении. Места возвращаются обратно ко мне, я загружаю на mapoverlay в моем приложении.

Я хотел бы отправить свои текущие координаты и вернуть список мест, которые находятся в пределах определенного диапазона. Например, я отправляю свое местоположение и возвращаю предметы в радиусе 2 км. (Аналогично тому, как работает API Google Адресов, только поиск в моих данных).

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

Я не знаю, с чего начать. Как я могу отфильтровать свои сохраненные местоположения в пределах определенного радиуса (км) на основе заданного набора координат?

Опубликуйте свою модель, нужно понять, как выглядит структура вашей таблицы. Never Back Down
1) выберите все местоположения, которые находятся рядом с вашим текущим местоположением (скажем, в пределах одной широты / длины строки). 2) использовать расчет расстояния для каждой из выбранных координат и исключить те, которые являются & gt; желаемый диапазон (2 км). В случае, если вы забыли расстояниеsqrt(dx**2+dy**2) Joel Cornett

Ваш Ответ

4   ответа
11

Уравнение Хаверсайна является ответом на ваш вопрос. Однако это немного сложно расшифровать, поэтому здесь я приведу простое объяснение:

Проще говоря

Вот пример / пример SQL-оператора, который найдет ближайшие 20 местоположений в радиусе 25 миль от координаты 37, -122. Он вычисляет расстояние на основе широты / долготы этой строки и целевой широты / долготы (заданной широтой / долготой в приведенном ниже уравнении), а затем запрашивает только те строки, в которых значение расстояния меньше 25, упорядочивает весь запрос по расстоянию, и ограничивает его до 20 результатов. Для поиска по километрам вместо миль замените 3959 на 6371.

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;

Вы можете преобразовать sql во что угодно. Я имею в виду, что принцип остается прежним.

Благодарность. немного отредактировал для postgresqlSELECT distance FROM (SELECT ( 6371 * acos( cos( radians(45) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(10) ) + sin( radians(45) ) * sin( radians( latitude ) ) ) ) AS distance FROM spots_spot ) sub GROUP BY sub.distance HAVING sub.distance < 2 а вот класс питона Haversine darren
1

чтобы рассчитать расстояние до каждого места и выбрать точки в пределах определенного расстояния. Если вы хотите выполнять поиск быстрее, вы можете организовать свои местоположения в более сложной структуре данных (например, КД-дерево).

1

GeoDjango интегрируется с отличным дополнением PostGIS для Postgres, которое предоставляет вам все эти дистанционные поиски бесплатно.

Если у вас есть LatLong, сохраненный в модели, которая хранится как тип Postgres, вы можете выполнить тривиальный запрос ORM, чтобы получить все местоположения в пределах определенного расстояния до текущего LatLong.

GeoDjango очень мощный и имеет много опций, и если все, что вам когда-либо нужно, это просто найти местоположения из списка, которые находятся на заданном расстоянии, вы можете просто использовать простую математику: distance = sqrt (dx ^ 2 + ду ^ 2)

0

я сталкивался с этим, надеюсь, это поможет. Сначала я собирался отфильтровать результаты JSON с сервера, а потом пришел к этому и понял, что Mysql гораздо сложнее, чем я его изначально представлял.

https: //www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQ

Комментарий выше не сработал для меня, но они потратили деньги на то, чтобы идти с Уравнение Хаверсайна. Гораздо эффективнее делать большую часть этого на стороне сервера, чтобы телефон не перегружался информацией, которая ни для чего не будет использоваться. Это все равно, что испечь полноценный 10-дюймовый пирог, чтобы нарезать восьмой кусок и выбросить все остальное, почему бы не испечь крошечный торт с радиусом 2 дюйма? Может показаться, что это не сильно отличается, но, как и любая хорошая программа, получайте только то, что вам нужно, если вам не нужно все это.

Чтобы использовать живую рабочую версию, запустите небольшой тест на свой собственный код, воспользуйтесь этой ссылкой ниже.http: //sqlfiddle.com/# 2 / abba1 / 2

Надеюсь, этот пост поможет.

Похожие вопросы