给定用户的位置,select 行包含该用户在其半径内

Given a user's location, select rows that include that user in their radius

我有一个 MySQL table 行 latitudelongituderadius。经纬度类型为DOUBLEradius 属于 INT 类型,单位为米。本质上,每一行代表地球上的一个圆圈。

给定 user_latitudeuser_longitude 的值,我如何才能 select 包含该用户在其圈子中的所有行?

我制作了一个快速图表来说明以防我的问题不清楚。每个红点代表 user_latitudeuser_longitude 点,每个圆圈代表数据库中的 latitudelongituderadius 行。

第一步:实现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

reference