//第3步骤:救援模拟 class Sgmn3Jymn { //========== 构造方法 ========== //创建一个模型编辑对象 constructor(map, options) { this.map = map; this.gaodeRoute = new mars3d.query.GaodeRoute({ // key: ['ae29a37307840c7ae4a785ac905927e0'], }); this.allRouteData = []; this.flylineArr = []; this.lineArr = []; this.graphicLayer = new mars3d.layer.GraphicLayer({ hasEdit: false, }); map.addLayer(this.graphicLayer); this.isStart = false; this.markerArr_JY = []; this.lnglatArr_JY = []; this.index_JY = 1; this.updateJY = false; } //========== 对外属性 ========== //救援点数组 get points() { return this.lnglatArr_JY; } get flylines() { return this.flylineArr; } //========== 方法 ========== startSelectJyd(opts) { var that = this; this.graphicLayer.startDraw({ type: "billboard", style: { image: "img/marker/mark3.png", horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, }, success: function (graphic) { var cartesian = graphic.positionShow; if (!cartesian) { return; } var html = "救援点" + that.index_JY; graphic.name = html; graphic.bindTooltip(html, { anchor: [0, -10], //定义偏移像素值 [x, y] }); that.markerArr_JY.push(graphic); var cartographic = Cesium.Cartographic.fromCartesian(cartesian); var jd = Number(Cesium.Math.toDegrees(cartographic.longitude).toFixed(6)); var wd = Number(Cesium.Math.toDegrees(cartographic.latitude).toFixed(6)); var height = Number(cartographic.height.toFixed(1)); var data = { x: jd, y: wd, z: height, }; if (that.lnglatArr_JY) { that.lnglatArr_JY.push({ data: "", //绑定相关信息 lnglat: [data.x, data.y], graphic: graphic, }); } if (that.isStart) { //分析过之后 二次修改 that.clearRes(); that.updateJY = true; } if (opts.callback) { opts.callback({ data: data, markerId: graphic.uuid, name: html, }); } that.index_JY++; }, }); } //开始激活(需求的参数通过opts传入) start(opts) { if (!opts) { return; } if (!this.updateJY && this.isStart) { //未修改撤离点 下一步 不用分析 opts.noComputeCallback(); return; } var incidentLnglat = opts.incidentLnglat; var lnglatArr_JY = this.lnglatArr_JY; this.isStart = true; var index = -1; var that = this; this.allRouteData = []; function compute() { index++; if (index < lnglatArr_JY.length) { that.gaodeRoute.query({ type: 3, points: [lnglatArr_JY[index].lnglat, incidentLnglat], success: function (data) { var line = that.createLine(data.paths[0], { startPointData: lnglatArr_JY[index].graphic, }); if (line) { that.roamOnground(line, function () { compute(); }); } }, error: function (msg) { window.toastr.error(msg); compute(); }, }); } else { if (opts.callback) { opts.callback(that.allRouteData); } //计算完路径信息后 供前端展示信息 that.updateJY = false; } } compute(); } //清除结果 clearRes() { this.allRouteData = []; for (var i = 0; i < this.flylineArr.length; i++) { if (this.flylineArr[i]) { this.flylineArr[i].destroy(); } } this.flylineArr = []; for (var k = 0; k < this.lineArr.length; k++) { if (this.lineArr[k]) { this.graphicLayer.dataSource.entities.remove(this.lineArr[k]); } } this.lineArr = []; this.updateJY = false; this.stopDraw(); //this.lnglatArr_JY = []; } //构建路径线 createLine(item, opt) { if (!item) { return; } var lnglats = item.points; var startPointData = opt.startPointData; if (!lnglats || lnglats.length < 1) { return; } // var name = item.name || '--' var positions = mars3d.PointTrans.lonlats2cartesians(lnglats); // var time = haoutil.str.formatTime(item.allDuration) // var distance = haoutil.str.formatLength(item.allDistance) // var html = '目的地:' + name + '
总距离:' + distance + '
所需时间:' + time + '' var entity = this.graphicLayer.dataSource.entities.add({ polyline: { positions: positions, clampToGround: true, material: Cesium.Color.fromRandom({ alpha: 0.7, }), width: 4, }, // popup: html }); entity.lineData = item; entity.polyline.material_old = entity.polyline.material; entity.startPointData = startPointData; this.allRouteData.push(entity); this.lineArr.push(entity); return entity; } getLineById(id) { if (!id) { return; } var line; for (var i = 0; i < this.lineArr.length; i++) { if (this.lineArr[i].id == id) { line = this.lineArr[i]; break; } } return line; } //获取漫游对象 getFlylineById(id) { if (!id) { return; } var flyline; for (var i = 0; i < this.flylineArr.length; i++) { var flyLine = this.flylineArr[i]; if (flyLine.line.id == id) { flyline = flyLine; break; } } return flyline; } //漫游对应的车辆 roamOneById(id) { if (!id) { return; } var flyline = this.getFlylineById(id); this.stopAllRoam(); if (flyline) { flyline.start(); } } //漫游多个车辆 roamArrByIds(ids) { if (!ids || ids.length == 0) { return; } this.stopAllRoam(); for (var i = 0; i < ids.length; i++) { var flyline = this.getFlylineById(ids[i]); if (flyline) { flyline.start(); } } } //对应车辆停止漫游 stopRoamArrByIds(ids) { if (!ids || ids.length == 0) { return; } this.stopAllRoam(); for (var i = 0; i < ids.length; i++) { var flyline = this.getFlylineById(ids[i]); if (flyline) { flyline.stop(); } } } //停止所有车辆的漫游 stopAllRoam() { for (var i = 0; i < this.flylineArr.length; i++) { var flyLine = this.flylineArr[i]; if (flyLine) { flyLine.stop(); } } } //撤离漫游动画 roamOnground(line, callback) { if (!line) { return; } var posi = line.polyline.positions.getValue(); if (!posi) { return; } // var that = this var lnglats = mars3d.PointTrans.cartesians2lonlats(posi); var flydata = { id: Number(new Date().getTime() + "" + Number(Math.random() * 1000).toFixed(0)), name: line.startPointData._name || "-- ", camera: { type: "", followedX: 50, followedZ: 10, }, positions: lnglats, speed: 120, model: { show: true, uri: "//data.mars3d.cn/gltf/mars/qiche.gltf", scale: 0.3, minimumPixelSize: 30, clampToGround: true, }, }; let flyLine = new mars3d.graphic.RoamLine(flydata); this.graphicLayer.addGraphic(flyLine); flyLine.line = line; this.flylineArr.push(flyLine); if (callback) { callback(); } } //播放动画 playFlyline(arr) { for (var i = 0; i < arr.length; i++) { for (var j = 0; j < this.flylineArr.length; j++) { if (arr[i] == this.flylineArr[j].line.id) { if (this.flylineArr[j]) { this.flylineArr[j].start(); } } } } } //停止动画 stopFlyline(arr) { for (var i = 0; i < arr.length; i++) { for (var j = 0; j < this.flylineArr.length; j++) { if (arr[i] == this.flylineArr[j].line.id) { if (this.flylineArr[j]) { this.flylineArr[j].stop(); } } } } } //更改播放速度 updatePlaySpeed(speed) { if (!speed) { return; } var scale = speed / 120; this.map.clock.multiplier = scale || 1; } //根据id删除对应的撤离点 removePointById(id) { if (!id) { return; } for (var i = 0; i < this.lnglatArr_JY.length; i++) { if (id === this.lnglatArr_JY[i].graphic.uuid) { if (this.lnglatArr_JY[i].graphic) { this.lnglatArr_JY[i].graphic.remove(); } this.lnglatArr_JY.splice(i, 1); break; } } } //根据撤离点id 删除对应的线 及 flyline对象 removeLineAboutByPointId(id) { if (!id) { return; } if (this.lineArr.length > 0 || this.flylineArr.length > 0) { this.updateJY = true; //表示当前删除时 已经经过计算了 } var newLineArr = []; for (var k = 0; k < this.lineArr.length; k++) { if (this.lineArr[k].startPointData.id == id) { if (this.lineArr[k]) { this.graphicLayer.dataSource.entities.remove(this.lineArr[k]); } } else { if (this.lineArr[k]) { newLineArr.push(this.lineArr[k]); } } } this.lineArr = newLineArr; var newFlylineArr = []; for (var i = 0; i < this.flylineArr.length; i++) { if (this.flylineArr[i].line && id == this.flylineArr[i].line.startPointData.id) { this.flylineArr[i].destroy(); } else { newFlylineArr.push(this.flylineArr[i]); } } this.flylineArr = newFlylineArr; } //控制线的显示隐藏 showHideLineById(id, isShow) { if (!id) { return; } var flyline = this.getFlylineById(id); flyline.line.isStart = isShow; //禁止其运动、 flyline.line.show = isShow; //隐藏车辆 for (var i = 0; i < this.lineArr.length; i++) { if (this.lineArr[i] && this.lineArr[i].id == id) { this.lineArr[i].show = isShow; break; } } } //高亮一条线 hightOneLineById(id) { if (!id) { return; } this.resetAllLineStyle(); var line = this.getLineById(id); if (!line) { return; } // var rgba = line.polyline.material.color.getValue() //line.polyline.material = new Cesium.Color(rgba.red, rgba.green, rgba.blue, 1); line.polyline.material_bak = line.polyline.material; line.polyline.width = 12; line.polyline.material = new mars3d.material.LineFlowMaterialProperty({ //动画线材质 color: Cesium.Color.CYAN, duration: 10000, //时长,控制速度 url: "../../img/textures/LinkPulse.png", }); } //还原所有线的样式 resetAllLineStyle() { for (var i = 0; i < this.lineArr.length; i++) { var line = this.lineArr[i]; if (line && line.polyline.material_bak) { line.polyline.material = line.polyline.material_bak; line.polyline.width = 4; } } } showHideAllLine(isShow) { for (let i = 0; i < this.flylineArr.length; i++) { var flyLine = this.flylineArr[i]; if (flyLine) { flyLine.line.isStart = isShow; //禁止其运动、 flyLine.line.show = isShow; //隐藏车辆 } } for (let i = 0; i < this.lineArr.length; i++) { if (this.lineArr[i]) { this.lineArr[i].show = isShow; } } } //获取漫游所需最长时间 getMaxFlylineTime() { var maxTime = Number.MIN_VALUE; for (var j = 0; j < this.flylineArr.length; j++) { var times = this.flylineArr[j].alltimes; if (times >= maxTime) { maxTime = times; } } return maxTime; } //清除全部 clearAll() { this.clearRes(); this.markerArr_JY = []; this.lnglatArr_JY = []; this.allRouteData = []; this.graphicLayer.clear(); } //移除绑定 stopDraw() { if (this.graphicLayer) { this.graphicLayer.stopDraw(); } } }