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

Cesium 方位角方法和原理

在这里插入图片描述

完整代码:

/*** 计算2点的角度值,角度已正北为0度,顺时针为正方向* @param startPosition - 需要计算的点* @param endPosition - 目标点,以该点为参考中心。* @param [isNorthZero = false] - 是否正东为0时的角度(如方位角)* @returns 返回角度值,0-360度*/
export function getAzimuthAngle(startPosition, endPosition, adjustForOrientation) {// 获取参考点的局部东-北-上坐标系变换矩阵let localFrame = Cesium.Transforms.eastNorthUpToFixedFrame(endPosition);// 从 4x4 变换矩阵中提取 3x3 旋转矩阵localFrame = Cesium.Matrix4.getMatrix3(localFrame, new Cesium.Matrix3());// 提取局部坐标系的东(X)、北(Y)、上(Z)方向向量const eastDirection = Cesium.Matrix3.getColumn(localFrame, 0, new Cesium.Cartesian3());const northDirection = Cesium.Matrix3.getColumn(localFrame, 1, new Cesium.Cartesian3());const upDirection = Cesium.Matrix3.getColumn(localFrame, 2, new Cesium.Cartesian3());// 计算目标点相对于参考点的方向向量let directionVector = Cesium.Cartesian3.subtract(startPosition, endPosition, new Cesium.Cartesian3());// 检查方向向量是否有效(非 NaN 且不为零向量)if (isNaN(directionVector.x) ||isNaN(directionVector.y) ||isNaN(directionVector.z) ||directionVector.equals(Cesium.Cartesian3.ZERO)) {return 0;}// 将方向向量投影到局部水平面(通过两次叉乘实现)directionVector = Cesium.Cartesian3.cross(directionVector, upDirection, directionVector);directionVector = Cesium.Cartesian3.cross(upDirection, directionVector, directionVector);// 归一化方向向量directionVector = Cesium.Cartesian3.normalize(directionVector, directionVector);// 计算方向向量与东方向的夹角(弧度)let angleFromEast = Cesium.Cartesian3.angleBetween(eastDirection, directionVector);// 计算方向向量与北方向的夹角,用于确定角度方向const angleFromNorth = Cesium.Cartesian3.angleBetween(northDirection, directionVector);// 如果方向向量更接近南方向(与北向夹角 > 90°),调整角度if (angleFromNorth > Math.PI * 0.5) {angleFromEast = 2 * Math.PI - angleFromEast;}// 将角度转换为度,并调整为方位角(0° 在北,逆时针旋转)let azimuthAngle = 360 - Cesium.Math.toDegrees(angleFromEast) - 180;// 根据调整标志,增加 90 度(用于特定方向校正)if (adjustForOrientation) {azimuthAngle += 90;}// 确保角度在 0-360 度范围内if (azimuthAngle < 0) {azimuthAngle += 360;} else if (azimuthAngle > 360) {azimuthAngle -= 360;}return azimuthAngle;
}// https://jercky.top/2021/03/26/Cesium%E5%85%A5%E9%97%A8-7/
// https://github.com/JerckyLY/cesium-demo-view/blob/master/Utils/CesiumAngelUtil.js/*** 计算两个点的方位角度* @param lng_a* @param lat_a* @param lng_b* @param lat_b* @return {number}*/
export function courseAngle(startPosition, endPosition) {const carto_a = Cesium.Cartographic.fromCartesian(startPosition);const carto_b = Cesium.Cartographic.fromCartesian(endPosition);const lng_a = Cesium.Math.toDegrees(carto_a.longitude);const lat_a = Cesium.Math.toDegrees(carto_a.latitude);const lng_b = Cesium.Math.toDegrees(carto_b.longitude);const lat_b = Cesium.Math.toDegrees(carto_b.latitude);//以a点为原点建立局部坐标系(东方向为x轴,北方向为y轴,垂直于地面为z轴),得到一个局部坐标到世界坐标转换的变换矩阵const localToWorld_Matrix = Cesium.Transforms.eastNorthUpToFixedFrame(new Cesium.Cartesian3.fromDegrees(lng_a, lat_a));//求世界坐标到局部坐标的变换矩阵const worldToLocal_Matrix = Cesium.Matrix4.inverse(localToWorld_Matrix,new Cesium.Matrix4());//a点在局部坐标的位置,其实就是局部坐标原点const localPosition_A = Cesium.Matrix4.multiplyByPoint(worldToLocal_Matrix,new Cesium.Cartesian3.fromDegrees(lng_a, lat_a),new Cesium.Cartesian3());//B点在以A点为原点的局部的坐标位置const localPosition_B = Cesium.Matrix4.multiplyByPoint(worldToLocal_Matrix,new Cesium.Cartesian3.fromDegrees(lng_b, lat_b),new Cesium.Cartesian3());//弧度const angle = Math.atan2(localPosition_B.x - localPosition_A.x,localPosition_B.y - localPosition_A.y);//角度let theta = angle * (180 / Math.PI);if (theta < 0) {theta = theta + 360;}return theta;
}export function turfBearing(startPosition, endPosition) {const carto_a = Cesium.Cartographic.fromCartesian(startPosition);const carto_b = Cesium.Cartographic.fromCartesian(endPosition);const lng_a = Cesium.Math.toDegrees(carto_a.longitude);const lat_a = Cesium.Math.toDegrees(carto_a.latitude);const lng_b = Cesium.Math.toDegrees(carto_b.longitude);const lat_b = Cesium.Math.toDegrees(carto_b.latitude);const point1 = turf.point([lng_a, lat_a]);  // Start: Philadelphia City Hallconst point2 = turf.point([lng_b, lat_b]);  // End: Philadelphia International Airportreturn turf.bearing(point1, point2);
}
http://www.dtcms.com/a/446845.html

