使用 cesiumjs 时钟更新和动画卫星位置

问题描述

我正在尝试使用来自 norAD 的 tls 数据创建 3d 地图以创建卫星跟踪器。目前我能够为每颗卫星生成正确的坐标,我目前用红点表示它们。我希望点的位置实时移动。目前,我正在查看 cesiumjs 公开的时钟文档,在 clock.tick 事件中,我每秒收到许多事件,这不是我所期望的。可能与浏览器的帧率有关。每当我向 viewer.clockviewmodel.Clock.tick 添加事件侦听器时,我的应用程序变得越来越慢,最终变得无响应,因此这不是一个好的选择。我正在阅读文档,我看到 Clockviewmodel 数据类型包含一个名为 currentTime 的属性,根据文档是:Gets or sets the current time. See Clock#currentTIme. This property is observable 通过 observable 是否意味着每当此属性更新时,我可以调用一些功能来更新卫星的位置还是我吠错了树?这是我的代码

Globe.js:用于设置铯查看器


// The URL on your server where CesiumJS's static files are hosted.
window.CESIUM_BASE_URL = '/';

import * as Cesium from 'cesium';


// Initialize the Cesium Viewer in the HTML element with the "cesiumContainer" ID.
const viewer = new Cesium.Viewer('cesiumContainer',{
  terrainProvider: Cesium.createWorldTerrain()
});    


export {viewer}

trackSats.js:用于获取卫星数据

const axios = require('axios')
const chunk = require('lodash/chunk')
const satellite = require('satellite.js')

async function trackSats()
{
    var satData = await axios.get("./satdata");
    satData = satData.data.split("\r\n")
    
    satData = chunk(satData,3)

    var satRecs = new Array();

    satData.forEach((sat)=>{

        try
        {
        satRec = satellite.twoline2satrec(sat[1],sat[2]);

        satRecs.push({"name": sat[0],satRec})
        }
        catch(err)
        {
            //console.log(err)
        }

        
    })


    return satRecs;
}

module.exports = trackSats;

index.js:完成大部分繁重工作的地方,也是 webpack 的入口

const trackSats = require('./trackSats')
const {viewer} = require('./globe.js')
import * as Cesium from 'cesium';
const satellite = require('satellite.js')


trackSats().then(sats=>{
    console.log(sats)

    
    sats.forEach(sat=>{
        globeSetup(sat)
    })

    
    

}).catch(err=>{
    console.log("Couldn't get sat data")
    console.log(err)
});



function globeSetup(sat){
    const date = new Date();
    var gsTime = satellite.gstime(date)
    var positionAndVeLocity = satellite.propagate(sat.satRec,new Date())

    var position = satellite.eciToGeodetic(positionAndVeLocity.position,gsTime)
    
    position.latitude = satellite.degreesLat(position.latitude);
    position.longitude = satellite.degreesLong(position.longitude)
    position.height *= 1000
    

    const pointEntity = viewer.entities.add({
        description: sat.name,position: Cesium.Cartesian3.fromdegrees(position.longitude,position.latitude,position.height),point: {pixelSize: 5,color: Cesium.Color.RED}
    })

    
}

我还使用一个简单的 express 应用程序来为 ./dist 文件夹提供服务,并将请求转发到 https://www.celestrak.com/NORAD/elements/active.txt,因为原始数据没有 cors 标头,所以我必须转发请求

如您所见,我希望能够创建某种函数,该函数可以更新每个卫星的关联 pointEntity 并在每次时钟前进一秒或任何其他时间间隔时用它更新坐标。任何帮助将不胜感激。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)