JavaScript利用坐标计算两点间距离

计算球面上任意两点间的最短路径

Haversine 公式计算两点间大圆距离(地球曲面距离)

Haversine 公式用于计算球面上两点间的最短距离(大圆距离)。

以米为单位的实现

function calculateDistance(lat1, lng1, lat2, lng2) {
  const R = 6371000; // 地球半径,单位:米
  const toRad = x => x * Math.PI / 180;

  const dLat = toRad(lat2 - lat1);
  const dLng = toRad(lng2 - lng1);
  const a = Math.sin(dLat / 2) ** 2 +
            Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) *
            Math.sin(dLng / 2) ** 2;
  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  const distance = R * c;

  console.log('两点距离:', distance, '米');
  return distance;
}

以公里为单位的实现

function calculateDistance(lat1, lng1, lat2, lng2) {
  const R = 6371; // 地球半径,单位:公里
  const toRad = x => x * Math.PI / 180;

  const dLat = toRad(lat2 - lat1);
  const dLng = toRad(lng2 - lng1);
  const a = Math.sin(dLat / 2) ** 2 +
            Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) *
            Math.sin(dLng / 2) ** 2;
  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  const distance = R * c; // 单位:公里

  console.log('两点距离:', distance.toFixed(2), '公里');
  return distance;
}

示例:计算用户与天安门的距离

const targetLat = 39.9087;
const targetLng = 116.3975;

function calculateToTiananmen(lat, lng) {
  const km = calculateDistance(lat, lng, targetLat, targetLng);
  alert(`您距离天安门还有 ${km.toFixed(2)} 公里`);
}

如果需要四舍五入或保留1-2位小数,可以使用.toFixed(2)方法。

Haversine 公式计算两点间大圆距离(地球曲面距离)

Haversine 公式用于计算球面上两点间的最短距离(大圆距离)。

以米为单位的实现

function calculateDistance(lat1, lng1, lat2, lng2) {
  const R = 6371000; // 地球半径,单位:米
  const toRad = x => x * Math.PI / 180;

  const dLat = toRad(lat2 - lat1);
  const dLng = toRad(lng2 - lng1);
  const a = Math.sin(dLat / 2) ** 2 +
            Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) *
            Math.sin(dLng / 2) ** 2;
  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  const distance = R * c;

  console.log('两点距离:', distance, '米');
  return distance;
}

以公里为单位的实现

function calculateDistance(lat1, lng1, lat2, lng2) {
  const R = 6371; // 地球半径,单位:公里
  const toRad = x => x * Math.PI / 180;

  const dLat = toRad(lat2 - lat1);
  const dLng = toRad(lng2 - lng1);
  const a = Math.sin(dLat / 2) ** 2 +
            Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) *
            Math.sin(dLng / 2) ** 2;
  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  const distance = R * c; // 单位:公里

  console.log('两点距离:', distance.toFixed(2), '公里');
  return distance;
}

示例:计算用户与天安门的距离

const targetLat = 39.9087;
const targetLng = 116.3975;

function calculateToTiananmen(lat, lng) {
  const km = calculateDistance(lat, lng, targetLat, targetLng);
  alert(`您距离天安门还有 ${km.toFixed(2)} 公里`);
}

如果需要四舍五入或保留1-2位小数,可以使用.toFixed(2)方法。

加载中...