给定用户的位置,select 行包含该用户在其半径内
Given a user's location, select rows that include that user in their radius
我有一个 MySQL table 行 latitude
、longitude
和 radius
。经纬度类型为DOUBLE
; radius
属于 INT
类型,单位为米。本质上,每一行代表地球上的一个圆圈。
给定 user_latitude
和 user_longitude
的值,我如何才能 select 包含该用户在其圈子中的所有行?
我制作了一个快速图表来说明以防我的问题不清楚。每个红点代表 user_latitude
和 user_longitude
点,每个圆圈代表数据库中的 latitude
、longitude
和 radius
行。
第一步:实现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 表示英里)
第二步:使用函数
select * from areas where distance(lat, long, USERLAT, USERLONG) < radius
我有一个 MySQL table 行 latitude
、longitude
和 radius
。经纬度类型为DOUBLE
; radius
属于 INT
类型,单位为米。本质上,每一行代表地球上的一个圆圈。
给定 user_latitude
和 user_longitude
的值,我如何才能 select 包含该用户在其圈子中的所有行?
我制作了一个快速图表来说明以防我的问题不清楚。每个红点代表 user_latitude
和 user_longitude
点,每个圆圈代表数据库中的 latitude
、longitude
和 radius
行。
第一步:实现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 表示英里)
第二步:使用函数
select * from areas where distance(lat, long, USERLAT, USERLONG) < radius