Lin_Ye_Fang_Huo/public/widgets/plot/js/vew.work.js

635 lines
17 KiB
JavaScript

"use script"; //开发环境建议开启严格模式
//对应widget.js中MyWidget实例化后的对象
var thisWidget;
//当前页面业务
function initWidgetView(_thisWidget) {
thisWidget = _thisWidget;
//清除所有标号
$("#btn_plot_delall").click(function () {
thisWidget.deleteAll();
// tab2plot()
});
$("#btn_plot_end").click(function (e) {
thisWidget.endDraw();
});
$("#btn_plot_socket").click(function (e) {
thisWidget.socketConfig();
});
//是否可以编辑
var isedit = true;
$("#btn_plot_isedit").click(function () {
isedit = !isedit;
if (isedit) {
$(this).removeClass("active");
$(this).children().removeClass("fa-lock").addClass("fa-unlock");
} else {
$(this).addClass("active");
$(this).children().removeClass("fa-unlock").addClass("fa-lock");
}
thisWidget.hasEdit(isedit);
});
var isPopup = false;
$("#btn_plot_ispopup").click(function () {
isPopup = !isPopup;
if (isPopup) {
$(this).removeClass("active");
$(this).children().removeClass("fa-file-text").addClass("fa-file-text-o");
} else {
$(this).addClass("active");
$(this).children().removeClass("fa-file-text-o").addClass("fa-file-text");
}
thisWidget.hasPopup(isPopup);
});
plotFile.initEvent();
plotlist.bindSelList();
treeWork.initEvent();
}
//文件处理
var plotFile = {
initEvent: function () {
var that = this;
$("#btn_plot_openfile").click(function () {
that.openPlotFile({ clear: true });
});
$("#btn_plot_openfile2").click(function () {
that.openPlotFile({ clear: false });
});
$("#btn_plot_savefile").click(function () {
thisWidget.downloadJson("标绘");
});
$("#input_plot_file").change(function (e) {
var file = this.files[0];
var fileName = file.name;
var fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length).toLowerCase();
that.loadJsonOptions.symbol = null;
if (fileType == "json" || fileType == "geojson") {
let reader = new FileReader();
reader.readAsText(file, "UTF-8");
reader.onloadend = function (e) {
let json = this.result;
thisWidget.loadGeoJSON(json, that.loadJsonOptions);
that.clearPlotFile();
};
} else if (fileType == "kml") {
let reader = new FileReader();
reader.readAsText(file, "UTF-8");
reader.onloadend = function (e) {
let strkml = this.result;
parent.kgUtil.toGeoJSON(strkml).then((geojoson) => {
console.log("kml2geojson", geojoson);
that.loadJsonOptions.symbol = that.kmlDefSymbol;
thisWidget.loadGeoJSON(geojoson, that.loadJsonOptions);
});
that.clearPlotFile();
};
} else if (fileType == "kmz") {
//加载input文件控件的二进制流
parent.kgUtil.toGeoJSON(file).then((geojoson) => {
console.log("kmz2geojson", geojoson);
that.loadJsonOptions.symbol = that.kmlDefSymbol;
thisWidget.loadGeoJSON(geojoson, that.loadJsonOptions);
that.clearPlotFile();
});
} else {
toastr.error("暂不支持 " + fileType + " 文件类型的数据!");
that.clearPlotFile();
}
});
},
openPlotFile: function (options) {
this.loadJsonOptions = options;
this.loadJsonOptions.flyTo = true;
$("#input_plot_file").click();
},
clearPlotFile: function () {
if (!window.addEventListener) {
document.getElementById("input_plot_file").outerHTML += ""; //IE
} else {
document.getElementById("input_plot_file").value = ""; //FF
}
},
//kml的默认样式处理
kmlDefSymbol: function (attr, style, featue) {
style.clampToGround = true; //贴地
let geoType = featue.geometry?.type;
if (geoType == "Point") {
return {
image: "img/marker/di3.png",
verticalOrigin: 1,
scale: 0.4,
clampToGround: true,
label: {
text: attr.name,
font_size: 18,
color: "#ffffff",
outline: true,
outlineColor: "#000000",
pixelOffsetY: -20,
scaleByDistance: true,
scaleByDistance_far: 990000,
scaleByDistance_farValue: 0.3,
scaleByDistance_near: 10000,
scaleByDistance_nearValue: 1,
},
};
}
return style;
},
};
//标号列表相关
var plotlist = {
//绑定标号列表切换下拉框
bindSelList: function () {
var that = this;
var $sel_plot_list = $("#sel_plot_list");
$.getJSON("config/plotlist.json", function (plotlist) {
var inhtml = "";
var defval;
var count = 0;
for (var i in plotlist) {
inhtml += '<option value="' + i + '">' + i + "(" + plotlist[i].length + ")</option>";
if (defval == null) {
defval = i;
}
count++;
}
var historyval = haoutil.storage.get("plot_list");
if (historyval) {
defval = historyval;
}
if (defval && plotlist[defval]) {
that.showPlotList(plotlist[defval]);
$sel_plot_list.attr("data-value", defval);
}
if (count > 1) {
$sel_plot_list.html(inhtml);
$sel_plot_list.select();
$sel_plot_list.change(function () {
var val = $(this).attr("data-value");
var list = plotlist[val];
that.showPlotList(list);
haoutil.storage.add("plot_list", val); //记录历史值
});
} else {
$sel_plot_list.hide();
$(".mp_mark").css({ "margin-top": "10px" });
}
});
},
_listData: null,
showPlotList: function (list) {
this._listData = list;
var inhtml = "";
for (var i = 0; i < list.length; i++) {
var item = list[i];
if (item.hide) {
continue;
}
//处理模型url
if (item.style && item.style.url) {
item.style.url = thisWidget.updateTemplateValues(item.style.url);
}
var defStyle = thisWidget.getDefStyle(item.edittype || item.type);
//使用图片图标
var image;
if (defStyle) {
image = defStyle.image;
}
if (item.style && item.style.image) {
image = item.style.image;
}
if (item.image) {
image = item.image;
}
if (image) {
image = thisWidget.updateTemplateValues(image);
if (image.startsWith("http") || image.startsWith("//")) {
//不用特殊处理
} else if (image.startsWith("{plotPath}")) {
image = image.replace("{plotPath}", "."); //是模块内部本级图片
} else {
image = "../../" + image; //相对于父级index页面的图片
}
inhtml +=
' <li onclick="plotlist.startPlot(' +
i +
',this)"> <i title="' +
item.name +
'" > <img src="' +
image +
'" onerror="plotlist.imgerrorfun();"/></i></li>';
}
// else if (item.style && item.style.html) {
// inhtml += ' <li onclick="plotlist.startPlot(' + i + ',this)"> <i title="' + item.name + '" > ' + item.style.html + '</i></li>';
// }
else {
//使用字体图标
var icon;
var clr = "#000000";
if (defStyle) {
icon = defStyle.iconClass;
clr = defStyle.color;
}
if (item.iconClass) {
icon = item.iconClass;
}
if (item.style && item.style.iconClass) {
icon = item.style.iconClass;
}
if (item.color) {
clr = item.color;
}
if (item.style && item.style.color) {
clr = item.style.color;
}
if (icon) {
inhtml +=
'<li onclick="plotlist.startPlot(' + i + ',this)"><i title="' + item.name + '" class="' + icon + '" style="color:' + clr + '"></i></li>';
} else {
inhtml +=
'<li onclick="plotlist.startPlot(' + i + ',this)"><i title="' + item.name + '" style="font-size: 13px;">' + item.name + "</i></li>";
}
}
}
$("#plotlist").html(inhtml);
},
imgerrorfun: function () {
var img = event.srcElement;
img.src = "../../../img/favicon/app-icon72x72@2x.png";
img.onerror = null;
},
//激活标绘
_lastLi: null,
//开始绘制
startPlot: function (idx, li) {
var _thisli = $(li);
_thisli.addClass("markon");
if (this._lastLi) {
this._lastLi.removeClass("markon");
}
this._lastLi = _thisli;
var item = haoutil.system.clone(this._listData[idx] || {});
delete item.image;
//赋值默认样式
var defStyle = thisWidget.getDefStyle(item.edittype || item.type);
if (defStyle) {
item.style = item.style || {};
for (var i in defStyle) {
if (item.style[i] == null) {
item.style[i] = defStyle[i];
}
}
}
//赋值默认属性
item.attr = {
id: "",
name: "",
remark: "",
};
thisWidget.startDraw(item);
},
//绘制结束
plotEnd: function () {
//取消选中状态
if (this._lastLi) {
this._lastLi.removeClass("markon");
}
},
};
//标号树处理
var objFeature = {};
var treeObj;
var treeWork = {
initEvent: function () {
$("#btn_plot_addgroup").click(function (e) {
thisWidget.editGroupName();
});
$("#btn_plot_delAllGroup").click(function (e) {
thisWidget.deleteEmptyLayer();
});
bindRightMenuEvnet(); //右键
thisWidget.showLayerTree();
},
loadData: function (arrGroup) {
//初始化树 http://www.treejs.cn/v3/api.php
var setting = {
check: {
enable: true,
},
edit: {
drag: {
isMove: true,
},
showRemoveBtn: false,
showRenameBtn: false,
enable: true,
},
data: {
simpleData: {
enable: true,
},
},
callback: {
beforeDrag: treeOverlays_beforeDrag,
beforeDrop: treeOverlays_beforeDrop,
onDrop: treeOverlays_onDrop,
onCheck: treeOverlays_onCheck,
onRightClick: treeOverlays_OnRightClick,
onClick: treeOverlays_onClick,
onRemove: treeOverlays_onRemove,
},
};
//构造树节点
objFeature = {};
var zNodes = [];
for (var i = 0; i < arrGroup.length; i++) {
var layer = arrGroup[i];
var arrGraphic = layer.getGraphics();
var name = layer.name + "(" + arrGraphic.length + "个)";
if (layer.isActivate) {
name += "-激活";
}
var oldNode = treeObj && treeObj.getNodeByParam("id", layer.uuid);
//添加分组
var groupNode = {
id: layer.uuid,
pId: layer.pid,
name: name,
icon: "img/tree/folder.png",
isGroup: true,
checked: layer.show,
open: oldNode && oldNode.open, //是否展开分组
};
zNodes.push(groupNode);
objFeature[groupNode.id] = layer;
for (var j = 0, len = arrGraphic.length; j < len; j++) {
var graphic = arrGraphic[j];
//添加标号
var plotNode = {
id: graphic.uuid,
pId: groupNode.id,
name: graphic.attr?.name || graphic.name || "未命名",
checked: graphic.show,
icon: "img/tree/plot.png",
};
zNodes.push(plotNode);
objFeature[plotNode.id] = graphic;
}
}
$.fn.zTree.destroy();
treeObj = $.fn.zTree.init($("#treeOverlays"), setting, zNodes);
},
updateNode: function (graphic) {
var treeObj = $.fn.zTree.getZTreeObj("treeOverlays");
var node = treeObj.getNodeByParam("id", graphic.uuid, null);
if (node) {
node.name = graphic.attr?.name || graphic.name || "未命名";
var show = graphic.isAdded && graphic.show;
if (node.checked != show) {
node.checkedOld = node.checked;
node.checked = show;
}
treeObj.updateNode(node);
}
},
};
//===================================单击定位图层====================================
function treeOverlays_onClick(event, treeId, treeNode) {
if (treeNode == null || treeNode.id == null) {
return;
}
var layer = objFeature[treeNode.id];
if (layer == null) {
return;
}
thisWidget.flyTo(layer);
}
//===================================勾选显示隐藏图层====================================
function treeOverlays_onCheck(e, treeId, setreeNode) {
//获得所有改变check状态的节点
var changedNodes = treeObj.getChangeCheckedNodes();
for (var i = 0; i < changedNodes.length; i++) {
var treeNode = changedNodes[i];
treeNode.checkedOld = treeNode.checked;
// if (treeNode.check_Child_State == 1) {
// // 0:无子节点被勾选, 1:部分子节点被勾选, 2:全部子节点被勾选, -1:不存在子节点 或 子节点全部设置为 nocheck = true
// continue
// }
var layer = objFeature[treeNode.id];
if (layer == null) {
continue;
}
layer.show = treeNode.checked;
}
}
//===================================右键菜单====================================
var lastRightClickTreeId;
var lastRightClickTreeNode;
function treeOverlays_OnRightClick(event, treeId, treeNode) {
if (treeNode == null || objFeature[treeNode.id] == null) {
return;
}
//右击时的节点
lastRightClickTreeId = treeId;
lastRightClickTreeNode = treeNode;
var top = event.clientY;
var left = event.clientX;
var maxtop = document.body.offsetHeight - 100;
var maxleft = document.body.offsetWidth - 100;
if (top > maxtop) {
top = maxtop;
}
if (left > maxleft) {
left = maxleft;
}
if (treeNode.isGroup) {
$("#plot_rMenu_group .group").show();
$("#plot_rMenu_group .plot").hide();
} else {
$("#plot_rMenu_group .group").hide();
$("#plot_rMenu_group .plot").show();
}
$("#plot_rMenu_group")
.css({
top: top + "px",
left: left + "px",
})
.show();
$("body").bind("mousedown", onBodyMouseDown);
}
function bindRightMenuEvnet() {
$("#plot_rMenu_group li").on("click", function () {
hideRMenu();
var type = $(this).attr("data-type");
moveNodeAndLayer(type);
});
}
function onBodyMouseDown(event) {
if (!(event.target.id == "plot_rMenu_group" || $(event.target).parents("#plot_rMenu_group").length > 0)) {
hideRMenu();
}
}
function hideRMenu() {
$("body").unbind("mousedown", onBodyMouseDown);
$("#plot_rMenu_group").hide();
}
//移动节点及图层位置
function moveNodeAndLayer(type) {
var thisNode = lastRightClickTreeNode;
var thisLayer = objFeature[thisNode.id];
switch (type) {
default:
break;
case "g_act": //置为激活分组
thisWidget.changeSelectedLayer(thisLayer);
break;
case "g_name": //重命名分组
thisWidget.editGroupName(thisLayer);
break;
case "g_del": //删除分组
// if (thisWidget.checkRemoveGroup(thisLayer)) {
treeObj.removeNode(thisNode);
thisWidget.deleteLayer(thisLayer);
// }
break;
case "p_del": //删除标号
treeObj.removeNode(thisNode);
thisWidget.deleteEntity(thisLayer);
break;
case "g_json": //导出GeoJson
thisWidget.downloadJson("标绘分组_" + thisNode.name, thisLayer);
break;
case "g_kml":
thisWidget.downloadKml("标绘分组_" + thisNode.name, thisLayer);
break;
case "p_json": //导出GeoJson
thisWidget.downloadJson(thisNode.name, thisLayer);
break;
case "p_kml":
thisWidget.downloadKml(thisNode.name, thisLayer);
break;
case "g_imp": //导入GeoJson到分组中
plotFile.openPlotFile({ layer: thisLayer.name });
break;
}
}
//===================================删除处理====================================
function treeOverlays_onRemove(event, treeId, treeNode) {
if (treeNode == null || treeNode.id == null) {
return;
}
var layer = objFeature[treeNode.id];
if (layer == null) {
return;
}
if (treeNode.isGroup) {
thisWidget.deleteLayer(layer);
} else {
thisWidget.deleteEntity(layer);
}
}
//===================================拖拽调整层次处理====================================
function treeOverlays_beforeDrag(treeId, treeNodes) {
for (var i = 0, l = treeNodes.length; i < l; i++) {
if (treeNodes[i].isGroup) {
return false; //禁止拖拽
}
}
return true;
}
function treeOverlays_beforeDrop(treeId, treeNodes, targetNode, moveType) {
if (targetNode && targetNode.isGroup) {
return true;
} else {
return false;
} //禁止拖拽到我身上
}
function treeOverlays_onDrop(event, treeId, treeNodes, targetNode, moveType, isCopy) {
if (!targetNode) {
return;
}
// var group = targetNode.name //分组名称
var layerGroup = objFeature[targetNode.id]; //分组
var graphic = objFeature[treeNodes[0].id];
thisWidget.moveToLayer(graphic, layerGroup);
}