我有一个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将其转换为km,使用69表示英里)
步骤2:使用功能
select * from areas where distance(lat, long, USERLAT, USERLONG) < radius
reference
关于php - 给定用户的位置,选择在半径范围内包括该用户的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29820927/