当前位置: 首页 > news >正文

js计算两个经纬度之间的角度

在JavaScript中计算两个经纬度点之间的方位角(即从起点指向终点的方向与正北方向的夹角,范围0°~360°),需要基于球面三角学公式。以下是具体的计算方法和实现代码。

核心原理

方位角(Bearing)是指从起点到终点的方向与正北方向的夹角,计算公式基于两点的经纬度(纬度lat、经度lon),步骤如下:

  1. 将经纬度从转换为弧度(JavaScript三角函数需用弧度)。
  2. 计算两点的经度差(Δlon)。
  3. 代入球面方位角公式计算初始方位角(弧度)。
  4. 将弧度转换为度,并调整范围至0°~360°。

计算公式

设两点坐标为:

  • 起点:A(lat1, lon1)(纬度lat1,经度lon1)
  • 终点:B(lat2, lon2)(纬度lat2,经度lon2)
步骤公式:
  1. 转换经纬度为弧度:
    lat1Rad = lat1 × π / 180
    lon1Rad = lon1 × π / 180
    lat2Rad = lat2 × π / 180
    lon2Rad = lon2 × π / 180

  2. 计算经度差:
    Δlon = lon2Rad - lon1Rad

  3. 计算方位角的正切值(弧度):

    y = sin(Δlon) × cos(lat2Rad)  
    x = cos(lat1Rad) × sin(lat2Rad) - sin(lat1Rad) × cos(lat2Rad) × cos(Δlon)  
    θRad = atan2(y, x)  // 得到-π~π之间的弧度值
    
  4. 转换为度并调整范围至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°)。
http://www.dtcms.com/a/337988.html

相关文章:

  • Python字符串连接与合并工程实践:从基础到高性能解决方案
  • 【笔记】位错的定义和分类
  • B站 韩顺平 笔记 (Day 22)
  • 【人工智能】2025年AI代理失控危机:构建安全壁垒,守护智能未来
  • 规避(EDR)安全检测--避免二进制文件落地
  • 面向对象爬虫进阶:类封装实现高复用爬虫框架​
  • DP-v2.1-mem-clean学习(3.6.9-3.6.12)
  • Python 爬虫实战:玩转 Playwright 跨浏览器自动化(Chromium/Firefox/WebKit 全支持)
  • 嵌入式第三十二课!!线程间的同步机制与进程间的通信(IPC机制)
  • PotPlayer使用AI生成字幕和API实时翻译
  • Redis中LRU与LFU的底层实现:字节级的精巧设计
  • 树莓派安装python第三方库如keras,tensorflow
  • day35-负载均衡
  • 智能化合同处理与知识应用平台:让合同从 “管得住” 到 “用得好”
  • C15T3
  • openssl加密里面的pem格式和rsa有什么区别?
  • 财务分析师如何提升自身专业能力:突破职业瓶颈的五年进阶规划
  • nestjs配置@nestjs/config 入门教程
  • 股票常见K线
  • 群晖nas中 打开PHP连接MariaDB 功能扩展
  • JavaSE——高级篇
  • 处理手表步数和分析用户步数数据
  • 【Tech Arch】Spark为何成为大数据引擎之王
  • 电子电气架构 --- 关于整车信息安全的一些思考
  • 2025年- H98-Lc206--51.N皇后(回溯)--Java版
  • CC攻击的安全防护方案
  • MySQL索引设计:高效查询与资源平衡指南
  • Deep Plug-And-Play Super-Resolution for Arbitrary Blur Kernels论文阅读
  • Spring Cloud LoadBalancer 最佳实践
  • PyQt流程