Javascript 使用cesiumjs时钟更新卫星位置并设置其动画

Javascript 使用cesiumjs时钟更新卫星位置并设置其动画,javascript,cesium,satellite,Javascript,Cesium,Satellite,我正在尝试使用NORAD的tls数据创建一个3d地图,以创建一个卫星跟踪器。目前,我能够为每颗卫星生成正确的坐标,我现在用一个红点表示它们。我想让点的位置实时移动。目前,我正在查看cesiumjs公开的时钟文档以及clock.tick事件。我每秒收到的事件很多,这不是我所期望的。它可能与浏览器的帧速率有关。每当我将事件侦听器添加到viewer.clockViewModel.Clock.tick时,我的应用程序就会变得越来越慢,最终变得没有响应,所以这不是一个好的选择。我正在阅读文档,我看到Clo

我正在尝试使用NORAD的tls数据创建一个3d地图,以创建一个卫星跟踪器。目前,我能够为每颗卫星生成正确的坐标,我现在用一个红点表示它们。我想让点的位置实时移动。目前,我正在查看cesiumjs公开的时钟文档以及clock.tick事件。我每秒收到的事件很多,这不是我所期望的。它可能与浏览器的帧速率有关。每当我将事件侦听器添加到
viewer.clockViewModel.Clock.tick
时,我的应用程序就会变得越来越慢,最终变得没有响应,所以这不是一个好的选择。我正在阅读文档,我看到
ClockViewModel
数据类型包含一个名为currentTime的属性,根据文档,
获取或设置当前时间。请参阅时钟#当前时间。此属性是可观察的
可观察的,这是否意味着每当更新此属性时,我都可以调用某些函数来更新卫星的位置,还是我选错了树?这是我的密码

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:完成大部分繁重工作的地方和网页的入口点

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文件夹提供服务,并将请求转发到,因为原始数据没有cors头,所以我必须转发请求


如你所见,我希望能够创建某种函数,可以更新每个卫星的相关点实体,并在时钟每前进一秒或任何其他间隔时更新坐标。任何帮助都将不胜感激。

看起来我在看a/b问题。事实证明,以30hz或60hz的频率轮询viewer.clock比按滴答声轮询要好得多,因为这样会导致性能问题。现在,按需计算每颗卫星的位置计算量太大,可能会减慢程序的速度。我想设置采样位置属性以缓解性能问题