我有一个MySQL表,其中有latitudelongituderadius行。纬度和经度属于DOUBLE类型; radiusINT类型,以米为单位。本质上,每一行代表地球上的一个圆。

给定user_latitudeuser_longitude的值,如何选择圈子中包含用户的所有行?

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

最佳答案

步骤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/

10-11 02:31