Cesium路径回放

写项目时,有路径回放功能。但是网上资料有些不适用或者不全。写完之后想着放上来,共大家参考。
代码参考:
cesium实现飞行漫游
cesium轨迹回放,按路径飞行

核心代码:

  • 绘制轨迹线
 const handler = new this.Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
 const self = this;
        handler.setInputAction(function(event) {
            var earthPosition = self.viewer.scene.pickPosition(event.position);
            if (Cesium.defined(earthPosition)) {
                if (self.activeShapePoints.length === 0) {
                    self.floatingPoint = self.createPoint(earthPosition);
                    self.activeShapePoints.push(earthPosition);
                    var dynamicPositions = new Cesium.CallbackProperty(function() {
                        return self.activeShapePoints;
                    }, false);
                    self.activeShape = self.drawShape(dynamicPositions); //绘制动态图
                }
                self.activeShapePoints.push(earthPosition);
                self.createPoint(earthPosition);
            }
        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

        //鼠标移动
        handler.setInputAction(function(event) {
            if (Cesium.defined(self.floatingPoint)) {
                var newPosition = self.viewer.scene.pickPosition(event.endPosition);
                if (Cesium.defined(newPosition)) {
                    self.floatingPoint.position.setValue(newPosition);
                    self.activeShapePoints.pop();
                    self.activeShapePoints.push(newPosition);
                }
            }
        }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
        handler.setInputAction(function() {
            self.terminateShape();
        }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);

//绘制点
    createPoint(worldPosition) {
        var point = this.viewer.entities.add({
            position: worldPosition,
            point: {
                color: Cesium.Color.WHITE,
                pixelSize: 1
            }
        });
        return point;
    }
    //画线
    drawShape(positionData) {
        var shape;
        if (this.drawingMode === 'line') {
            shape = this.viewer.entities.add({
                polyline: {
                    positions: positionData,
                    clampToGround: true,
                    width: 3
                }
            });
            this.drawinLink.push(shape)
        }
        return shape;
    }

    terminateShape() {
        this.activeShapePoints.pop(); //去除最后一个动态点
        if (this.activeShapePoints.length) {
            this.marks = [];
            for (const position of this.activeShapePoints) {
                const latitude = this.toDegrees(Cesium.Cartographic.fromCartesian(position).latitude)
                const longitude = this.toDegrees(Cesium.Cartographic.fromCartesian(position).longitude)
                this.marks.push({
                    lat: latitude,
                    lng: longitude,
                    flytime: this.flytime,
                    height: 0
                })
            }
            this.drawShape(this.activeShapePoints); //绘制最终图
            this.startFly();
        }
        this.viewer.entities.remove(this.floatingPoint); //去除动态点图形(当前鼠标点)
        this.viewer.entities.remove(this.activeShape); //去除动态图形
        this.floatingPoint = undefined;
        this.activeShape = undefined;
        this.activeShapePoints = [];
    }

    drawShape(positionData) {
        var shape;
        if (this.drawingMode === 'line') {
            shape = this.viewer.entities.add({
                polyline: {
                    positions: positionData,
                    clampToGround: true,
                    width: 3
                }
            });
        }
        return shape;
    }

  • 模型按轨迹运动
          let planeModel = this.viewer.entities.add({
            // 和时间轴关联
            availability: new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({
                start: start,
                stop: stop
            })]),
            position: property,
            // 根据所提供的速度计算模型的朝向
            orientation: new Cesium.VelocityOrientationProperty(property),
            // 模型数据
            model: {
                uri: '../../static/CesiumAir/Cesium_Air.glb',
                minimumPixelSize: 128
            }
        });
  • 重点:脱离时间轴
    找了很多代码基本都是依靠Cesium的时间轴进行移动,但是写的时候遇到了问题,如果是多条线路,可能存在时间轴播放结束但是模型未移动到终点的情况。于是将路线对应的时间轴终点修改,不再统一使用一条时间轴,而是多条时间轴(页面不显示时间轴)。以解决每条路径长度不同移动时间不同的问题。
  computeFlight(source, start) {
        let property = new Cesium.SampledPositionProperty();
        let end = ""
        for (let i = 0; i < source.length; i++) {
            let time = Cesium.JulianDate.addSeconds(start, source[i].flytime*i*10, new Cesium.JulianDate);
            let position = Cesium.Cartesian3.fromDegrees(source[i].lng, source[i].lat, source[i]
            .height);
            // 添加位置,和时间对应
            property.addSample(time, position);
            if(i == source.length -1){
            //获取最后节点时间
                end = Cesium.JulianDate.addSeconds(start, source[i].flytime*i*10, new Cesium.JulianDate)
            }
        }
        return {
            property,end
        };
    }

// 设置始终停止时间
        this.viewer.clock.stopTime = stop.clone();

最后效果(删了点帧):


drawLine.gif
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容