如何用JavaScript实现类似Android Location.distanceBetween的经纬度距离判断?
在JavaScript中实现坐标距离判断(类似Android的
distanceBetween) 嘿,刚好我之前也折腾过类似的需求!JavaScript里没有像Android那样直接开箱即用的Location.distanceBetween方法,但我们可以用Haversine公式来计算地球表面两点间的球面距离——这是处理地理坐标距离最常用的方案,和Android的底层逻辑思路一致。
先给你核心的距离计算函数
这个函数接收两组经纬度参数,返回两点间的距离(单位:米),直接就能用:
function calculateDistance(lat1, lon1, lat2, lon2) { // 地球平均半径(单位:米) const earthRadius = 6371000; // 把经纬度从度数转换为弧度(三角函数需要弧度值) const radLat1 = Math.PI * lat1 / 180; const radLon1 = Math.PI * lon1 / 180; const radLat2 = Math.PI * lat2 / 180; const radLon2 = Math.PI * lon2 / 180; // 计算纬度差和经度差 const deltaLat = radLat2 - radLat1; const deltaLon = radLon2 - radLon1; // Haversine公式核心计算逻辑 const a = Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.sin(deltaLon / 2) * Math.sin(deltaLon / 2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); // 返回最终距离(米) return earthRadius * c; }
结合你现有代码的完整实现
我把距离判断逻辑直接整合到你已有的获取位置代码里了,你只需要替换自己的中心点坐标就行:
var x = document.getElementById("demo"); // 替换成你的目标中心点经纬度 const centerLat = 39.9042; // 示例:北京天安门纬度 const centerLng = 116.4074; // 示例:北京天安门经度 // 设定范围:5公里 = 5000米 const rangeInMeters = 5000; function getLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition); } else { x.innerHTML = "Geolocation is not supported by this browser."; } } function showPosition(position) { const userLat = position.coords.latitude; const userLng = position.coords.longitude; // 计算用户位置到中心点的距离 const distance = calculateDistance(centerLat, centerLng, userLat, userLng); // 判断是否在5公里范围内 const isWithinRange = distance < rangeInMeters; // 把结果展示出来 x.innerHTML = `Latitude: ${userLat}<br>Longitude: ${userLng}<br> Distance to center: ${Math.round(distance)} meters<br> Is within 5km range: ${isWithinRange ? '✅ Yes' : '❌ No'}`; } // 核心距离计算函数 function calculateDistance(lat1, lon1, lat2, lon2) { const earthRadius = 6371000; const radLat1 = Math.PI * lat1 / 180; const radLon1 = Math.PI * lon1 / 180; const radLat2 = Math.PI * lat2 / 180; const radLon2 = Math.PI * lon2 / 180; const deltaLat = radLat2 - radLat1; const deltaLon = radLon2 - radLon1; const a = Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.sin(deltaLon / 2) * Math.sin(deltaLon / 2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); return earthRadius * c; }
小提示
- Haversine公式计算的是球面直线距离(大圆距离),和Android的
distanceBetween逻辑完全匹配,误差极小,日常场景完全够用。 - 如果需要以公里为单位,把计算结果除以1000就行,比如
distance / 1000。 - 直接修改
centerLat、centerLng和rangeInMeters就能适配你的业务需求。
内容的提问来源于stack exchange,提问作者Ayman




