思路
若计算任意两点间的航线点,可以转换为已知大圆路径上某点的经度值,求取其对应的纬度值过程。
采用公式
lat=atan((sin(lat1)cos(lat2)sin(lon-lon2)-sin(lat2)cos(lat1)sin(lon-lon1))/(cos(lat1)cos(lat2)sin(lon1-lon2)))
参数说明:
lat1,lon1:起点(点1)的纬度和经度(以弧度为单位)
lat2,lon2:终点(点2)的纬度和经度(以弧度为单位)
lon:待计算航线点经度(以弧度为单位)
返回:
lon:待计算航线点纬度(以弧度为单位)
JavaScript实现
/**
* 计算大圆路径上某一经度对应的纬度
* @param {number} lat1 - 点1纬度(弧度)
* @param {number} lon1 - 点1经度(弧度)
* @param {number} lat2 - 点2纬度(弧度)
* @param {number} lon2 - 点2经度(弧度)
* @param {number} lon - 目标经度(弧度)
* @returns {number} 对应纬度(弧度),若分母为零返回 NaN
*/
function calculateLatitude(lat1, lon1, lat2, lon2, lon) {
// 计算分子和分母
const numerator = Math.sin(lat1) * Math.cos(lat2) * Math.sin(lon - lon2)
- Math.sin(lat2) * Math.cos(lat1) * Math.sin(lon - lon1);
const denominator = Math.cos(lat1) * Math.cos(lat2) * Math.sin(lon1 - lon2);
// 处理分母为零的情况
if (Math.abs(denominator) < 1e-12) { // 避免浮点误差
return NaN; // 经度差为0或180°时无解
}
// 计算纬度(使用atan确保结果在 [-π/2, π/2] 范围内)
const lat = Math.atan(numerator / denominator);
return lat;
}