已知两点坐标,计算两点的方向角度

本文介绍如何利用Math.atan2函数计算两点间的平面角度,并结合Leaflet库的latLngToContainerPoint进行坐标转换,提供了一个getAngle函数示例。重点讲解了不同象限的处理和角度单位转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在已知两点坐标的情况,我们如果去计算两点的角度呢?

在计算角度之前,先了解下会用到的函数Math.atan2 

Math.atan2()

概述

Math.atan2() 返回从原点(0,0)到(x,y)点的线段与x轴正方向之间的平面角度(弧度值),也就是Math.atan2(y,x)

语法

Math.atan2(y, x) 

参数

y, x

数值

描述

atan2 方法返回一个 -pi 到 pi 之间的数值,表示点 (x, y) 对应的偏移角度。这是一个逆时针角度,以弧度为单位,正X轴和点 (x, y) 与原点连线 之间。注意此函数接受的参数:先传递 y 坐标,然后是 x 坐标。

atan2 接受单独的 x 和 y 参数,而 atan 接受两个参数的比值。

由于 atan2 是 Math 的静态方法,所以应该像这样使用:Math.atan2(),而不是作为你创建的 Math 实例的方法。

还用到leaflet的转换方式latLngToContainerPoint把地理坐标转换成容器相应的像素坐标

/**
 * 求两点坐标角度
 * @param startLatlng  坐标
 * @param endLatlng  坐标
 *   */ 
function getAngle(startLatlng, endLatlng){
    // 转换容器的相应像素坐标
    let start = map.latLngToContainerPoint(startLatlng),
        end = map.latLngToContainerPoint(endLatlng)
    let y = end.y - start.y,
        x = end.x - start.x
    var angle = Math.atan2(y, x) * ( 180 / Math.PI) + 90
    
    return angle
}

其他计算方式:

var angle = 360*Math.atan(y/x)/(2*Math.PI);

 这里得注意每个象限的不同情况了

在Cesium中,计算两点之间的方位角通常用于确定从一个点到另一个点的理想直线路径相对于地球表面的朝向。这个角度通常被称为"航向角"或"真北角"。以下是一个简单的步骤来计算方位角: 1. **准备数据**:首先获取两个点的经纬度坐标。例如,设A点经度lonA,纬度latA,B点经度lonB,纬度latB。 2. **转换坐标**:将地理坐标转换为三维笛卡尔坐标,因为Cesium基于这种坐标系统。可以使用`Cesium.Ellipsoid.WGS84.cartographicToCartesian`方法: ```javascript const pointA = Cesium.Ellipsoid.WGS84.cartographicToCartesian(new Cesium.Cartographic(lonA, latA, 0)); const pointB = Cesium.Ellipsoid.WGS84.cartographicToCartesian(new Cesium.Cartographic(lonB, latB, 0)); ``` 3. **计算矢量**:通过减法得到从A点到B点的向量: ```javascript const vectorAB = Cesium.Cartesian3.subtract(pointB, pointA, new Cesium.Cartesian3()); ``` 4. **找到地磁北向量**:由于地球上存在磁偏角,Cesium提供了一个方法`Cesium.Math.geodeticSurfaceNormal`来计算地心引力作用下的正常向量,这可以近似看作是地磁北向量: ```javascript const geodeticNormal = Cesium.Ellipsoid.WGS84.geodeticSurfaceNormal(latA, lonA); ``` 5. **计算方位角**:最后,通过向量A-B与地磁北向量的内积除以向量A-B的长度,然后取反正切值(注意结果可能是负数,所以加上π如果小于0),就可以得到方位角: ```javascript const angle = Math.atan2(Cesium.Cartesian3.dot(geodeticNormal, vectorAB), Cesium.Cartesian3.magnitude(vectorAB)) % (2 * Math.PI); const bearing = angle * (180 / Math.PI); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值