JavaScript循环获取前后游标差值 计算相邻经纬度点距离
相邻经纬度点距离计算实现方案
核心遍历逻辑
你要的配对规则是严格按顺序的相邻元素匹配,不需要复杂的游标控制:
- 循环直接从数组的索引1开始遍历,直到数组最后一个元素
- 每轮循环中,当前索引
i对应的点是后序点,索引i-1对应的点就是需要匹配的前序点
这种写法不会出现下标越界,也不会漏配、错配,完全符合你要求的「第一次取0和1、第二次取1和2」的规则。
完整可运行代码
// Haversine公式实现,接收两个[纬度, 经度]格式的坐标点,返回两点间直线距离,单位:米 function getHaversineDistance(pointA, pointB) { const earthRadius = 6371000; const lat1 = pointA[0] * Math.PI / 180; const lat2 = pointB[0] * Math.PI / 180; const deltaLat = (pointB[0] - pointA[0]) * Math.PI / 180; const deltaLng = (pointB[1] - pointA[1]) * Math.PI / 180; const a = Math.sin(deltaLat / 2) ** 2 + Math.cos(lat1) * Math.cos(lat2) * Math.sin(deltaLng / 2) ** 2; const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); return earthRadius * c; } // 你的经纬度坐标数组 const trackPoints = [ [51.06745252933975, -114.11267548799515], [51.067506465746014, -114.09559518098831], [51.0827140244322,-114.0949085354805], [51.088267312195484,-114.10709649324417] ]; // 核心遍历:计算每一段相邻点的距离 const segmentDistances = []; for (let i = 1; i < trackPoints.length; i++) { const prev = trackPoints[i - 1]; const curr = trackPoints[i]; segmentDistances.push(getHaversineDistance(prev, curr)); } // 如需计算整条路径总长度,直接累加分段距离即可 const totalDistance = segmentDistances.reduce((sum, val) => sum + val, 0);
更简洁的函数式写法
如果你偏好无显式循环的写法,可以用数组方法实现,逻辑和for循环完全一致:
const segmentDistances = trackPoints.slice(1).map((curr, index) => { const prev = trackPoints[index]; return getHaversineDistance(prev, curr); });
边界兼容说明:当传入的坐标数组长度小于2(空数组、仅存1个点)时,上述两种写法都会直接返回空数组,不会触发下标越界报错,不需要额外编写异常判断逻辑。
内容的提问来源于stack exchange,提问作者user19221923
相关产品推荐
相关产品推荐

