如何从已知经纬度点出发按指定方位角移动一定距离后计算新坐标
经纬度方位角位移计算解决方案
原代码核心错误
- JS内置
Math.cos()、Math.sin()方法仅支持弧度单位输入,直接传入45度的角度值会得到错误的三角函数计算结果 - 经纬度是球面坐标,不能直接套用平面直角坐标系的位移公式,地表位移的公里数不能直接叠加到经纬度角度值上,计算需要引入地球平均半径参数
- 同一经度差对应的地表距离会随纬度升高而缩短,不能直接用统一系数换算
正确实现(基于球面大圆航位推算公式)
采用地球平均半径6371km参与计算,完整JS代码如下:
// 配置参数 const bearing = 45; // 方位角,单位度 const distance = 10; // 位移距离,单位km const position = { latitude: 30, longitude: -87 }; const earthRadius = 6371; // 地球平均半径,单位km // 角度转弧度工具函数 const degToRad = deg => deg * Math.PI / 180; // 弧度转角度工具函数 const radToDeg = rad => rad * 180 / Math.PI; // 所有角度统一转弧度 const latRad = degToRad(position.latitude); const lonRad = degToRad(position.longitude); const bearingRad = degToRad(bearing); const angularDistance = distance / earthRadius; // 角距离,单位弧度 // 计算新纬度弧度值 const newLatRad = Math.asin( Math.sin(latRad) * Math.cos(angularDistance) + Math.cos(latRad) * Math.sin(angularDistance) * Math.cos(bearingRad) ); // 计算新经度弧度值 const newLonRad = lonRad + Math.atan2( Math.sin(bearingRad) * Math.sin(angularDistance) * Math.cos(latRad), Math.cos(angularDistance) - Math.sin(latRad) * Math.sin(newLatRad) ); // 弧度转角度,同时归一化经度到[-180, 180]区间 const newLat = radToDeg(newLatRad); const newLon = ((radToDeg(newLonRad) + 540) % 360) - 180; console.log({newLat, newLon});
计算结果说明
代入你给出的参数计算,最终得到的坐标约为北纬30.063°、西经86.935°,误差在米级,符合常规使用需求。
内容的提问来源于stack exchange,提问作者lmg1114
相关产品推荐
相关产品推荐

