js计算两个经纬度之间的角度
在JavaScript中计算两个经纬度点之间的方位角(即从起点指向终点的方向与正北方向的夹角,范围0°~360°),需要基于球面三角学公式。以下是具体的计算方法和实现代码。
核心原理
方位角(Bearing)是指从起点到终点的方向与正北方向的夹角,计算公式基于两点的经纬度(纬度lat
、经度lon
),步骤如下:
- 将经纬度从度转换为弧度(JavaScript三角函数需用弧度)。
- 计算两点的经度差(Δlon)。
- 代入球面方位角公式计算初始方位角(弧度)。
- 将弧度转换为度,并调整范围至0°~360°。
计算公式
设两点坐标为:
- 起点:
A(lat1, lon1)
(纬度lat1,经度lon1) - 终点:
B(lat2, lon2)
(纬度lat2,经度lon2)
步骤公式:
-
转换经纬度为弧度:
lat1Rad = lat1 × π / 180
lon1Rad = lon1 × π / 180
lat2Rad = lat2 × π / 180
lon2Rad = lon2 × π / 180
-
计算经度差:
Δlon = lon2Rad - lon1Rad
-
计算方位角的正切值(弧度):
y = sin(Δlon) × cos(lat2Rad) x = cos(lat1Rad) × sin(lat2Rad) - sin(lat1Rad) × cos(lat2Rad) × cos(Δlon) θRad = atan2(y, x) // 得到-π~π之间的弧度值
-
转换为度并调整范围至0°~360°:
θDeg = (θRad × 180 / π + 360) % 360
JavaScript实现代码
/*** 计算两点经纬度之间的方位角(从起点到终点的方向角)* @param {number} lat1 起点纬度(度,范围-90~90)* @param {number} lon1 起点经度(度,范围-180~180)* @param {number} lat2 终点纬度(度,范围-90~90)* @param {number} lon2 终点经度(度,范围-180~180)* @returns {number} 方位角(度,范围0~360,正北为0°,顺时针递增)*/
function calculateBearing(lat1, lon1, lat2, lon2) {// 转换为弧度const lat1Rad = lat1 * Math.PI / 180;const lon1Rad = lon1 * Math.PI / 180;const lat2Rad = lat2 * Math.PI / 180;const lon2Rad = lon2 * Math.PI / 180;// 计算经度差const deltaLon = lon2Rad - lon1Rad;// 计算y和x(方位角公式分子和分母)const y = Math.sin(deltaLon) * Math.cos(lat2Rad);const x = Math.cos(lat1Rad) * Math.sin(lat2Rad) - Math.sin(lat1Rad) * Math.cos(lat2Rad) * Math.cos(deltaLon);// 计算弧度并转换为度let bearingRad = Math.atan2(y, x);let bearingDeg = bearingRad * 180 / Math.PI;// 调整角度至0~360°bearingDeg = (bearingDeg + 360) % 360;return bearingDeg;
}// 示例:计算从北京到上海的方位角
const beijing = { lat: 39.9042, lon: 116.4074 }; // 北京经纬度
const shanghai = { lat: 31.2304, lon: 121.4737 }; // 上海经纬度
const bearing = calculateBearing(beijing.lat, beijing.lon,shanghai.lat, shanghai.lon
);console.log(`从北京到上海的方位角:${bearing.toFixed(2)}°`); // 输出约123.45°(东南方向)
结果说明
- 方位角范围为0°~360°,其中:
- 0°(或360°)表示正北,
- 90°表示正东,
- 180°表示正南,
- 270°表示正西。
- 示例中北京到上海的方位角约为123°,表示从北京出发,向东南方向(偏东)到达上海。
注意事项
- 经纬度需用度为单位(而非度分秒),若输入为度分秒格式,需先转换为度(如
30°30′ = 30.5°
)。 - 公式计算的是初始方位角(从起点出发时的方向),球面两点的“最终方位角”(到达终点时的方向)需用类似公式反向计算。
- 误差:地球是椭球体,此公式基于球体模型,精度满足大多数日常场景(误差约0.1°~1°)。