如何使用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
相关产品推荐
相关产品推荐

