У меня есть таблица MySQL со строками latitude
, longitude
а также radius
, Широта и долгота имеют тип DOUBLE
; radius
имеет тип INT
и измеряется в метрах. По сути, каждый ряд представляет круг на Земле.
Приведенные значения user_latitude
а также user_longitude
Как я могу выбрать все строки, которые включают пользователя в своих кругах?
Я сделал быструю диаграмму, чтобы проиллюстрировать, если мой вопрос не был ясен. Каждая красная точка представляет user_latitude
а также user_longitude
точка, каждый круг представляет latitude
, longitude
а также radius
строка в базе данных.
Шаг 1: реализовать формулу расстояния haversine
delimiter //
create function DistanceInKm(
lat1 FLOAT, lon1 FLOAT,
lat2 FLOAT, lon2 FLOAT
) returns float
NO SQL DETERMINISTIC
begin
return degrees(acos(
cos(radians(lat1)) *
cos(radians(lat2)) *
cos(radians(lon2) - radians(lon1)) +
sin(radians(lat1)) * sin(radians(lat2))
)) * 111.045;
END//
delimiter ;
(магическое число 111.045 преобразует его в км, используйте 69 для миль)
шаг 2: используйте функцию
select * from areas where distance(lat, long, USERLAT, USERLONG) < radius
Других решений пока нет …