常见轨迹数据有车辆和飞机轨迹,车辆一般只考虑二维信息,飞机则要加入高程信息。本篇博客先以车辆轨迹为例。(本博客参考法克鸡丝博客https://www.cnblogs.com/fuckgiser/p/5706842.html,这里表示特别感谢!)
我拿到的车辆轨迹如图所示,其中3、4列分别表示XY坐标,是WGS84-UTM投影坐标,需要转为WGS84坐标,方法我在另一篇博客介绍了,这里不再赘述。第一列是车辆编号,第二列是该车辆下的轨迹段。
整体思路是这样以每辆车辆的每段轨迹段为单位,将每段数据每个点加到Entity,用billboard表示,然后设置每个点的显示,形成流动效果。要注意的NameID每段轨迹都应该从0开始,否则所有轨迹不会同时流动。核心代码如下:
var animationObj = {
stepsRange: {
start: 0,
end: 100
},
trails: 20,
duration: 75
};
var _range = animationObj.stepsRange.end - animationObj.stepsRange.start;
var entity = viewer.entities.add({
position : Cesium.Cartesian3.fromDegrees(x,y,h),
nameID:nameid,
billboard :{
image : 'c2.png',
width:7,
height:7,
color : color
}
});
entity.isAvailable = function(obj){
return function(currentTime){
if (!Cesium.defined(currentTime)) {
throw new Cesium.DeveloperError('time is required.');
}
var nMS = Cesium.JulianDate.toDate(currentTime).getTime()/animationObj.duration;
var time = (nMS%_range + animationObj.stepsRange.start);
var trails = trails || 10;
if (time && obj.nameID > time - trails && obj.nameID < time) {
obj.billboard.color._value.alpha = 0.8*(obj.nameID - time + trails)/trails;
return true;
} else {
return false;
}
}
}(entity);