我有一个包含行latitude
,longitude
和radius
的MySQL表。纬度和经度属于DOUBLE
类型; radius
的类型为INT
,以米为单位。基本上,每行代表地球上的一个圆圈。
鉴于user_latitude
和user_longitude
的值,如何在圈子中选择包含该用户的所有行?
我做了一个快速图表来说明以防我的问题不清楚。每个红点代表user_latitude
和user_longitude
点,每个圆圈代表数据库中的latitude
,longitude
和radius
行。
答案 0 :(得分:0)
步骤1:实施半径距离公式
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