bmh_cesium/public/widgets/queryRoute/widget.js
2025-03-10 07:23:50 +08:00

468 lines
17 KiB
JavaScript

//模块:
xjsdk.widget.bindClass(xjsdk.widget.BaseWidget.extend({
options: {
resources: [
"./lib/cesiumjs/plugins/class/GaodeRoute.js",//高德路径查询
"./lib/cesiumjs/plugins/class/GaodePOI.js" //高德poi查询
],
//弹窗
view: {
type: "window",
url: "view.html",
windowOptions: {
width: 350
}
},
},
//初始化[仅执行1次]
create: function () { },
viewWindow: null,
//每个窗口创建完成后调用
winCreateOK: function (opt, result) {
this.viewWindow = result;
},
//打开激活
gaodeRoute: null,
gaodePOI: null,
activate: function () {
this.gaodeRoute = new GaodeRoute();
this.gaodePOI = new GaodePOI();
},
//关闭释放
disable: function () {
this.gaodeRoute = null;
this.startLnglat = null;
this.endLnglat = null;
if (this.startPoint) {
this.viewer.xjsdk.draw.deleteEntity(this.startPoint);
this.viewer.entities.remove(this.startPoint);
this.startPoint = null;
}
if (this.endPoint) {
this.viewer.xjsdk.draw.deleteEntity(this.endPoint);
this.viewer.entities.remove(this.endPoint);
this.endPoint = null;
}
this.alreadyCompute = false;
this.gaodePOI = null;
this.gaodeRoute = null;
this.startLnglat = null;
this.startPoint = null;
this.endLnglat = null;
this.endPoint = null;
this.clearCoumpute();
},
//===========gaodePOI 通过输入名称选点 ============
queryPOI: function (text, type) {
if (!text || !type) return;
var arg = {};
arg.success = function (res) {
this.viewWindow.setHtmlInMCXD(res, type); //展示搜索结果
}
arg.error = function (msg) {
window.toastr.error(msg);
haoutil.loading.close();
}
arg.text = text;
if (this.gaodePOI) this.gaodePOI.queryText(arg);
},
//=======================起点===============================
//绘制起点
startLnglat: null,
startPoint: null,
drawStartPoint: function (callback) {
var that = this;
that.viewer.xjsdk.draw.startDraw({
type: "billboard",
style: {
image: this.path + "img/start.png"
},
success: function (entity) {
var currentTime = that.viewer.clock.currentTime;
var cartesian = entity.position.getValue(currentTime);
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));
if (callback) callback(jd + "," + wd);
that.startLnglat = [jd, wd];
if (that.startPoint) {
that.viewer.xjsdk.draw.deleteEntity(entity);
that.startPoint.position.setValue(cartesian);
} else {
that.startPoint = entity;
}
that.startCompute();
}
});
},
//输入起点坐标
inputStartPoint: function (jd, wd) {
if (!jd || !wd) return;
if (this.startPoint) {
this.viewer.xjsdk.draw.deleteEntity(this.startPoint);
this.viewer.entities.remove(this.startPoint);
}
this.startLnglat = [jd, wd];
var cartesian = Cesium.Cartesian3.fromDegrees(jd, wd);
var entity = this.viewer.entities.add({
position: cartesian,
billboard: {
image: this.path + "img/start.png",
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
scale: 1,
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
}
});
this.startPoint = entity;
this.locateByJWD({
jd: jd,
wd: wd
});
this.startCompute();
},
//查询起点坐标
queryStartPoint: function (text) {
if (!text) {
window.toastr.error("请输入查询条件!");
return;
}
this.queryPOI(text, "start");
},
//=======================终点===============================
//绘制终点
endPoint: null,
endLnglat: null,
drawEndPoint: function (callback) {
var that = this;
that.viewer.xjsdk.draw.startDraw({
type: "billboard",
style: {
image: this.path + "img/end.png"
},
success: function (entity) {
var currentTime = that.viewer.clock.currentTime;
var cartesian = entity.position.getValue(currentTime);
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));
if (callback) callback(jd + "," + wd);
that.endLnglat = [jd, wd];
if (that.endPoint) {
that.viewer.xjsdk.draw.deleteEntity(entity);
that.endPoint.position.setValue(cartesian);
} else {
that.endPoint = entity;
}
that.startCompute();
}
});
},
//输入终点坐标
inputEndPoint: function (jd, wd) {
if (!jd || !wd) return;
if (this.endPoint) {
this.viewer.xjsdk.draw.deleteEntity(this.endPoint);
this.viewer.entities.remove(this.endPoint);
}
this.endLnglat = [jd, wd];
var cartesian = Cesium.Cartesian3.fromDegrees(jd, wd);
var entity = this.viewer.entities.add({
position: cartesian,
billboard: {
image: this.path + "img/end.png",
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
scale: 1,
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
}
});
this.endPoint = entity;
this.locateByJWD({
jd: jd,
wd: wd
});
this.startCompute();
},
//查询终点坐标
queryEndPoint: function (text) {
if (!text) {
window.toastr.error("请输入查询条件!");
return;
}
this.queryPOI(text, "end");
},
//===================开始计算路线========================
//清除计算的结果
clearCoumpute: function () {
this.colorStep = 0;
//清除路线
for (var i = 0; i < this.routeArr.length; i++) {
var line = this.routeArr[i];
if (line) this.viewer.entities.remove(line);
}
this.routeArr = [];
this.viewWindow.clearRouteContent(); //清除页面搜索结果
//清除漫游的数组
for (var index = 0; index < this.flyLineArr.length; index++) {
var flyline = this.flyLineArr[index];
if (flyline) flyline.destroy();
}
this.flyLineArr = [];
//取消当前的视角跟随
this.removeTrack();
if (this.nowFline) {
this.nowFline.destroy();
this.nowFline = null;
}
$("#mapDH_speed").remove();
},
//开始计算
alreadyCompute: false, //是否已计算过
startCompute: function () {
if (!this.startLnglat || this.startLnglat.length == 0) return;
if (!this.endLnglat || this.endLnglat.length == 0) return;
if (this.alreadyCompute) { //清除上一次的计算结果
this.clearCoumpute();
}
//当两点存在时 自动计算
var that = this;
this.gaodeRoute.query({
type: 3,
points: [this.startLnglat, this.endLnglat],
extensions: "all",
strategy: 11,
success: function (data) {
that.alreadyCompute = true;
that.viewWindow.startCompute();
if (!data || data.paths.length < 1) return;
that.viewWindow.showRouteBox(true);
//添加速度控制面板
for (var i = 0; i < data.paths.length; i++) {
var line = that.addRouteLine(data.paths[i]);
if (!line) return;
that.routeArr.push(line);
//展示路径信息
that.viewWindow.showRouteInfo(line);
//计算漫游路线
that.computeFlyline(line);
}
}
});
},
//添加路径
//设置路线随机色
randomColor: [
new Cesium.Color.fromCssColorString("#eaf731").withAlpha(0.8),
new Cesium.Color.fromCssColorString("#57f72e").withAlpha(0.8),
new Cesium.Color.fromCssColorString("#2effd2").withAlpha(0.8),
new Cesium.Color.fromCssColorString("#cc6e26").withAlpha(0.8),
new Cesium.Color.fromCssColorString("#ff2ec7").withAlpha(0.8),
],
colorStep: 0,
routeArr: [], //保存路径
addRouteLine: function (path) {
var steps = path.steps;
var points = path.points;
if (!steps || steps.length < 1 || !points || points.length < 1) return;
if (this.colorStep > this.randomColor.length - 1) {
this.colorStep = 0;
}
var material = this.randomColor[this.colorStep]
var cartesians = xjsdk.pointconvert.lonlats2cartesians(points);
var line = this.viewer.entities.add({
polyline: {
positions: cartesians,
clampToGround: true,
material: material,
width: 3
}
});
line.attr = path;
this.colorStep++;
return line;
},
//============= 计算漫游路线 ======================
flyLineArr: [],
computeFlyline: function (line) {
if (!line || !line.attr) return;
var lnglats = line.attr.points;
var flydata = {
"name": "贴地路线",
"camera": { "type": "" },
"points": lnglats,
"speed": 200,
"model": {
"uri": serverURL_gltf + "/xjsdk/qiche.gltf",
"scale": 0.3,
"minimumPixelSize": 30,
"clampToGround":true,
"show": true,
}
};
var flyLine = new xjsdk.FlyLine(this.viewer, flydata);
flyLine.lineId = line.id;
this.flyLineArr.push(flyLine);
// var that = this;
// haoutil.loading.show("正在计算路径!");
// flyLine.clampToGround(function () { //异步计算完成贴地后再启动
// haoutil.loading.hide();
// flyLine.popup = {
// id: Number((new Date()).getTime() + "" + Number(Math.random() * 1000).toFixed(0)),
// anchor: [0, -20], //左右、上下的偏移像素值。
// timeRender: true, //实时更新html
// html: function () {
// var params = flyLine.timeinfo;
// if (!params) return "即将开始漫游";
// var html = '<div style="width:200px;">' +
// '总距离:' + haoutil.str.formatLength(flyLine.alllen) + '<br/>' +
// '总时间:' + haoutil.str.formatTime(flyLine.alltimes / viewer.clock.multiplier) + '<br/>' +
// '开始时间:' + Cesium.JulianDate.toDate(flyLine.startTime).format("yyyy-M-d HH:mm:ss") + '<br/>' +
// '剩余时间:' + haoutil.str.formatTime((flyLine.alltimes - params.time) / viewer.clock.multiplier) + '<br/>' +
// '剩余距离:' + haoutil.str.formatLength(flyLine.alllen - params.len) + ' <br/>' +
// '</div>';
// return html;
// }
// }
// });
},
getFlylineById: function (id) {
if (!id) return;
var flyline;
for (var index = 0; index < this.flyLineArr.length; index++) {
if (this.flyLineArr[index].lineId == id) {
flyline = this.flyLineArr[index];
break;
}
}
return flyline;
},
nowFline: null, //当前的漫游对象
roamOneById: function (id) {
var flyline;
for (var index = 0; index < this.flyLineArr.length; index++) {
this.flyLineArr[index].stop();
if (this.flyLineArr[index].lineId == id) {
flyline = this.flyLineArr[index];
}
}
this.nowFline = flyline;
this.viewer.xjsdk.popup.close();
this.viewer.xjsdk.popup.show(flyline, flyline.property);
var that = this;
flyline.start(function () {
that.reset();
if (that.cameraView) that.viewer.xjsdk.centerAt(that.cameraView);
});
},
//漫游自动结束 或点击 停止导航按钮 后,重置界面和操作
reset: function () {
//漫游结束 重置按钮 取消跟随
this.resetBtn();
this.removeTrack();
if (this.nowFline) {
this.nowFline.entity.show = false;
this.nowFline = null;
}
//重置速度面板
this.viewer.clock.multiplier = 1;
//还原线的高亮
this.highLightLine();
},
//重置按钮
resetBtn: function () {
this.viewWindow.resetButton();
this.viewer.xjsdk.popup.close();
},
//取消当前的视角跟随
removeTrack: function () {
if (this.nowFline) {
this.nowFline.updateStyle({
camera: {
type: ""
}
});
}
this.viewer.trackedEntity = undefined;
},
//==============开始导航===================
startDH: function (id, isGS) {
//导航前释放之前的所有导航操作
this.reset();
//检测视角跟随是否选中
//开始导航
if (!id) return;
this.roamOneById(id);
if (isGS) {
this.nowFline.updateStyle({ camera: { type: "gs" } });
}
},
//============开始视角跟随=============
startGS: function (id, ele) {
//判断当前点击的视角跟随的id 是否是已在导航时的id
if (this.nowFline) { //表示已开始漫游即已点击开始导航
if (this.nowFline.lineId == id) {
this.nowFline.updateStyle({ camera: { type: "gs" } });
} else {
window.toastr.error("当前路径无车辆运行!");
if (ele) ele.prop("checked", false);
return;
}
}
},
//==================其它方法=====================
highLightLine: function (id) {
var currentTime = this.viewer.clock.currentTime;
for (var i = 0; i < this.routeArr.length; i++) {
var nowLineMaterial = this.routeArr[i].polyline.material;
var rgba = nowLineMaterial.color.getValue(currentTime);
this.routeArr[i].polyline.material = new Cesium.Color(rgba.red, rgba.green, rgba.blue, 0.3);
this.routeArr[i].polyline.width = 3;
}
if (!id) return;
var entity = this.viewer.entities.getById(id);
var rgba3 = entity.polyline.material.color.valueOf();
entity.polyline.material = new Cesium.Color(rgba3.red, rgba3.green, rgba3.blue, 1);
entity.polyline.width = 5;
},
locateByJWD: function (obj) {
if (!obj || !obj.jd || !obj.wd) return;
var position = Cesium.Cartesian3.fromDegrees(obj.jd, obj.wd, obj.gd || 0);
var heading = Cesium.Math.toRadians(obj.heading || 0);
var pitch = Cesium.Math.toRadians(obj.pitch || -90);
var roll = Cesium.Math.toRadians(obj.roll || 0);
var hpr = new Cesium.HeadingPitchRange(heading, pitch, roll);
var bs = new Cesium.BoundingSphere(position, obj.cameraHeight || 2000);
this.viewer.camera.viewBoundingSphere(bs, hpr);
this.viewer.scene.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
},
getCameraView: function () {
this.cameraView = xjsdk.point.getCameraView(this.viewer, false);
},
setCameraView: function () {
if (this.cameraView) this.viewer.xjsdk.centerAt(this.cameraView);
},
resetSpeed: function (num) {
if (num == undefined) return;
this.viewer.clock.multiplier = num / 120;
}
}));