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

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

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



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



Библиотеку по определению дистанции нашел.

code.google.com/p/geopy

UPD: используйте библиотеку) решение в лоб будет работать плохо
  • Вопрос задан
  • 33908 просмотров
Решения вопроса 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))
Ответ написан
Пригласить эксперта
Ответы на вопрос 9
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
Ответ написан
Комментировать
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) надо убрать и вместо них в запросе использовать переменные из вашего языка сервера приложений (Питон, я так понимаю).

Если нужно точное значение (земля ведь не ровный шар) или радиус, то см. решения других авторов.
Ответ написан
Не с этого надо начинать. Каковы требования по точности и скорости работы алгоритма? Много ли точек надо проверять на вхождение в одну окружность? Все ла равно вам на сплющенность Земли, а также на рельеф? Понимаете ли вы, что окружность на карте не будет выглядеть, как окружность?
Ответ написан
Комментировать
@iwitaly
Если правильно вас понял, просто из уравнения окружности (x — x_0)^2 + (y — y_0)^2 <= R^2 где x_0 и y_0 — координаты центра в вашей системе координат. Просто берете координаты точки и проверяете.
Ответ написан
@webmeddoc
Ответил на фрилансим , вкратце это будет выглядеть так:
import  math
dist = math.hypot(x-Sx, y-Sy)
if  dist < r: print("Входит")
else: print("Не входит")
Ответ написан
Комментировать
@spleanfan
так нужно отвечать тут или на фл?
Ответ написан
Комментировать
@Hoksmur
Пользоваться или нет данными внешних ресурсов, как то от Google или другое - решать ТС.
Если не пользоваться или допустимо взять сферу за поверхность Земли, то надо считать длину дуги на сфере между двумя точками. Формула в вики находится легко, есть даже по широте и долготе 349227e7ebb7664d6354a0b970956f994a71f4b6
Можно даже от тригонометрии избавится, остатвив +-*/ если допустима линейная аппроксимация.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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