//第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 + '<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;
|
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; //是否 已分析
|
}
|
}
|