//第2步骤:撤离模拟 class Sgmn2Clmn { //========== 构造方法 ========== //创建一个模型编辑对象 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.lnglatArr_CL = []; this.indexCL = 1; this.isFXend = false; //路线是否分析完毕 this.isStart = false; //是否 已分析 this.updateCL = false; //分析之后 是否重新修改撤离点 } //========== 对外属性 ========== //撤离点数组 get points() { return this.lnglatArr_CL; } get flylines() { return this.flylineArr; } get state() { return this.isFXend; } //========== 方法 ========== startSelectCld(opts) { var that = this; this.graphicLayer.startDraw({ type: "billboard", style: { image: "img/marker/mark4.png", horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, }, success: function (graphic) { if (that.isStart) { //分析过之后 二次修改 that.clearRes(); that.updateCL = true; } var cartesian = graphic.positionShow; if (!cartesian) { return; } var html = "撤离点" + that.indexCL; graphic.name = html; graphic.bindTooltip(html, { anchor: [0, -10], //定义偏移像素值 [x, y] }); var isIn = false; if (opts.lastEllipseData) { isIn = that.isInEllipse(cartesian, opts.lastEllipseData.pt1, opts.lastEllipseData.pt2, opts.lastEllipseData.radiusX); } if (isIn) { haoutil.msg("不可选择事故影响范围内!"); graphic.remove(); return; } if (!isIn) { 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_CL) { that.lnglatArr_CL.push({ data: "", //绑定相关信息 lnglat: [data.x, data.y], graphic: graphic, }); } if (opts.callback) { opts.callback({ data: data, markerId: graphic.uuid, name: html, }); } } that.indexCL++; }, }); } //判断点是否在椭圆内 point 要判断的点 jd1 椭圆焦点1 jd2 椭圆焦点2 isInEllipse(position, jd1, jd2, a) { var pt1 = Cesium.Cartesian3.fromDegrees(jd1.x, jd1.y); var pt2 = Cesium.Cartesian3.fromDegrees(jd2.x, jd2.y); var len1 = Cesium.Cartesian3.distance(position, pt1); var len2 = Cesium.Cartesian3.distance(position, pt2); var isIn = true; if (len1 + len2 > 2 * a) { //不在椭圆内 isIn = false; } return isIn; } //开始激活(需求的参数通过opts传入) start(opts) { if (!opts) { return; } if (!this.updateCL && this.isStart) { //未修改撤离点 下一步 不用分析 opts.noComputeCallback(); return; } var lnglatArr_CL = this.lnglatArr_CL; var index = -1; var affectedPointArr = opts.affectedPointArr; var that = this; this.isStart = true; this.allRouteData = []; function compute() { index++; if (index < affectedPointArr.length) { console.log("计算完成撤离路线" + index); var arr = []; for (var step = 0; step < lnglatArr_CL.length; step++) { arr.push([affectedPointArr[index].lnglat, lnglatArr_CL[step].lnglat]); } that.isFXend = false; that.queryOnePointLine( { affectedPointData: affectedPointArr[index].data, //绑定起点信息 arr: arr, }, function () { compute(); } ); } else { that.isFXend = true; if (opts.callback) { //计算完路径信息后 供前端展示信息 opts.callback(that.allRouteData); } that.updateCL = 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.lnglatArr_CL = []; this.updateCL = false; this.resetAllLineStyle(); this.stopDraw(); } stopDraw() { if (this.graphicLayer) { this.graphicLayer.stopDraw(); } } //计算路线 queryOnePointLine(opt, callback) { var that = this; this.gaodeRoute.queryArr({ type: 3, points: opt.arr, success: function (data) { var item = that.gaodeRoute.getShortestPath(data); var line; var endPointData; if (item.index != -1) { endPointData = that.lnglatArr_CL[item.index].graphic; } //线的终点信息 if (item.lineData) { line = that.createLine(item.lineData, { startPointData: opt.affectedPointData, //线的起点信息 endPointData: endPointData, }); } //线的信息 if (line) { that.roamOnground(line, callback); } }, error: function (msg) { window.toastr.error(msg); }, }); } //构建路径线 createLine(item, opt) { if (!item) { return; } var lnglats = item.points; if (!lnglats || lnglats.length < 1) { return; } // var name = item.name || '--' var positions = mars3d.PointTrans.lonlats2cartesians(lnglats); // var time = haoutil.str.formatTime(item.allDuration || 0) // var distance = haoutil.str.formatLength(item.allDistance || 0) // 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; if (opt) { entity.startPointData = opt.startPointData; entity.endPointData = opt.endPointData; } this.allRouteData.push(entity); this.lineArr.push(entity); return entity; } //控制线的显示隐藏 showHideLineById(id, isShow) { if (!id) { return; } var flyline = this.getFlylineById(id); if (!flyline) { return; } flyline.line.isStart = isShow; //禁止其运动、 flyline.line.show = isShow; //隐藏车辆 var line = this.getLineById(id); if (line) { line.show = isShow; } } 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; } //高亮一条线 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 = 10; line.polyline.material = new mars3d.material.LineFlowMaterialProperty({ //动画线材质 color: Cesium.Color.fromCssColorString("#00ff00"), 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++) { let 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; } } } //获取漫游对象 getFlylineById(id) { if (!id) { return; } let flyline; for (let i = 0; i < this.flylineArr.length; i++) { let flyLine = this.flylineArr[i]; if (flyLine && flyLine.line.id == id) { flyline = flyLine; break; } } return flyline; } //漫游对应的车辆 roamOneById(id) { if (!id) { return; } var flyline = this.getFlylineById(id); this.stopAllRoam(); 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); line.isStart = true; 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(); } } } } } //更改播放速度 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_CL.length; i++) { if (id === this.lnglatArr_CL[i].graphic.uuid) { this.lnglatArr_CL[i].graphic.remove(); this.lnglatArr_CL.splice(i, 1); break; } } } //根据撤离点id 删除对应的线 及 flyline对象 removeLineAboutByPointId(id) { if (!id) { return; } if (this.lineArr.length > 0 || this.flylineArr.length > 0) { this.updateCL = true; //表示当前删除时 已经经过计算了 } var newLineArr = []; for (var k = 0; k < this.lineArr.length; k++) { if (this.lineArr[k].endPointData.id == id) { this.graphicLayer.dataSource.entities.remove(this.lineArr[k]); } else { newLineArr.push(this.lineArr[k]); } } this.lineArr = newLineArr; var newFlylineArr = []; for (var i = 0; i < this.flylineArr.length; i++) { if (id == this.flylineArr[i].line.endPointData.id) { if (this.flylineArr[i]) { this.flylineArr[i].destroy(); } } else { newFlylineArr.push(this.flylineArr[i]); } } this.flylineArr = newFlylineArr; } //获取漫游所需最长时间 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.allRouteData = []; this.graphicLayer.clear(); this.lnglatArr_CL = []; this.indexCL = 1; this.isFXend = false; //路线是否分析完毕 this.isStart = false; //是否 已分析 } }