//第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 + '<br/>总距离:' + distance + '<br/>所需时间:' + 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();
|
}
|
}
|
}
|