Как найти все точки в заданной координате с определенным радиусом?

Добрый день.

Подскажите как найти все точки по базе, зная координаты и радиус.
CREATE TABLE IF NOT EXISTS `points` (
  `point` int(11) DEFAULT NULL,
  `n` double DEFAULT NULL,
  `e` double DEFAULT NULL,
  KEY `n` (`n`),
  KEY `e` (`e`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


INSERT INTO `points` (`point`, `n`, `e`) VALUES
(1, 55.75272901, 37.60548887),
(2, 55.75473895, 37.61351058),
(3, 55.75271691, 37.60612187),
(4, 55.75280693, 37.61898127);


То есть приходит ко мне координата 55.75272901:37.60548887 с радиусом 100 метров, и согласно её мне надо получить запись 1 и 3.
  • Вопрос задан
  • 2826 просмотров
Решения вопроса 1
egor_nullptr
@egor_nullptr
Для начала создать хранимую процедуру вычисления расстояния по координатам:
delimiter $$

CREATE FUNCTION GetDistanceBetweenGeoLocations
(
lat1 float,
long1 float,
lat2 float,
long2 float
)
RETURNS float
DETERMINISTIC

BEGIN

DECLARE distance float;
DECLARE earth_radius float;
DECLARE axis float;

SET earth_radius = 6371.009;

SET axis = (SIN(RADIANS(lat2-lat1)/2) * SIN(RADIANS(lat2-lat1)/2) +
COS(RADIANS(lat1)) * COS(RADIANS(lat2)) *
SIN(RADIANS(long2-long1)/2) * SIN(RADIANS(long2-long1)/2));

SET distance = earth_radius * (2 * ATN2(SQRT(axis), SQRT(1-axis)));

RETURN ROUND(distance, 3);

END;
$$


После этого можно искать:
select * from points
where GetDistanceBetweenGeoLocations(n, 55.75272901, e, 37.60548887) <= 0.1
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Spetros
@Spetros
IT-шник
В школьном курсе геометрии есть формула описывающая окружность с центром в x0 и y0:
36ba0988c812ed2304db94f4cde92eb8.png
Если из этого равенства сделать неравенство, то мы можем получить формулу описывающую все точки находящиеся внутри нее, для которых это неравенство справедливо.
Ответ написан
risik
@risik
Программист
Тригонометрия в хранимых процедурах, конечно решение. Но вообще-то поддержка geo это большая тема, которая решается в СУБД отдельнвыми инструментами. Например, для mysql вам сюда: dev.mysql.com/doc/refman/5.0/en/gis-introduction.html
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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