cesium实现多车辆按照轨迹移动

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

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

Cesium Sandcastle

        但是实际项目开发中,要求一次多个车辆运行,运行的轨迹不同,速度不同,且起点不在轨迹的两端……

(前提:觉的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
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值