Найти предметы в определенном диапазоне заданной координаты

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

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

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

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

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

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

Проще говоря:

Вот пример / пример SQL-оператора, который найдет ближайшие 20 местоположений, которые находятся в радиусе 25 миль к координате 37, -122. Он вычисляет расстояние, основанное на широте / долготе этой строки и целевой широте / долготе (заданной lat / lng в приведенном ниже уравнении), а затем запрашивает только строки, где значение расстояния меньше 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 во все, что пожелаете. Я имею в виду, что принцип остается тем же.

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

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

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

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

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

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

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

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

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