使用TLE计算轨道并使用Cesium绘制

news/2024/11/6 5:28:10/文章来源:https://www.cnblogs.com/zzzzzblog/p/18525890

使用TLE计算轨道并使用Cesium绘制

依赖库

  • satellite.js

npm install satellite.js

实现思路

  1. 利用satellite.js获取一个轨道周期内的全部轨迹点坐标
  2. 使用Cesium的primitive绘制轨迹线

完整代码

import { twoline2satrec, propagate, gstime, eciToEcf } from "satellite.js";const tle1 = `1 00005U 58002B   24282.07474862  .00001783  00000-0  22061-2 0  9998  `
const tle2 = `2 00005  34.2560  58.9866 1843712 236.2153 104.9193 10.85699439376194  `const satrec = twoline2satrec(item.tleLine1, item.tleLine2); /*** 计算卫星每圈所需的时间* * @param {Object} satrec - 卫星轨道数据* @param {number} satrec.no - 卫星每分钟的平均角速度,单位为弧度/分钟* @returns {number} 卫星运行一圈所需的时间,单位为分钟*/
function calCircleBySatrec(satrec) {return (2 * Math.PI) / satrec.no;
}/*** 根据卫星的 TLE 数据和指定时间计算卫星在地心惯性坐标系中的位置。** @param {Object} satrec - 卫星轨道数据对象,包含轨道信息。* @param {number} [time=Date.now()] - 可选参数,计算位置的时间(时间戳,默认为当前时间)。* @param {string} type - 坐标系类型,支持 "ECI"(地心惯性坐标系)和 "ECF"(地心固定坐标系)。* @returns {Cesium.Cartesian3|undefined} - 卫星在指定坐标系中的位置/undefined。*/
function getPositionFromTle(satrec, time = Date.now(), type = "ECI") {const curTimeDate = new Date(time);const { position } = propagate(satrec, curTimeDate) || {};if (!position) return;const conversionFactor = 1000; // 米转换因子if (type === "ECI") {return new Cesium.Cartesian3(position.x * conversionFactor,position.y * conversionFactor,position.z * conversionFactor);}if (type === "ECF") {const gmst = gstime(curTimeDate);const positionEcf = eciToEcf(position, gmst);if (!positionEcf) return;return new Cesium.Cartesian3(positionEcf.x * conversionFactor,positionEcf.y * conversionFactor,positionEcf.z * conversionFactor);}return;
}const timeStamp = Date.now(); 
const minsPerInterval = calCircleBySatrec(satrec); //轨道周期
const positionsArr = []; // 轨迹点数组for (let i = 0; i <= minsPerInterval; i++) {const curPosition = getPositionFromTle(satrec, timeStamp + i * 60 * 1000);if (curPosition) {positionsArr.push(curPosition);}
}const viewer = new Cesium.Viewer('cesiumContainer', {})const satPolylineCollection = viewer.scene.primitives.add(new Cesium.PolylineCollection());const trackPrimitive = satPolylineCollection.add({id: 1,positions: positionsArr,width: 2,material: Cesium.Material.fromType("Color", {glowPower: 0.1,color: new Cesium.Color(0, 0.9, 0.8, 0.3),// color: new Cesium.Color(...getRandomColor()),}),});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/826713.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实例化对象有哪几种方式

1. **new 关键字** User user = new User(); 2. **clone() 方法** User clonedUser = originalUser.clone(); 3. **通过反射机制创建** Class<?> cls = Class.forName("com.dao.User"); User u = (User) cls.newInstance(); 4. **序列化反序列化** …

操作字符串都有哪些类以及它们之间有什么区别

1. **String**: - 是不可变对象。每次对 String 类型进行修改时都会生成一个新的对象。 - 适用于不频繁修改字符串的情况。 2. **StringBuilder**: - 线程不安全,效率高,多用于单线程环境。 - 适用于需要频繁修改字符串的操作。 3. **StringBuffer**: - 线程安全…

微信公众号服务器配置一直提示token验证失败?

本地使用postman,请求了要设置在微信公众号服务器回调的URL,可以正常返回echostr,点击提交, 一直报错token验证失败,请问这个是什么原因呢? 解决办法: 解决了,我去,好坑啊,遇到该问题的朋友,请做如下检查:1.检查,request 是不是 UTF-8,避免获取的数据是乱码 2…

「闲话」NOIP 集训

10.31 因为明天是 11.1,所以从今天开始写 上午 T1 没看让输出啥所以一眼会了求所有 j 看了输出之后,额 诶,其实也对啊,直接根据每个 j 求出的 i 区间查分一下就好了,调和级数的复杂度 20 min 打完了,本来以为有些 conercase 要调一会,但直接过了所有样例,爽!! 后记:…

2024-11-04 Request textDocument/documentSymbol failed. ==》重启vscode

今个儿早上一来,跑一下项目,我勒个去,这个vscode就给我不断弹出这种弹窗 Request textDocument/documentSymbol failed. 请求文本Document/documentSymbol失败。来源:Vue-官方。 原因:不知道,可能是终端报错了,但是把终端关掉了(没有杀死),报错仍旧存在。 解决方案:…

django抛出异常然后在axios里处理

1.views.py代码@csrf_exempt def get_selectdata_by_sql(request):current = request.GET.get("current", 1)size = request.GET.get("size", 0)limit_size=50try:res_list = []request_dict = json.loads(request.body)# print(request_dict)runsql = req…

Tmux基本用法

Tmux 是一个终端复用器(terminal multiplexer),非常有用,属于常用的开发工具。 它的核心功能是解绑当前运行会话进程和当前终端窗口。即使出现意外情况,当前的终端窗口被kill掉了(断电、断网、手贱点错了等等),你之前使用Tmux执行的会话进程仍在继续运行,并可以绑定到…

配置数据同步环境v1

配置数据同步环境v1.0 1 配置Canal+MQ数据同步环境 1.1 配置Mysql主从同步 根据Canal的工作原理,首先需要开启MySQL主从同步。 1.在MySQL中需要创建一个用户,并授权 进入mysql容器: docker exec -it mysql /bin/bash -- 使用命令登录: mysql -u root -p -- 创建用户 用户名…

linux的Miniconda安装

下载 官网下载安装包:官网 安装 终端输入以下命令安装 sh Miniconda3-latest-Linux-x86_64.sh出现如下页面,摁住回车出现如下页面,松开回车,输入 yes继续回车输入 yes安装完成!重启终端生效,或者执行下面命令立即生效: source ~/.bashrc

C# 删除Word文档中的段落

在编辑Word文档时,我们有时需要调整段落的布局、删除不必要的段落以优化文档的结构和阅读体验。本文将通过以下3个简单示例演示如何使用免费.NET库删除Word文档中的段落 。C# 删除Word中的指定段落 C# 删除Word中的所有段落 C# 删除Word中的空白段落免费.NET Word 库 - Free S…

我的技术成长之路

大家好,我是苏三~ 前言 我花了一年多的时间,把我这些年的技术成长路线,都沉淀到了我的知识星球:【Java突击队】 ,欢迎大家加入一起探讨和学习。 星球里面沉淀的干货越来越多,包含了:学习路线、系统设计、技术选型、踩坑分享、项目实战、源码解读、底层原理、高频面试题,…