判断一个点 A (其经纬度为lat1,lon1) 是否在另一个点 B (其经纬度为 lat2,lon2) 的方圆 n 米之内,可以使用地球上经纬度之间的距离计算公式。常用的方法是 哈夫辛公式(Haversine Formula),它可以计算两个点之间的球面距离。

哈夫辛公式

计算过程如下
1、将经纬度转换为弧度。
2、算两个点之间的距离。
3、判断计算得到的距离是否小于或等于n。

公式:

在这里插入图片描述
其中:
1、r 是地球的半径,约等于 6371 公里(或 6371000 米)。
2、d 是两点之间的距离。

实现示例(JavaScript)

以下是 JavaScript 中实现这种判断的方法:

function isPointWithinRange(lat1, lon1, lat2, lon2, range) {  
    const toRadians = (degree) => degree * (Math.PI / 180); // 角度转弧度  

    // 将经纬度转为弧度  
    const lat1Rad = toRadians(lat1);  
    const lon1Rad = toRadians(lon1);  
    const lat2Rad = toRadians(lat2);  
    const lon2Rad = toRadians(lon2);  

    // 哈夫辛公式  
    const dLat = lat2Rad - lat1Rad;  
    const dLon = lon2Rad - lon1Rad;  

    const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +  
              Math.cos(lat1Rad) * Math.cos(lat2Rad) *  
              Math.sin(dLon / 2) * Math.sin(dLon / 2);  
    
    const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));  
    const R = 6371000; // 地球平均半径,单位为米  
    const distance = R * c; // 计算出来的距离  

    // 判断是否在范围内  
    return distance <= range;  
}  

// 示例  
const latA = 39.9042; // A点纬度  
const lonA = 116.4074; // A点经度  
const latB = 39.9088; // B点纬度  
const lonB = 116.3973; // B点经度  
const range = 1000; // 范围 1000 米  

const result = isPointWithinRange(latA, lonA, latB, lonB, range);  
console.log(result); // 输出 true 或 false 

代码解释

1、toRadians(degree):将角度转换为弧度。
2、经纬度转换:将lat1,lon1,lat2,lon2 从度数转换为弧度。
3、计算距离:利用哈夫辛公式计算出两点之间的距离。
4、返回判断:如果计算出来的距离小于或等于指定范围 n,返回 true

注意事项

经纬度的范围是:
纬度 lat: -90° 到 90°
经度 lon: -180° 到 180°
确保传入的经纬度和范围是有效的,以避免计算错误。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