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

508 lines
17 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* 2017-12-6 11:11:44 | 修改 木遥(微信: http://xjsdkgis.cn/weixin.html */
//模块:
xjsdk.widget.bindClass(xjsdk.widget.BaseWidget.extend({
options: {
//弹窗
view: {
type: "window",
url: "view.html",
windowOptions: {
width: 250,
position: {
"top": 50,
"right": 5,
"bottom": 5
}
}
},
},
drawControl: null,
//初始化[仅执行1次]
create: function () {
this.drawControl = new xjsdk.Draw(this.viewer, {
hasEdit: true
});
//事件监听
var that = this;
this.drawControl.on(xjsdk.draw.event.DrawCreated, function (e) {
// var entity = e.entity;
// if (entity._attribute.attr.id == null || entity._attribute.attr.id == "")
// entity._attribute.attr.id = (new Date()).format("MMddHHmmss");
if (that.viewWindow)
that.viewWindow.plotlist.plotEnd();
});
this.drawControl.on(xjsdk.draw.event.EditStart, function (e) {
var entity = e.entity;
that.startEditing(entity);
});
this.drawControl.on(xjsdk.draw.event.EditMovePoint, function (e) {
var entity = e.entity;
that.startEditing(entity);
});
this.drawControl.on(xjsdk.draw.event.EditRemovePoint, function (e) {
var entity = e.entity;
that.startEditing(entity);
});
this.drawControl.on(xjsdk.draw.event.EditStop, function (e) {
var entity = e.entity;
that.stopEditing(entity);
that.saveEntity(entity);
});
this.getList();
},
viewWindow: null,
//每个窗口创建完成后调用
winCreateOK: function (opt, result) {
this.viewWindow = result;
},
//激活插件
activate: function () {
this.drawControl.hasEdit(true);
this.drawControl.setVisible(true);
},
//释放插件
disable: function () {
this.viewWindow = null;
this.drawControl.stopDraw();
if (this.lastEditEntity) {
this.lastEditEntity._polyline.show = false;
this.lastEditEntity._attribute.style.show = false;
this.lastEditEntity = null;
}
this.drawControl.hasEdit(false);
this.drawControl.setVisible(false);
},
//开始标记
startDraw: function (defval) {
//编辑时只显示本身路线,其他路线隐藏
if (this.lastEditEntity) {
this.lastEditEntity._polyline.show = false;
this.lastEditEntity._attribute.style.show = false;
this.lastEditEntity = null;
}
//console.log(JSON.stringify(defval));
this.drawControl.startDraw(defval);
},
startEditingById: function (id) {
var entity = this.drawControl.getEntityById(id);
if (entity == null) return;
this.viewer.flyTo(entity);
this.drawControl.startEditing(entity);
},
lastEditEntity: null,
startEditing: function (entity) {
//编辑时只显示本身路线,其他路线隐藏
if (this.lastEditEntity) {
this.lastEditEntity._polyline.show = false;
this.lastEditEntity._attribute.style.show = false;
this.lastEditEntity = null;
}
this.lastEditEntity = entity;
entity._polyline.show = true;
entity._attribute.style.show = true;
var lonlats = this.drawControl.getCoordinates(entity);
this.viewWindow.plotEdit.startEditing(entity.attribute, lonlats);
},
stopEditing: function (layer) {
if (this.viewWindow)
this.viewWindow.plotEdit.stopEditing();
},
stopDraw: function () {
this.drawControl.stopDraw();
},
//更新图上的属性
updateAttr2map: function (attr) {
this.drawControl.updateAttribute(attr);
},
//更新图上的几何形状、坐标等
updateGeo2map: function (coords, withHeight) {
var positions = [];
if (withHeight) {
for (var i = 0; i < coords.length; i += 3) {
var point = Cesium.Cartesian3.fromDegrees(coords[i], coords[i + 1], coords[i + 2]);
positions.push(point);
}
} else {
for (var i = 0; i < coords.length; i += 2) {
var point = Cesium.Cartesian3.fromDegrees(coords[i], coords[i + 1], 0);
positions.push(point);
}
}
this.drawControl.setPositions(positions);
if (positions.length <= 3) {
this.centerCurrentEntity();
}
return positions;
},
centerCurrentEntity: function () {
var entity = this.drawControl.getCurrentEntity();
if (entity == null) return;
this.viewer.flyTo(entity);
},
//文件处理
getGeoJson: function () {
return this.drawControl.toGeoJSON();
},
jsonToLayer: function (json, isClear, isFly) {
if (json == null) return;
return this.drawControl.loadJson(json, {
clear: isClear,
flyTo: isFly
});
},
deleteAll: function () {
this.drawControl.deleteAll();
this.deleteAllData();
},
deleteEntity: function (id) {
var entity = this.drawControl.getEntityById(id);
if (entity == null) return;
this.delEntity(id);
this.drawControl.deleteEntity(entity);
},
deleteCurrentEntity: function () {
var entity = this.drawControl.getCurrentEntity();
if (entity == null) return;
this.delEntity(entity._attribute.attr.id);
this.drawControl.deleteEntity(entity);
},
hasEdit: function (val) {
this.drawControl.hasEdit(val);
},
//数据保存处理
storageName: "xjsdkgis_roam",
arrFlyTable: [],
getList: function () {
var that = this;
if (window.hasServer) {
//后台接口查询
sendAjax({
url: "v1/map/flyroute/list",
data: {
userId: haoutil.storage.get("userId")
},
type: "get",
dataType: "json",
contentType: "application/x-www-form-urlencoded",
success: function (result) {
for (var i = 0; i < result.length; i++) {
var geojson = JSON.parse(result[i].geojson);
geojson.id = result[i].id;
that.arrFlyTable.push(geojson);
}
var entities = that.showData(that.arrFlyTable);
if (that.viewWindow)
that.viewWindow.tableWork.loadData(that.arrFlyTable);
},
});
} else {
//本地缓存
var laststorage = haoutil.storage.get(this.storageName); //读取localStorage值
if (laststorage != null)
this.arrFlyTable = eval(laststorage);
if (this.arrFlyTable == null || this.arrFlyTable.length == 0) {
this.arrFlyTable = [];
var that = this;
$.getJSON(this.path + "data/fly.json", function (result) {
that.arrFlyTable = that.arrFlyTable.concat(result);
that.showData(that.arrFlyTable);
if (that.viewWindow)
that.viewWindow.tableWork.loadData(that.arrFlyTable);
});
} else {
this.showData(this.arrFlyTable);
if (this.viewWindow)
this.viewWindow.tableWork.loadData(this.arrFlyTable);
}
}
},
showData: function (arr) { //加载历史保存数据
var arrjson = [];
for (var i = 0; i < arr.length; i++) {
var item = arr[i];
if (item.properties.style) item.properties.style.show = false;
var json = {
type: "Feature",
properties: item.properties,
geometry: item.geometry
};
json.properties.attr.id = item.id;
json.properties.attr.name = item.name;
arrjson.push(json);
}
var entities = this.drawControl.loadJson({
type: "FeatureCollection",
features: arrjson
}, {
clear: true,
flyTo: false
});
return entities;
},
deleteAllData: function () {
this.arrFlyTable = [];
haoutil.storage.add(this.storageName, JSON.stringify(this.arrFlyTable));
if (this.isActivate && this.viewWindow != null)
this.viewWindow.tableWork.loadData(this.arrFlyTable);
},
isOnDraw: false,
delEntity: function (id) {
if (!id) {
this.isOnDraw = true; //绘制过程中删除
return;
};
this.drawControl.stopDraw();
if (window.hasServer) {
sendAjax({
url: "v1/map/flyroute/" + id,
type: "delete",
dataType: "json",
contentType: "application/json",
success: function (result) {
console.log("删除漫游路线成功,返回数据:" + JSON.stringify(result));
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("服务出错:" + XMLHttpRequest.statusText + ",代码 " + XMLHttpRequest.status);
},
});
}
for (var index = this.arrFlyTable.length - 1; index >= 0; index--) {
if (this.arrFlyTable[index].id == id) {
this.arrFlyTable.splice(index, 1);
break;
}
}
haoutil.storage.add(this.storageName, JSON.stringify(this.arrFlyTable));
if (this.isActivate && this.viewWindow != null)
this.viewWindow.tableWork.loadData(this.arrFlyTable);
},
saveEntity: function (entity) {
if (this.isOnDraw) { //绘制过程中删除
this.isOnDraw = false;
return;
}
var that = this;
var random = (new Date()).format("MMddHHmmss");
var noId = false;
if (entity._attribute.attr.id == null || entity._attribute.attr.id == "") {
noId = true;
entity._attribute.attr.id = random;
}
if (entity._attribute.attr.name == null || entity._attribute.attr.name == "")
entity._attribute.attr.name = '路线' + random;
var json = this.drawControl.toGeoJSON(entity);
if (json.geometry.coordinates.length < 2) { //路线点数小于2个
return;
}
var item = {
id: json.properties.attr.id,
name: json.properties.attr.name,
geometry: json.geometry,
properties: json.properties,
};
if (window.hasServer) {
//后台接口
//新增
item = JSON.stringify(item);
if (noId) {
sendAjax({
url: "v1/map/flyroute/add",
data: JSON.stringify({
name: entity._attribute.attr.name, //名称
geojson: item, //genjson
remark: entity._attribute.attr.remark, //备注
}),
type: "post",
dataType: "json",
contentType: "application/json",
success: function (data) {
entity._attribute.attr.id = data.id;
item = JSON.parse(item);
item.id = data.id; //同步table内标签的id
that.arrFlyTable.push(item);
if (that.isActivate && that.viewWindow != null)
that.viewWindow.tableWork.loadData(that.arrFlyTable);
}
});
} else {
//修改
sendAjax({
url: "v1/map/flyroute/update",
data: JSON.stringify({
name: entity._attribute.attr.name, //名称
geojson: item, //genjson
id: entity._attribute.attr.id,
remark: entity._attribute.attr.remark, //备注
}),
type: "post",
dataType: "json",
contentType: "application/json",
success: function (result) {
console.log("修改漫游成功,返回数据:" + JSON.stringify(result));
}
});
}
} else {
//保存到本地缓存
var isFind = false;
for (var index = this.arrFlyTable.length - 1; index >= 0; index--) {
if (this.arrFlyTable[index].id == item.id) {
isFind = true;
this.arrFlyTable[index] = item;
break;
}
}
if (!isFind)
this.arrFlyTable.push(item);
haoutil.storage.add(this.storageName, JSON.stringify(this.arrFlyTable));
if (this.isActivate && this.viewWindow != null)
this.viewWindow.tableWork.loadData(this.arrFlyTable);
}
},
toRoamFly: function (lineData) {
var data = this.getFormatData(lineData);
xjsdk.widget.activate({
uri: 'widgets/roamFly/widget.js',
data: data
});
},
saveForGeoJson: function (lineData) {
var data = this.getFormatData(lineData);
haoutil.file.downloadFile(data.name + ".json", JSON.stringify(data));
},
//保存为czml
saveForCzml: function (lineData) {
if (lineData.geometry.coordinates.length < 2) {
toastr.error('路线无坐标数据,无法生成!');
return;
}
var data = this.getFormatData(lineData);
var line = new xjsdk.FlyLine(this.viewer, data);
var czml = JSON.stringify(line.toCZML());
line.destroy();
haoutil.file.downloadFile(lineData.properties.attr.name + ".czml", czml);
},
//转为flyLine需要的参数格式
getFormatData: function (lineData) {
var attr = lineData.properties.attr;
var data = {
id: attr.id,
name: attr.name,
remark: attr.remark,
clockLoop: attr.clockLoop,
camera: {
type: attr.cameraType,
followedX: attr.followedX,
followedZ: attr.followedZ,
},
showGroundHeight: attr.showGroundHeight,
clampToGround: attr.clampToGround,
interpolation: attr.interpolation, //setInterpolationOptions插值
points: lineData.geometry.coordinates,
speed: lineData.properties.speed,
model: this.getModelCfg(attr.model),
};
if (attr.showLabel) {
data.label = {
show: true
};
}
if (attr.showLine) {
data.path = lineData.properties.style
data.path.show = true;
}
if (attr.showShadow) {
data.shadow = [{
show: true,
type: attr.shadowType
}]
}
return data;
},
getModelCfg: function (model) {
//漫游对象
switch (model) {
case "model_man": //行人模型
return {
show: true,
uri: serverURL_gltf + '/xjsdk/man/walk.gltf',
scale: 1,
minimumPixelSize: 30
};
break;
case "model_car": //汽车模型
return {
show: true,
uri: serverURL_gltf + '/xjsdk/qiche.gltf',
scale: 0.2,
minimumPixelSize: 50
};
break;
case "model_air": //民航飞机模型
return {
show: true,
uri: serverURL_gltf + '/xjsdk/feiji.glb',
scale: 0.1,
minimumPixelSize: 50
};
break;
case "model_zhanji": //军用飞机模型
return {
show: true,
uri: serverURL_gltf + '/xjsdk/zhanji.glb',
scale: 0.01,
minimumPixelSize: 50
};
break;
case "model_weixin": //卫星模型
return {
show: true,
uri: serverURL_gltf + '/xjsdk/weixin.gltf',
scale: 1,
minimumPixelSize: 100
};
break;
}
return {
show: false
};
}
}));