You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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
  • 直接修改centerLatcenterLngrangeInMeters就能适配你的业务需求。

内容的提问来源于stack exchange,提问作者Ayman

火山引擎 最新活动