相关文章:

  • 桃城区网站制作公司上海自己注册公司
  • 举报网站建设宁波建工工程集团有限公司
  • 项目1:FFMPEG推流器讲解(一):FFMPEG重要结构体讲解
  • 做网站上海公司怎么做网站的浏览量统计
  • 如何填写网站建设计划表邯郸网站设计开发公司
  • 不需要iis的网站开发做网站有用吗
  • 苏州建设网站的公司电商运营推广怎么做
  • 阿里云通义千问开源新模型:多模态能力再突破
  • 【数之重复仅次数】2022-11-28
  • 站长之家是干什么的怎么建设自己个人网站
  • 毕设网站建设一个网站建设需要什么
  • 小杰深度学习(six)——卷积神经网络——计算机眼中的图象、卷积为什么能识别图象
  • 扁平化配色方案网站去哪优化网站关键词
  • 国外网站建设视频教学登封建设局网站
  • 简单大气的成品网站惠安县建设局网站
  • 制作钓鱼网站教程源码net网站是国际域名吗
  • 网站找不到的原因建站优化推广
  • 142、【OS】【Nuttx】【周边】效果呈现方案解析:strace 日志解析(八)
  • 为了推出企业网站建设山东电力建设河北分公司网站
  • 项目实践总结
  • 做社情网站犯法怎么办手机网站表单验证
  • 泉州专业网站建设公司建立网站要钱吗
  • 刚做的网站怎么在百度上能搜到logo设计在线生成免费免费
  • 用wordpress开发网站模板网站改版怎样做301
  • 宿迁北京网站建设洛可可工业设计公司
  • 网站改版汇报企业官网网站 优帮云
  • 群晖QC访问慢?终极解决方案
  • Hi3516DV500/HI3519DV500开发笔记之环境搭建和编译固件
  • 网站建设营销型做网站页面一般用什么软件
  • 怎么做公司官方网站外包网站该怎么做帐