Lin_Ye_Fang_Huo/public/widgets/manageLayers/view.js

448 lines
11 KiB
JavaScript
Raw Normal View History

2023-07-18 09:04:15 +08:00
"use script"; //开发环境建议开启严格模式
2023-07-08 15:37:34 +08:00
//对应widget.js中MyWidget实例化后的对象
2023-07-18 09:04:15 +08:00
var thisWidget;
var layers = [];
var layersObj = {};
2023-07-08 15:37:34 +08:00
//当前页面业务
function initWidgetView(_thisWidget) {
2023-07-18 09:04:15 +08:00
thisWidget = _thisWidget;
2023-07-08 15:37:34 +08:00
//右键
2023-07-18 09:04:15 +08:00
bindRightMenuEvnet();
2023-07-08 15:37:34 +08:00
//初始化树
var setting = {
check: {
enable: true,
},
data: {
simpleData: {
enable: true,
},
},
callback: {
onCheck: treeOverlays_onCheck,
onRightClick: treeOverlays_OnRightClick,
onDblClick: treeOverlays_onDblClick,
onClick: treeOverlays_onClick,
},
view: {
addDiyDom: addOpacityRangeDom,
},
2023-07-18 09:04:15 +08:00
};
2023-07-08 15:37:34 +08:00
2023-07-18 09:04:15 +08:00
var zNodes = [];
layers = thisWidget.getLayers();
2023-07-08 15:37:34 +08:00
for (var i = layers.length - 1; i >= 0; i--) {
2023-07-18 09:04:15 +08:00
var node = _getNodeConfig(layers[i]);
2023-07-08 15:37:34 +08:00
if (node) {
2023-07-18 09:04:15 +08:00
zNodes.push(node);
2023-07-08 15:37:34 +08:00
}
}
2023-07-18 09:04:15 +08:00
$.fn.zTree.init($("#treeOverlays"), setting, zNodes);
2023-07-08 15:37:34 +08:00
}
function _getNodeConfig(layer) {
2023-07-18 09:04:15 +08:00
if (layer == null || !layer.options || layer.options.noLayerManage) {
return;
2023-07-08 15:37:34 +08:00
}
2023-07-18 09:04:15 +08:00
var item = layer.options;
if (!item.name) {
console.log("未命名图层不加入图层管理", layer);
return;
2023-07-08 15:37:34 +08:00
}
2023-07-18 09:04:15 +08:00
2023-07-08 15:37:34 +08:00
var node = {
id: layer.id,
pId: layer.pid,
name: layer.name,
uuid: layer.uuid,
2023-07-18 09:04:15 +08:00
checked: layer.isAdded && layer.show,
};
2023-07-08 15:37:34 +08:00
if (layer.hasEmptyGroup) {
//空数组
2023-07-18 09:04:15 +08:00
node.icon = "img/folder.png";
node.open = item.open == null ? true : item.open;
2023-07-08 15:37:34 +08:00
} else if (layer.hasChildLayer) {
//有子节点的数组
2023-07-18 09:04:15 +08:00
node.icon = "img/layerGroup.png";
node.open = item.open == null ? true : item.open;
2023-07-08 15:37:34 +08:00
} else {
2023-07-18 09:04:15 +08:00
node.icon = "img/layer.png";
if (layer.parent) {
node._parentId = layer.parent.uuid;
2023-07-08 15:37:34 +08:00
}
}
2023-07-18 09:04:15 +08:00
//记录图层
layersObj[node.uuid] = layer;
return node;
2023-07-08 15:37:34 +08:00
}
function addNode(item) {
2023-07-18 09:04:15 +08:00
var treeObj = $.fn.zTree.getZTreeObj("treeOverlays");
2023-07-08 15:37:34 +08:00
2023-07-18 09:04:15 +08:00
var parentNode;
2023-07-08 15:37:34 +08:00
if (item.pid && item.pid != -1) {
2023-07-18 09:04:15 +08:00
parentNode = treeObj.getNodeByParam("id", item.pid, null);
2023-07-08 15:37:34 +08:00
}
2023-07-18 09:04:15 +08:00
var node = _getNodeConfig(item);
2023-07-08 15:37:34 +08:00
if (!node) {
2023-07-18 09:04:15 +08:00
return;
2023-07-08 15:37:34 +08:00
}
2023-07-18 09:04:15 +08:00
2023-07-08 15:37:34 +08:00
2023-07-18 09:04:15 +08:00
/*
*/
treeObj.addNodes(parentNode, 0, [node], true);
2023-07-08 15:37:34 +08:00
//更新子节点图层
if (item.hasChildLayer) {
item.eachLayer((childLayer) => {
2023-07-18 09:04:15 +08:00
removeNode(childLayer);
addNode(childLayer);
});
2023-07-08 15:37:34 +08:00
}
}
function removeNode(layer) {
2023-07-18 09:04:15 +08:00
var treeObj = $.fn.zTree.getZTreeObj("treeOverlays");
2023-07-08 15:37:34 +08:00
2023-07-18 09:04:15 +08:00
var node = treeObj.getNodeByParam("uuid", layer.uuid, null);
2023-07-08 15:37:34 +08:00
if (node) {
2023-07-18 09:04:15 +08:00
treeObj.removeNode(node);
2023-07-08 15:37:34 +08:00
}
}
function updateNode(layer) {
2023-07-18 09:04:15 +08:00
var treeObj = $.fn.zTree.getZTreeObj("treeOverlays");
2023-07-08 15:37:34 +08:00
2023-07-18 09:04:15 +08:00
var node = treeObj.getNodeByParam("uuid", layer.uuid, null);
var show = layer.isAdded && layer.show;
2023-07-08 15:37:34 +08:00
if (node) {
//更新node
if (node.checked == show) {
2023-07-18 09:04:15 +08:00
return;
2023-07-08 15:37:34 +08:00
}
2023-07-18 09:04:15 +08:00
node.checkedOld = node.checked;
node.checked = show;
2023-07-08 15:37:34 +08:00
2023-07-18 09:04:15 +08:00
treeObj.updateNode(node);
2023-07-08 15:37:34 +08:00
} else {
2023-07-18 09:04:15 +08:00
addNode(layer, show);
2023-07-08 15:37:34 +08:00
}
}
//===================================双击定位图层====================================
2023-07-18 09:04:15 +08:00
function treeOverlays_onClick(e, treeId, treeNode, clickFlag) {
// if (treeNode == null || treeNode.uuid == null) {
// return
// }
// var layer = layersObj[treeNode.uuid]
// if (layer) {
// thisWidget.checkClickLayer(layer, treeNode.checked)
// }
}
2023-07-08 15:37:34 +08:00
function treeOverlays_onDblClick(event, treeId, treeNode) {
if (treeNode == null || treeNode.uuid == null) {
2023-07-18 09:04:15 +08:00
return;
2023-07-08 15:37:34 +08:00
}
2023-07-18 09:04:15 +08:00
var layer = layersObj[treeNode.uuid];
2023-07-08 15:37:34 +08:00
if (layer == null) {
2023-07-18 09:04:15 +08:00
return;
2023-07-08 15:37:34 +08:00
}
2023-07-18 09:04:15 +08:00
layer.flyTo();
2023-07-08 15:37:34 +08:00
}
//===================================勾选显示隐藏图层====================================
2023-07-18 09:04:15 +08:00
function removeArrayItem(arr, val) {
for (let i = 0; i < arr.length; i++) {
if (arr[i] == val) {
arr.splice(i, 1);
return true;
}
}
return false;
}
2023-07-08 15:37:34 +08:00
function treeOverlays_onCheck(e, treeId, chktreeNode) {
2023-07-18 09:04:15 +08:00
var treeObj = $.fn.zTree.getZTreeObj(treeId);
2023-07-08 15:37:34 +08:00
//获得所有改变check状态的节点
2023-07-18 09:04:15 +08:00
var changedNodes = treeObj.getChangeCheckedNodes();
removeArrayItem(changedNodes, chktreeNode);
changedNodes.push(chktreeNode);
2023-07-08 15:37:34 +08:00
for (var i = 0; i < changedNodes.length; i++) {
2023-07-18 09:04:15 +08:00
var treeNode = changedNodes[i];
treeNode.checkedOld = treeNode.checked;
if (treeNode.check_Child_State == 1) {
// 0:无子节点被勾选, 1:部分子节点被勾选, 2:全部子节点被勾选, -1:不存在子节点 或 子节点全部设置为 nocheck = true
continue;
}
var layer = layersObj[treeNode.uuid];
2023-07-08 15:37:34 +08:00
if (layer == null) {
2023-07-18 09:04:15 +08:00
continue;
2023-07-08 15:37:34 +08:00
}
//显示隐藏透明度设置view
if (treeNode.checked) {
2023-07-18 09:04:15 +08:00
$("#" + treeNode.tId + "_range").show();
2023-07-08 15:37:34 +08:00
} else {
2023-07-18 09:04:15 +08:00
$("#" + treeNode.tId + "_range").hide();
2023-07-08 15:37:34 +08:00
}
//特殊处理同目录下的单选的互斥的节点可在config对应图层节点中配置"radio":true即可
if (layer.options.radio && treeNode.checked) {
var nodes = treeObj.getNodesByFilter(
function (node) {
2023-07-18 09:04:15 +08:00
var item = layersObj[node.uuid];
return item.options.radio && item.pid == layer.pid && node.uuid != treeNode.uuid;
2023-07-08 15:37:34 +08:00
},
false,
treeNode.getParentNode()
2023-07-18 09:04:15 +08:00
);
2023-07-08 15:37:34 +08:00
for (var nidx = 0; nidx < nodes.length; nidx++) {
2023-07-18 09:04:15 +08:00
nodes[nidx].checkedOld = false;
treeObj.checkNode(nodes[nidx], false, true);
2023-07-08 15:37:34 +08:00
2023-07-18 09:04:15 +08:00
$("#" + nodes[nidx].tId + "_range").hide();
2023-07-08 15:37:34 +08:00
2023-07-18 09:04:15 +08:00
var layertmp = layersObj[nodes[nidx].uuid];
layertmp.show = false;
2023-07-08 15:37:34 +08:00
}
}
//处理图层显示隐藏
2023-07-18 09:04:15 +08:00
thisWidget.updateLayerShow(layer, treeNode.checked);
}
var layerThis = layersObj[chktreeNode.uuid];
if (layerThis) {
thisWidget.checkClickLayer(layerThis, chktreeNode.checked);
2023-07-08 15:37:34 +08:00
}
}
//===================================透明度设置====================================
//在节点后添加自定义控件
function addOpacityRangeDom(treeId, tNode) {
//if (tNode.icon == "images/folder.png") return;
2023-07-18 09:04:15 +08:00
var layer = layersObj[tNode.uuid];
2023-07-08 15:37:34 +08:00
if (!layer || !layer.hasOpacity) {
2023-07-18 09:04:15 +08:00
return;
2023-07-08 15:37:34 +08:00
}
2023-07-18 09:04:15 +08:00
var view = $("#" + tNode.tId);
var silder = '<input id="' + tNode.tId + '_range" type="range" style="width: 50px;" />';
view.append(silder);
2023-07-08 15:37:34 +08:00
if (!tNode.checked) {
2023-07-18 09:04:15 +08:00
$("#" + tNode.tId + "_range").hide();
2023-07-08 15:37:34 +08:00
}
2023-07-18 09:04:15 +08:00
$("#" + tNode.tId + "_range").range({
2023-07-08 15:37:34 +08:00
min: 0,
max: 100,
step: 1,
value: (layer.opacity || 1) * 100,
onChange: function (value) {
2023-07-18 09:04:15 +08:00
var opacity = value / 100;
var layer = layersObj[tNode.uuid];
2023-07-08 15:37:34 +08:00
//设置图层的透明度
// thisWidget.udpateLayerOpacity(layer, opacity)
2023-07-18 09:04:15 +08:00
layer.opacity = opacity;
2023-07-08 15:37:34 +08:00
},
2023-07-18 09:04:15 +08:00
});
2023-07-08 15:37:34 +08:00
}
//===================================右键菜单====================================
2023-07-18 09:04:15 +08:00
var lastRightClickTreeId;
var lastRightClickTreeNode;
2023-07-08 15:37:34 +08:00
function treeOverlays_OnRightClick(event, treeId, treeNode) {
if (treeNode == null) {
2023-07-18 09:04:15 +08:00
return;
2023-07-08 15:37:34 +08:00
}
2023-07-18 09:04:15 +08:00
var layer = layersObj[treeNode.uuid];
2023-07-08 15:37:34 +08:00
if (!layer || !layer.hasZIndex) {
2023-07-18 09:04:15 +08:00
return;
2023-07-08 15:37:34 +08:00
}
//右击时的节点
2023-07-18 09:04:15 +08:00
lastRightClickTreeId = treeId;
lastRightClickTreeNode = treeNode;
2023-07-08 15:37:34 +08:00
2023-07-18 09:04:15 +08:00
var top = event.clientY;
var left = event.clientX;
var maxtop = document.body.offsetHeight - 100;
var maxleft = document.body.offsetWidth - 100;
2023-07-08 15:37:34 +08:00
if (top > maxtop) {
2023-07-18 09:04:15 +08:00
top = maxtop;
2023-07-08 15:37:34 +08:00
}
if (left > maxleft) {
2023-07-18 09:04:15 +08:00
left = maxleft;
2023-07-08 15:37:34 +08:00
}
2023-07-18 09:04:15 +08:00
$("#content_layer_manager_rMenu")
2023-07-08 15:37:34 +08:00
.css({
2023-07-18 09:04:15 +08:00
top: top + "px",
left: left + "px",
2023-07-08 15:37:34 +08:00
})
2023-07-18 09:04:15 +08:00
.show();
$("body").bind("mousedown", onBodyMouseDown);
2023-07-08 15:37:34 +08:00
}
function onBodyMouseDown(event) {
2023-07-18 09:04:15 +08:00
if (!(event.target.id == "content_layer_manager_rMenu" || $(event.target).parents("#content_layer_manager_rMenu").length > 0)) {
hideRMenu();
2023-07-08 15:37:34 +08:00
}
}
function hideRMenu() {
2023-07-18 09:04:15 +08:00
$("body").unbind("mousedown", onBodyMouseDown);
$("#content_layer_manager_rMenu").hide();
2023-07-08 15:37:34 +08:00
}
function bindRightMenuEvnet() {
2023-07-18 09:04:15 +08:00
$("#content_layer_manager_rMenu li").on("click", function () {
hideRMenu();
2023-07-08 15:37:34 +08:00
2023-07-18 09:04:15 +08:00
var type = $(this).attr("data-type");
moveNodeAndLayer(type);
});
2023-07-08 15:37:34 +08:00
}
//移动节点及图层位置
function moveNodeAndLayer(type) {
2023-07-18 09:04:15 +08:00
var treeObj = $.fn.zTree.getZTreeObj(lastRightClickTreeId);
2023-07-08 15:37:34 +08:00
//获得当前节点的所有同级节点
2023-07-18 09:04:15 +08:00
var childNodes;
var parent = lastRightClickTreeNode.getParentNode();
2023-07-08 15:37:34 +08:00
if (parent == null) {
2023-07-18 09:04:15 +08:00
childNodes = treeObj.getNodes();
2023-07-08 15:37:34 +08:00
} else {
2023-07-18 09:04:15 +08:00
childNodes = parent.children;
2023-07-08 15:37:34 +08:00
}
2023-07-18 09:04:15 +08:00
var thisNode = lastRightClickTreeNode;
var thisLayer = layersObj[thisNode.uuid];
2023-07-08 15:37:34 +08:00
switch (type) {
default:
2023-07-18 09:04:15 +08:00
break;
case "up": //图层上移一层
2023-07-08 15:37:34 +08:00
{
2023-07-18 09:04:15 +08:00
let moveNode = thisNode.getPreNode();
2023-07-08 15:37:34 +08:00
if (moveNode) {
2023-07-18 09:04:15 +08:00
treeObj.moveNode(moveNode, thisNode, "prev");
let moveLayer = layersObj[moveNode.uuid];
2023-07-08 15:37:34 +08:00
2023-07-18 09:04:15 +08:00
exchangeLayer(thisLayer, moveLayer);
2023-07-08 15:37:34 +08:00
}
}
2023-07-18 09:04:15 +08:00
break;
2023-07-08 15:37:34 +08:00
2023-07-18 09:04:15 +08:00
case "top": //图层置于顶层
2023-07-08 15:37:34 +08:00
{
if (thisNode.getIndex() == 0) {
2023-07-18 09:04:15 +08:00
return;
2023-07-08 15:37:34 +08:00
}
while (thisNode.getIndex() > 0) {
//冒泡交换
2023-07-18 09:04:15 +08:00
let moveNode = thisNode.getPreNode();
2023-07-08 15:37:34 +08:00
if (moveNode) {
2023-07-18 09:04:15 +08:00
treeObj.moveNode(moveNode, thisNode, "prev");
2023-07-08 15:37:34 +08:00
2023-07-18 09:04:15 +08:00
let moveLayer = layersObj[moveNode.uuid];
exchangeLayer(thisLayer, moveLayer);
2023-07-08 15:37:34 +08:00
}
}
}
2023-07-18 09:04:15 +08:00
break;
2023-07-08 15:37:34 +08:00
2023-07-18 09:04:15 +08:00
case "down": //图层下移一层
2023-07-08 15:37:34 +08:00
{
2023-07-18 09:04:15 +08:00
let moveNode = thisNode.getNextNode();
2023-07-08 15:37:34 +08:00
if (moveNode) {
2023-07-18 09:04:15 +08:00
treeObj.moveNode(moveNode, thisNode, "next");
2023-07-08 15:37:34 +08:00
2023-07-18 09:04:15 +08:00
let moveLayer = layersObj[moveNode.uuid];
exchangeLayer(thisLayer, moveLayer);
2023-07-08 15:37:34 +08:00
}
}
2023-07-18 09:04:15 +08:00
break;
case "bottom": //图层置于底层
2023-07-08 15:37:34 +08:00
{
if (thisNode.getIndex() == childNodes.length - 1) {
2023-07-18 09:04:15 +08:00
return;
2023-07-08 15:37:34 +08:00
}
while (thisNode.getIndex() < childNodes.length - 1) {
//冒泡交换
2023-07-18 09:04:15 +08:00
let moveNode = thisNode.getNextNode();
2023-07-08 15:37:34 +08:00
if (moveNode) {
2023-07-18 09:04:15 +08:00
treeObj.moveNode(moveNode, thisNode, "next");
2023-07-08 15:37:34 +08:00
2023-07-18 09:04:15 +08:00
let moveLayer = layersObj[moveNode.uuid];
exchangeLayer(thisLayer, moveLayer);
2023-07-08 15:37:34 +08:00
}
}
}
2023-07-18 09:04:15 +08:00
break;
2023-07-08 15:37:34 +08:00
}
//按order重新排序
layers.sort(function (a, b) {
2023-07-18 09:04:15 +08:00
return a.zIndex - b.zIndex;
});
2023-07-08 15:37:34 +08:00
}
/**
* 交换相邻的图层 layer1 待移动图层 layer2 移动目标图层
*/
function exchangeLayer(layer1, layer2) {
if (layer1 == null || layer2 == null) {
2023-07-18 09:04:15 +08:00
return;
2023-07-08 15:37:34 +08:00
}
2023-07-18 09:04:15 +08:00
var or = layer1.zIndex;
layer1.zIndex = layer2.zIndex; //向上移动
layer2.zIndex = or; //向下移动
2023-07-08 15:37:34 +08:00
2023-07-18 09:04:15 +08:00
console.log(`${layer1.name}:${layer1.zIndex}, ${layer2.name}:${layer2.zIndex}`);
2023-07-08 15:37:34 +08:00
// //向上移动
// thisWidget.udpateLayerZIndex(layer1, layer1.zIndex)
// //向下移动
// thisWidget.udpateLayerZIndex(layer2, layer2.zIndex)
}
//===================================其他====================================
//地图图层添加移除监听,自动勾选
function updateCheckd(name, checked) {
2023-07-18 09:04:15 +08:00
var treeObj = $.fn.zTree.getZTreeObj("treeOverlays");
var nodes = treeObj.getNodesByParam("name", name, null);
2023-07-08 15:37:34 +08:00
if (nodes && nodes.length > 0) {
2023-07-18 09:04:15 +08:00
treeObj.checkNode(nodes[0], checked, false);
2023-07-08 15:37:34 +08:00
} else {
2023-07-18 09:04:15 +08:00
console.log("未在图层树上找到图层“" + name + "”,无法自动勾选处理");
2023-07-08 15:37:34 +08:00
}
}