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