实现步骤:
-
Haversine 公式: 我们使用 Haversine 公式来计算两个经纬度坐标之间的球面距离。这个公式基于球面三角学,可以在球体上准确地计算出两点之间的最短距离。
-
将角度转换为弧度: Haversine 公式需要将经纬度从角度转换为弧度,因为三角函数(如sin和cos)在计算时需要使用弧度而不是角度。
-
计算球面距离: 使用 Haversine 公式,我们计算出两个点之间的球面距离。这需要使用目标经纬度(
target_latitude
和target_longitude
)和数据库中存储的经纬度(latitude
和longitude
)。 -
筛选结果: 最后,我们将计算得到的球面距离与指定的半径进行比较。如果球面距离小于等于指定半径,那么我们认为这两个点在半径范围内,将其包含在查询结果中。
代码:
sql语句:
SELECT *
FROM locations
WHERE (
6371 * ACOS(
COS(RADIANS(latitude)) * COS(RADIANS(target_latitude)) * COS(RADIANS(target_longitude) - RADIANS(longitude)) +
SIN(RADIANS(latitude)) * SIN(RADIANS(target_latitude))
)
) <= 10; -- 10公里的半径范围
js判断:
function calculateDistance(lat1, lon1, lat2, lon2) {
const R = 6371; // 地球半径,单位为千米
const dLat = (lat2 - lat1) * (Math.PI / 180); // 纬度差值,转换为弧度
const dLon = (lon2 - lon1) * (Math.PI / 180); // 经度差值,转换为弧度
const a =
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(lat1 * (Math.PI / 180)) *
Math.cos(lat2 * (Math.PI / 180)) *
Math.sin(dLon / 2) *
Math.sin(dLon / 2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
const distance = R * c; // 距离,单位为千米
return distance;
}
function findNearbyUsers(users, targetLat, targetLon, maxDistance) {
return users.filter((user) => {
const distance = calculateDistance(
targetLat,
targetLon,
user.latitude,
user.longitude
);
return distance <= maxDistance;
});
}
// 示例用户数组
const users = [
{ name: "User 1", latitude: 40.7128, longitude: -74.006 },
{ name: "User 2", latitude: 34.0522, longitude: -118.2437 },
// ... 其他用户信息
];
const targetLat = 37.7749; // 输入的目标纬度
const targetLon = -122.4194; // 输入的目标经度
const maxDistance = 100; // 最大距离,单位为千米
const nearbyUsers = findNearbyUsers(users, targetLat, targetLon, maxDistance);
console.log("附近的人:", nearbyUsers);