Клуб API Карт

Проверить, принадлежит ли точка окружности

money-zlo
6 декабря 2013, 15:07

Предупрежу сразу, с координатами столкнулся впервые) Задача у меня крайне проста - определить, входит ли точка в окружность на карте. Средствами YAPI это слеть легко, в песичнице есть простой пример. А как такой же расчет реализовать средствами других языков программирования? 

 

Сначала я думал, что все легко. Есть точка (X,Y), есть центр окружности (X1,Y1), простой формулой проверяю, входит ли точка в оуружность

(x-x1)^2 + (y-y1)^2 <= R^2, где R - радиус окружности. Радиус не нужен был крайне точным, по картам провел линейкой 1км, координаты сдвинулись на 0,032 градуса. Эту величину и подставлял в R, из расчета что 0,0132 градуса = 1км. Обрадовался, напился.


Далее возникла проблема. В выборку попадали точки и окружности, которые по идее не должны в нее попадать. И попадали очень странно, только когда точка СВЕРХУ круга. Начал курить далее. Провел по ссвоему супер способу линеечку вверх, и увидел, что по оси Y одному километр - это примерно 0,009 градусов. Сразу же дошло, что наша планетка Земля в развернутом виде в ширину больше, чем в высоту, и мой "круг" для карты - это огромный овал. Оттуда и правило - не считай километры по градусам, ибо это быдлокод и повод для насмешек.


Собственно теперь возникла проблема, как найти точку на карте, которая принадлежит кругу, или как работает функция, которая высчитывает вхождение, как например тут 


Нашел коммент с формулой на MySQL, но, во-первых, не пойму, то ли это, во-вторых, непонятны некоторые переменные в запросе

4 комментария
Подписаться на комментарии к посту

Вам нужно овладеть древними знаниями - сферической тригонометрией. Все, кто знает сферическую тригонометрию, умеют считать попадание точки в окружность в уме даже в ночь с 1 на 4е января.

Мы не из этих. Мы сферической триногометрией не овладели и с позором делаем так - любую фигуру мы проецируем на земной шар и смотрим пересечение уже самих проекций (это ответ на вопрос, как у нас работает geoQuery).

 В вашей конкретной задаче достаточно научиться считать расстояние между двумя точками по координатам (точка и центр окружности). Если расстояние меньше или равно радиусу, то точка принадлежит окружности.

Расчет расстояния обсуждался в клубе. Вот например здесь.

 

Спасибо)) Буде курить. Вам надо было написать так: "Вам нужно овладеть древними знаниями - сферической тригонометрией. Вот вам древний артефакт Амулет истины"

В MySQL есть spatial indexes и они это умеют