最近一直在弄卫星轨迹的运动,并且模拟卫星扫描;
先晒个结果:
之前做了sgp4模拟卫星轨道,但是那个真实性太差,通过sgp4生成的轨道是不动的,真实的情况下卫星的轨道也是运动的,所以一般来说还得通过czml来生成轨道展示卫星运动;
在未加载扫描功能之前,单独加载czml可以正常展示卫星的运动情况,但后续客户提出了加上扫描功能,以及计算卫星何时过境,在某个时间段内会有哪几颗卫星过境;
先说下大致的思路:其中如动图所示,扫描的样式是用cylinder做的,这个后续会再完善成波纹形状;主要还是运用了sampleproperty,将卫星运动的time和position也绑定到cylinder上,并且将cylinder的高度修改为卫星的一半;
以下是核心代码:
var property;
viewer.dataSources.add(Cesium.CzmlDataSource.load("../czml/GAOFEN1.czml")).then(function(dataSource) {
satellite = dataSource.entities.getById("Satellite/GAOFEN 1");
property = new Cesium.SampledPositionProperty();
for (var ind = 0; ind < 292; ind++) {
var time = Cesium.JulianDate.addSeconds(clock.currentTime, 300*ind, new Cesium.JulianDate());
var position = satellite.position.getValue(time);
var cartographic = ellipsoid.cartesianToCartographic(position);
var lat = Cesium.Math.toDegrees(cartographic.latitude),
lng = Cesium.Math.toDegrees(cartographic.longitude),
hei = cartographic.height / 1.9;
property.addSample(time, Cesium.Cartesian3.fromDegrees(lng, lat, hei));
}
cylinderEntity.position = property;
cylinderEntity.position.setInterpolationOptions({ //设定位置的插值算法
interpolationDegree: 5,
interpolationAlgorithm: Cesium.LagrangePolynomialApproximation
});
viewer.clock.onTick.addEventListener(function(clock) {
if (property) {
var time = clock.currentTime;
var val = property.getValue(clock.currentTime);
console.log(val);
}
});
});
demo连接:https://download.csdn.net/download/caozl1132/10993203
ps:之前想通过clock的ontick事件,然后监听卫星的位置再改变cylinder的位置,后来发现没法在这个ontick里面通过cylinderEntity.position = 某个值 来达到目的,后来想了一下 可能是渲染机制的问题(纯属猜测),不信的朋友可以试下,是没效果的;