Учитывая местоположение пользователя, выберите строки, которые включают этого пользователя в свой радиус

У меня есть таблица MySQL со строками latitude, longitude а также radius, Широта и долгота имеют тип DOUBLE; radius имеет тип INT и измеряется в метрах. По сути, каждый ряд представляет круг на Земле.

Приведенные значения user_latitude а также user_longitudeКак я могу выбрать все строки, которые включают пользователя в своих кругах?

Я сделал быструю диаграмму, чтобы проиллюстрировать, если мой вопрос не был ясен. Каждая красная точка представляет user_latitude а также user_longitude точка, каждый круг представляет latitude, longitude а также radius строка в базе данных.

диаграмма

0

Решение

Шаг 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

ссылка

0

Другие решения

Других решений пока нет …