Cesium czml创建卫星轨迹 并模拟卫星扫描

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/caozl1132/article/details/86620777

最近一直在弄卫星轨迹的运动,并且模拟卫星扫描;

先晒个结果:

之前做了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 = 某个值  来达到目的,后来想了一下  可能是渲染机制的问题(纯属猜测),不信的朋友可以试下,是没效果的;

猜你喜欢

转载自blog.csdn.net/caozl1132/article/details/86620777