//第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();
}
}
}