根据经纬度坐标查询附近数据

实现步骤:

  1. Haversine 公式: 我们使用 Haversine 公式来计算两个经纬度坐标之间的球面距离。这个公式基于球面三角学,可以在球体上准确地计算出两点之间的最短距离。

  2. 将角度转换为弧度: Haversine 公式需要将经纬度从角度转换为弧度,因为三角函数(如sin和cos)在计算时需要使用弧度而不是角度。

  3. 计算球面距离: 使用 Haversine 公式,我们计算出两个点之间的球面距离。这需要使用目标经纬度(target_latitudetarget_longitude)和数据库中存储的经纬度(latitudelongitude)。

  4. 筛选结果: 最后,我们将计算得到的球面距离与指定的半径进行比较。如果球面距离小于等于指定半径,那么我们认为这两个点在半径范围内,将其包含在查询结果中。

代码: 

        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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值