参考公式如下
tc=mod(atan2(sin(Δλ)cos(ϕ2), cos(ϕ1)sin(ϕ2)−sin(ϕ1)cos(ϕ2)cos(Δλ)), 2π)
输入参数说明
Δλ=lon1−lon2(两点的经度差)
ϕ1=lat1,ϕ2=lat2(两点的纬度)
lat1,lon1:起点(点1)的纬度和经度(以弧度为单位)
lat2,lon2:终点(点2)的纬度和经度(以弧度为单位)
输出参数说明
tc:表示 从点1(起点)到点2(终点)的大圆航线初始方位角(即起点的前进方向)。单位:弧度(rad),范围在 [0,2π)[0,2π) 之间。
几何意义:在球面坐标系中,从点1出发沿大圆(最短路径)向点2移动时,初始时刻的指向角度(正北为0,顺时针增大)。
JavaScript代码实现
/**
* 计算球面上两点之间的初始方位角(大圆航线)
* @param {number} lat1 - 起点纬度(弧度)
* @param {number} lon1 - 起点经度(弧度)
* @param {number} lat2 - 终点纬度(弧度)
* @param {number} lon2 - 终点经度(弧度)
* @returns {number} 初始方位角(弧度,范围 [0, 2π))
*/
function calculateInitialBearing(lat1, lon1, lat2, lon2) {
const deltaLon = lon1 - lon2;
// 计算分子和分母
const y = Math.sin(deltaLon) * Math.cos(lat2);
const x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(deltaLon);
// 计算角度并调整到 [0, 2π) 范围
const tc1 = Math.atan2(y, x);
return (tc1 + 2 * Math.PI) % (2 * Math.PI);
}