车辆按照轨迹进行移动,按照cesium官方例子使用timeLine很容易实现出来,如下官网例子

但是实际项目开发中,要求一次多个车辆运行,运行的轨迹不同,速度不同,且起点不在轨迹的两端……
(前提:觉的timeline方式车辆运行的效果很好,所以是在这个的基础上想的办法)
最后效果:
思路如下:
(1)多个车辆运行,且运行的轨迹不同,速度不同
单个车辆运行时,就是车辆整个运行时间为clock的开始时间和结束时间,循环执行时候以保证车辆跑完整个轨迹,来来回回的跑,但是多个车辆,速度不同,轨迹总长度不同。
尝试1:算出所有车辆每个运行总时长,找到最大的,以这个时间为clock的开始时间和结束时间
问题:时间最长的的确可以循环跑,但是时间短的,跑完就模型消失了,只能等到下次时间循环再出来跑,肯定是不行的
尝试2:由于对cesium也是初学,想着能不能有多个clock,每个车辆自己有自己的clock,这样就循环自己的啊
问题:貌似不能,找了好多久没有设置多个clock的资料,小白实在无能为力,只能放弃了……(若有知道怎么设置多个clock的,求告知!!!感谢!!!)
尝试3:最后还是在第一种方法的基础上,找到最长运行时间,其他运行时间短的车辆,就不是一个entity了,按照时间叠加,超出时间无所谓,反正到时间了也消失了……
主要代码如下
…………var maxTimeLine -->一系列操作找到的最大的timeLine
var extraLineList = [] //为了保证短时间车辆一直跑,多加出来的timeLine 最终要的就是这个数据
//小于maxTimeLine的timeLine集合循环 添加多个短实体
tempLineList.filter(item=>item.timeLine!=maxTimeLine).forEach(line=> {
//临时运行结束时间(用于和最大时间判断)
var tempTime = line[line.length-1].time
var tempList = []
//stop 为maxTimeLine的时间 也是clock的停止时间
while(Cesium.JulianDate.secondsDifference(tempTime,stop)<0){
var extraLine = getExtraRouteTimeData(line,20,tempTime)
tempList.push(extraLine)
tempTime = extraLine[extraLine.length-1].time
}
extraLineList.push(tempList)
});
function getExtraRouteTimeData(tempLine,speed,startTime){
var finalData = []
//整理数据根据速度求出时间
for(var i=0;i<tempLine.length;i++)
{
if(i==0){
var temp = {
lon:tempLine[i].lon,
lat:tempLine[i].lat,
height:0,
time:startTime
}
finalData.push(temp)
}else{
var distanceValue = getDistance([tempLine[i-1].lon,tempLine[i-1].lat],[tempLine[i].lon,tempLine[i].lat])//应该是米
var interval = distanceValue/(speed/3.6)*10//缓冲速度 找到在界面上运行最好看的
const stop = Cesium.JulianDate.addSeconds(finalData[i-1].time,interval,new Cesium.JulianDate());
var temp = {
lon:tempLine[i].lon,
lat:tempLine[i].lat,
height:0,
time:stop
}
finalData.push(temp)
}
}
return finalData
}
(2)车辆运行起点不同,不在轨迹的两端(基本肯定在轨迹上)
这种就是在把轨迹,按照车辆的初始位置,拆成两段,之后先加后半段,再加前半段,短轨迹的按照上面的方法,在循环,也是先后半段再前半段的逻辑。
但是这样遇到一个新的问题,车辆起始点是在轨迹上,但是不一定是轨迹的折点啊,那我要如何将轨迹拆成,【轨迹起点--车辆起始点】【车辆起始点--轨迹终端】两段呢??
问题一个接着一个……
对cesium真的不了解,也不知道有啥函数方法,绞尽脑汁只能用笨方法了,先找到与车辆起始点最近的折点,再求车辆起始点与【最近折点--(最近折点-1)]】和【最近折点--(最近折点+1)]】的垂直距离,哪个等于0车辆起始点就在哪段,都为0那很巧车辆起始点就是轨迹的折点,最后整理除两个轨迹【轨迹起点--车辆起始点】【车辆起始点--轨迹终端】
最后所有的代码汇总如下:
//调用方法
function carMoveFun(){
var tempLineList = []
//最短那个
var line2 = [
[111.5203687977757

本文介绍如何在Cesium中实现多个车辆按照不同轨迹和速度移动,并解决车辆从轨迹任意点开始的问题。通过循环和时间轴调整确保车辆连续运行。
最低0.47元/天 解锁文章
1030





