Как определить входит ли геоточка(с широтой, долготой) в радиус?

Т.е. есть окружность на карте с центром, например [51.526613503445766, 46.02093849218558]

есть радиус — 5 км.


Требуется определить какие точки входят в этот радиус, какие нет.


Библиотеку по определению дистанции нашел.
code.google.com/p/geopy
  • Вопрос задан
  • 20522 просмотра
Решения вопроса 1
Gasoid
@Gasoid Автор вопроса
Вообщем алгоритм такой, есть база с пользователями, у каждого пользователя есть поля координат lat, lon
нужно например найти всех пользователей в квадрате 20 км

пример для django
        dist = 20 #дистанция 20 км
        mylon = 51.5289156201 # долгота центра
        mylat = 46.0209384922 # широта 
        lon1 = mylon-dist/abs(math.cos(math.radians(mylat))*111.0) # 1 градус широты = 111 км
        lon2 = mylon+dist/abs(math.cos(math.radians(mylat))*111.0)
        lat1 = mylat-(dist/111.0)
        lat2 = mylat+(dist/111.0)
        profiles = UserProfile.objects.filter(lat__range=(lat1, lat2)).filter(lon__range=(lon1, lon2))
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
Skull
@Skull
Зачем библиотека? Есть формула в 1 строку, определяет расстояние в метрах.
$distance = 2 * asin(sqrt( pow(sin(deg2rad( ($lat1-$lat2) / 2)), 2) +
cos(deg2rad($lat1)) * cos(deg2rad($lat2)) *
pow(sin(deg2rad(($lng1- $lng2) / 2)), 2))) * 6378245;

Если точки в БД хранятся — выбирайте не все, а только в определнных пределах. А для них уже вычислять расстояние
Ответ написан
alexmuz
@alexmuz
Считаете расстояние от точки до центра вашей окружности, если расстояние меньше или равно 5 км, значит входит, если больше значит не входит.
Ответ написан
Gasoid
@Gasoid Автор вопроса
По оптимизации поиска по вхождению точки в квадрат для Mysql
www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL
Ответ написан
@iwitaly
Если правильно вас понял, просто из уравнения окружности (x — x_0)^2 + (y — y_0)^2 <= R^2 где x_0 и y_0 — координаты центра в вашей системе координат. Просто берете координаты точки и проверяете.
Ответ написан
alex4
@alex4
интернет-предприниматель
Есть маленькая, но всё-таки разница между «входит в радиус» и «входит в квадрат». Квадратное решение проще, для него вообще серьёзная ГИС-артиллерия не нужна, да и работает молниеносно.

Делается это так:
0. Предполагаю, что координаты точки в радианах у вас хранятся в базе данных, в полях lat и lng.
1. Создаёте один индекс на оба поля для ускорения запросов.
2. В коде переводите 10 км в радианы (кажется, в одном метре 0,1988 радиан, но проверьте).
3. Чтобы определить, какие точки входят в квадрат со стороной 10 км с заданной точкой в центре, пишете такой запрос:

SET @lat = 51.526613503445766; # дано в условии
SET @lng = 46.02093849218558;
SET @half= [10 км в радианах] / 2 ;


SELECT id
FROM points
WHERE lat BETWEEN @lat - @half AND @lat + @half
  AND lng BETWEEN @lng - @half AND @lng + @half;


Первые 3 строки (SET) надо убрать и вместо них в запросе использовать переменные из вашего языка сервера приложений (Питон, я так понимаю).

Если нужно точное значение (земля ведь не ровный шар) или радиус, то см. решения других авторов.
Ответ написан
Не с этого надо начинать. Каковы требования по точности и скорости работы алгоритма? Много ли точек надо проверять на вхождение в одну окружность? Все ла равно вам на сплющенность Земли, а также на рельеф? Понимаете ли вы, что окружность на карте не будет выглядеть, как окружность?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы