You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JavaScript/TypeScript计算多组经纬度之间的英里、英尺距离

经纬度点间距离计算实现(支持英里/英尺单位)

核心实现逻辑

  • 采用哈弗辛(Haversine)公式计算地球表面两点大圆距离,误差控制在0.5%以内
  • 地球半径取3958.8英里,计算结果直接转换为英里、英尺单位(1英里 = 5280英尺)

TypeScript 完整实现

// 经纬度点类型定义
interface LatLng {
  lat: number;
  lng: number;
}

// 计算结果类型
interface DistanceResult {
  pointAIndex: number;
  pointBIndex: number;
  distanceMiles: number;
  distanceFeet: number;
}

// 角度转弧度辅助函数
const toRadians = (degrees: number): number => {
  return degrees * Math.PI / 180;
};

// 计算两点之间的距离
const calculateDistance = (point1: LatLng, point2: LatLng): { miles: number, feet: number } => {
  const earthRadiusMiles = 3958.8;

  const dLat = toRadians(point2.lat - point1.lat);
  const dLng = toRadians(point2.lng - point1.lng);

  const a = 
    Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(toRadians(point1.lat)) * Math.cos(toRadians(point2.lat)) * 
    Math.sin(dLng / 2) * Math.sin(dLng / 2);
  
  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  const miles = earthRadiusMiles * c;
  const feet = miles * 5280;

  return { miles, feet };
};

// 批量计算所有点对的距离(不重复计算)
const calculateAllPointDistances = (points: LatLng[]): DistanceResult[] => {
  const results: DistanceResult[] = [];
  for (let i = 0; i < points.length; i++) {
    for (let j = i + 1; j < points.length; j++) {
      const { miles, feet } = calculateDistance(points[i], points[j]);
      results.push({
        pointAIndex: i,
        pointBIndex: j,
        distanceMiles: Number(miles.toFixed(4)),
        distanceFeet: Math.round(feet)
      });
    }
  }
  return results;
};

// 测试示例
const latsLngs: LatLng[] = [
  { lat: 40.78340415946297, lng: -73.9714273888736 },
  { lat: 40.778399767985704, lng: -73.97915215083648 },
  { lat: 40.7722899997727, lng: -73.96842331477691 },
  { lat: 40.76617966968189, lng: -73.97769302913238 },
  { lat: 40.76838985393672, lng: -73.96147102901031 },
  { lat: 40.781909380720485, lng: -73.96636337825348 },
];

// 输出结果
const allDistances = calculateAllPointDistances(latsLngs);
console.log(allDistances);

JavaScript 版本实现

// 角度转弧度辅助函数
const toRadians = (degrees) => {
  return degrees * Math.PI / 180;
};

// 计算两点之间的距离
const calculateDistance = (point1, point2) => {
  const earthRadiusMiles = 3958.8;

  const dLat = toRadians(point2.lat - point1.lat);
  const dLng = toRadians(point2.lng - point1.lng);

  const a = 
    Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(toRadians(point1.lat)) * Math.cos(toRadians(point2.lat)) * 
    Math.sin(dLng / 2) * Math.sin(dLng / 2);
  
  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  const miles = earthRadiusMiles * c;
  const feet = miles * 5280;

  return { miles, feet };
};

// 批量计算所有点对的距离(不重复计算)
const calculateAllPointDistances = (points) => {
  const results = [];
  for (let i = 0; i < points.length; i++) {
    for (let j = i + 1; j < points.length; j++) {
      const { miles, feet } = calculateDistance(points[i], points[j]);
      results.push({
        pointAIndex: i,
        pointBIndex: j,
        distanceMiles: Number(miles.toFixed(4)),
        distanceFeet: Math.round(feet)
      });
    }
  }
  return results;
};

// 测试示例
const latsLngs = [
  { lat: 40.78340415946297, lng: -73.9714273888736 },
  { lat: 40.778399767985704, lng: -73.97915215083648 },
  { lat: 40.7722899997727, lng: -73.96842331477691 },
  { lat: 40.76617966968189, lng: -73.97769302913238 },
  { lat: 40.76838985393672, lng: -73.96147102901031 },
  { lat: 40.781909380720485, lng: -73.96636337825348 },
];

// 输出结果
const allDistances = calculateAllPointDistances(latsLngs);
console.log(allDistances);

输出说明

  • 结果会返回所有不重复的点对组合,按索引标记两个点位
  • distanceMiles默认保留4位小数,distanceFeet默认四舍五入取整,可根据需求自行调整精度规则

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 18:06:08