TLE双行轨道数解析生成czml

1 篇文章 0 订阅
1 篇文章 0 订阅

参考代码:

本文章根据tle2czml插件改编:tle2czml

引用插件:

朱利安时间转换工具:julian

yarn add julian

js日期处理类库:momentjs

yarn add moment

satellite.js:satellite.js

yarn add satellite.js

啥也不说了,上代码,因为我只是代码搬运工:

const satellite = require('satellite.js')
const moment = require('moment')
const julian = require('julian')

exports const tleToCzml = (
	tleLine = [],
	sat_name = "czml name"
) => {
	let res = []; //result for position
	let satrec //Set satrec
	satrec = satellite.twoline2satrec(tleLine[0], tleLine[1]);
	
	//to go from RAD/DAY -> REV/DAY: rad * 1440 * 0.159155
	//to go from REV/PER DAY to MINS/REV -> 1440/RevPerDay
	let totalIntervalsInDay = satrec.no * 1440 * 0.159155; //1440 = min && 0.159155 = 1turn
	let minsPerInterval = 1440 / totalIntervalsInDay; // mins for 1 revolution around earth
	let intervalTime = moment(julian.toDate(satrec.jdsatepoch).toISOString()).toISOString()

	//set intervals 
	let initialTime = moment(julian.toDate(satrec.jdsatepoch).toISOString()).toISOString();//start date of TLE 
	let endTime = moment(julian.toDate(satrec.jdsatepoch).toISOString()).add(120, 'h').toISOString();; //add 120hours(5days)
	let leadIntervalArray = [];
	let trailIntervalArray = [];

	console.log("Setting intervals...");
	for (let i = 0; i <= 7200; i += minsPerInterval) {//7200===120hours===5days(which is our end time)
		if (i === 0) { // intial interval 
			intervalTime = moment(intervalTime).add(minsPerInterval, 'm').toISOString();
			let currentOrbitalInterval = {
				"interval": `${initialTime}/${intervalTime}`,
				"epoch": `${initialTime}`,
				"number": [
					0, minsPerInterval * 60,
					minsPerInterval * 60, 0
				]
			}
			let currTrail = {
				"interval": `${initialTime}/${intervalTime}`,
				"epoch": `${initialTime}`,
				"number": [
					0, 0,
					minsPerInterval * 60, minsPerInterval * 60
				]
			}
			leadIntervalArray.push(currentOrbitalInterval);
			trailIntervalArray.push(currTrail);
		}
		else {	//not initial so make intervals 
			let nextIntervalTime = moment(intervalTime).add(minsPerInterval, 'm').toISOString();
			let currentOrbitalInterval = {
				"interval": `${intervalTime}/${nextIntervalTime}`,
				"epoch": `${intervalTime}`,
				"number": [
					0, minsPerInterval * 60,
					minsPerInterval * 60, 0
				]
			}
			let currTrail = {
				"interval": `${intervalTime}/${nextIntervalTime}`,
				"epoch": `${intervalTime}`,
				"number": [
					0, 0,
					minsPerInterval * 60, minsPerInterval * 60
				]
			}
			intervalTime = moment(intervalTime).add(minsPerInterval, 'm').toISOString();
			leadIntervalArray.push(currentOrbitalInterval);
			trailIntervalArray.push(currTrail);
		}
	}
	let sec = 0;
	for (let i = 0; i <= 432000; i++) { //iterates every second (86400sec in 1day)
		satrec = satellite.twoline2satrec(tleLine[0], tleLine[1]);
		let positionAndVelocity = satellite.sgp4(satrec, i * 0.0166667); // 0.0166667min = 1sec
		let positionEci = positionAndVelocity.position;
		positionEci.x = positionEci.x * 1000;
		positionEci.y = positionEci.y * 1000;
		positionEci.z = positionEci.z * 1000;

		res.push(i, positionEci.x, positionEci.y, positionEci.z);
		sec += 900;
	}

	//set initial object start for czml
	let initialCZMLProps = [{
			"id": "document",
			"name": "CZML Point - Time Dynamic",
			"version": "1.0",
			"clock": {
				"interval": `${initialTime}/${endTime}`,
				"multiplier": 1,
				"range": "LOOP_STOP",
				"step": "SYSTEM_CLOCK"
			}
		},
	
		{
			"id": `${sat_name}`,
			"name": `${sat_name}`,
			"availability": `${initialTime}/${endTime}`,
			"description": "Insert the altitude here??",
			"label": {
				"fillColor": {
					"rgba": [
						255, 0, 255, 255
					]
				},
				"font": "11pt Lucida Console",
				"horizontalOrigin": "LEFT",
				"outlineColor": {
					"rgba": [
						0, 0, 0, 255
					]
				},
				"outlineWidth": 2,
				"pixelOffset": {
					"cartesian2": [
						12, 0
					]
				},
				"show": true,
				"style": "FILL_AND_OUTLINE",
				"text": `${sat_name}`,
				"verticalOrigin": "CENTER"
			},
			"path": {
				"show": [
					{
						"interval": `${initialTime}/${endTime}`,
						"boolean": true
					}
				],
				"width": 1,
				"material": {
					"solidColor": {
						"color": {
							"rgba": [
								255, 0, 255, 255
							]
						}
					}
				},
				"resolution": 120,
				"leadTime": leadIntervalArray,
				"trailTime": trailIntervalArray
			},
			"model":{
	            "show": true,
	            "gltf": "../../models/satg.gltf",
				//Animation(s).
				"minimumPixelSize": 99,
	        },
			"position": {
				"interpolationAlgorithm": "LAGRANGE",
				"interpolationDegree": 2,
				"referenceFrame": "INERTIAL",
				"epoch": `${initialTime}`,
				"cartesian": res
			}
		}
	]
	return initialCZMLProps;
}
// tle: tle双行轨道数,name:czml节点名称
const czml = tleToCzml(tle, name);
// 生成的czml可直接导入Cesium使用
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值