图层管理

////////////////////////////////////////////////////////////////////////////////
//
// 图层管理
//
////////////////////////////////////////////////////////////////////////////////
var LayerManagerModule = (function($) {
    //
    var createLayerManager = function() {
        // 工具 dom
        console.log("createLayerManager!");    
        if ($("#layerManagerContainerDiv").length < 1){  
            var layerManagerDom = '<div id="layerManagerContainerDiv" class="layerManagerContainer">'+
                '<div id="layerManagerHeadDiv" class="layerManagerHead" >'+
                    '<span class="layerManagerHeadLabel" > 图层管理 </span>'+
                    '<a class="layerManagerHeadClose" href="#"><img id="closeButton" src="img/layerManager/close.png" title="关闭" ></img></a>'+
                '</div>'+
                '<div id="layerManagerDiv" class="ztree layerManager"></div>'+
            '</div>';        
            $(layerManagerDom).appendTo($('#controllerDiv'));
            //
            $("#layerManagerContainerDiv").css({'bottom' : 45, 'left' : (document.documentElement.clientWidth - 300)/2 });
            //
            createLayerMangerTree('layerManagerDiv', Application.map);
            // 事件
            toolAction();
            //
            widgetDrag(layerManagerDom);
            //
            console.log("createLayerManager finish!");    
        }
        else
        {
            var map = Application.map;
            createLayerMangerTree('layerManagerDiv', map);    
            $("#layerManagerContainerDiv").show();
        }
    };

    // 事件
    var toolAction = function() {
        $("#closeButton").each(function() {
            $(this).mouseover(function() {
                // tip
                $(this).poshytip( {
                    className : 'tip-twitter',
                    showTimeout : 1,
                    alignTo : 'target',
                    alignX : 'center',
                    offsetY : 10,
                    allowTipHover : false,
                    fade : false,
                    slide : false
                });

                var oldSrc = (this).src;
                var newSrc = oldSrc.replace(".png", "On.png");
                $(this).attr("src", newSrc);
            });
            //
            $(this).mouseout(function() {
                var oldSrc = (this).src;
                var newSrc = oldSrc.replace("On.png", ".png");
                $(this).attr("src", newSrc);
            });
            //
            $(this).click(function() {
                $("#layerManagerContainerDiv").hide();
            });
        })
    };
    
    /*
    提取图层信息数据
    map: 地图
    */
    var createLayerMangerTreeData = function (map) {
        var layerMangerTreeData = new Array();
        var layerIds = map.layerIds;
        for (var i = 0; i < layerIds.length; i++) {
            var layerId = layerIds[i];
            var layer = map.getLayer(layerId);
            if (layer.declaredClass == "esri.layers.ArcGISDynamicMapServiceLayer") {// instanceof esri.layers.ArcGISDynamicMapServiceLayer) {
                var layerInfos = layer.layerInfos;
                var visibleLayers = layer.visibleLayers;
                //console.log(visibleLayers);
                var treeNodeDataMapService = new Object();
                treeNodeDataMapService.id = layer.id;
                treeNodeDataMapService.name = layer.id;
                treeNodeDataMapService.pId = "-1";
                treeNodeDataMapService.checked = layer.visible;
                treeNodeDataMapService.chkDisabled = false;
                treeNodeDataMapService.isParent = true;
                treeNodeDataMapService.nocheck = false;
                layerMangerTreeData.push(treeNodeDataMapService);
                for (var j = 0; j < layerInfos.length; j++) {
                    var layerInfo = layerInfos[j];
                    var treeNodeDataLayer = new Object();
                    treeNodeDataLayer.id = layer.id + "_" + layerInfo.id;
                    treeNodeDataLayer.name = layerInfo.name;
                    treeNodeDataLayer.open = false;
                    treeNodeDataLayer.pId = (isNaN(layerInfo.parentLayerId) || layerInfo.parentLayerId == -1) ? layer.id : (layer.id + "_" + layerInfo.parentLayerId);
                    
                    treeNodeDataLayer.checked = false;//layerInfo.defaultVisibility;
                    
                    for(var k = 0; k < visibleLayers.length; k++)
                    {
                        if(visibleLayers[k] == j)
                        {
                            treeNodeDataLayer.checked = true;
                            break;
                        }
                    }
                    treeNodeDataLayer.chkDisabled = false;
                    treeNodeDataLayer.isParent = false;                    
                    treeNodeDataLayer.nocheck = false;
                    layerMangerTreeData.push(treeNodeDataLayer);
                }
            }
        }        
        return layerMangerTreeData;
    };

    /*
    构建图层管理树
    renderToDevId : 装载该图层树的<DIV/>标签Id
    map : 地图对象
    */
    var createLayerMangerTree = function (renderToDevId, map) {
        var setting = {
            check: {
                enable: true,
                chkboxType: { "Y" : "", "N" : "" }
            },
            view: {
                dblClickExpand: false
            },
            data: {
                simpleData: {
                    enable: true
                }
            },
            callback: {
                onCheck: function (e, treeId, treeNode) {                  
                    var sid = treeNode.id;
                    //console.log(sid);
                    if (treeNode.level == 0) {
                        var serviceId = sid;
                        var visible = treeNode.checked;
                        changeServerVisible(map, serviceId, visible);
                        return;
                    }
                    var serviceId = sid.substring(0, sid.lastIndexOf("_"));
                    var layerId = sid.substring(sid.lastIndexOf("_") + 1);
                    var treeObj = $.fn.zTree.getZTreeObj(renderToDevId);
                    var nodes = treeObj.getCheckedNodes(true);
                    var visibleLayers = new Array();
                    for (var i = 0, l = nodes.length; i < l; i++) {
                        var node = nodes[i];
                        var sidTemp = node.id;
                        var serviceIdTemp = sidTemp.substring(0, sidTemp.lastIndexOf("_"));
                        if (serviceId == serviceIdTemp) {
                            var layerIdTemp = parseInt(sidTemp.substring(sidTemp.lastIndexOf("_") + 1));
                            if(node.getParentNode().checked && node.isParent==false)
                            {
                                visibleLayers.push(layerIdTemp);
                            }
                        }
                    }
                    if(visibleLayers.length==0)
                    {
                        visibleLayers = [-1];
                    }
                    setVisibleLayers(map, serviceId, visibleLayers);                    
                }                
            }
        };
        var zNodes = createLayerMangerTreeData(map);
        //var json = JSON.stringify(zNodes);
        //console.log(json);
        var zTree = $.fn.zTree.init($("#" + renderToDevId), setting, zNodes);
        zTree.expandAll(true);
    };

    /*
    设置可见图层
    map: 地图对象
    serviceId: 服务的Id
    visibleLayers: 可见图层的Id数组
    */
    var setVisibleLayers = function (map, serviceId, visibleLayers) {
        var layer = map.getLayer(serviceId);
        //layer.hide();
        layer.setVisibleLayers(visibleLayers);
        //layer.show();
    };

    /*
    改变地图服务可见性
    map : 地图对象
    serviceId : 服务的Id
    visible : 可见性
    */
    var changeServerVisible = function (map, serviceId, visible) {
        var layer = map.getLayer(serviceId);
        if (visible) {
            layer.show();
        }
        else {
            layer.hide();
        }
    };

    // widget拖动
    var widgetDrag = function(targetDOM) {
        var move = false, // 移动标记
        _x, _y, // 鼠标离控件左上角的相对位置
        opacity = Application.configData.ui.opacity,

        layerManagerHeadDiv = $('#layerManagerHeadDiv'), layerManagerContainerDiv = $('#layerManagerContainerDiv');

        // 鼠标移动到 tab 部分鼠标为可拖动状态
        layerManagerHeadDiv.mouseover(function(e) {
            // tab 部分鼠标设置为move状态
                layerManagerHeadDiv.css('cursor', 'move');
            });

        // widget tab 部分可拖动 widget
        layerManagerHeadDiv.mousedown(function(e) {
            // tab 部分鼠标设置为move状态
                layerManagerHeadDiv.css('cursor', 'move');
                // 不透明度设置
                layerManagerContainerDiv.css('opacity', opacity - 0.1);
                layerManagerContainerDiv.css('filter',
                        'alpha(opacity=' + (opacity * 100 - 10) + ')');

                move = true;
                if (layerManagerContainerDiv.css('left') == 'auto') {
                    _x = e.pageX
                            - ($(window).width()
                                    - parseInt(layerManagerContainerDiv.css('width')) - parseInt(layerManagerContainerDiv
                                    .css('right')));
                } else {
                    _x = e.pageX - parseInt(layerManagerContainerDiv.css('left'));
                }

                if (layerManagerContainerDiv.css('top') == 'auto') {
                    _y = e.pageY
                            - ($(window).height()
                                    - parseInt(layerManagerContainerDiv.css('height')) - parseInt(layerManagerContainerDiv
                                    .css('bottom')));
                } else {
                    _y = e.pageY - parseInt(layerManagerContainerDiv.css('top'));
                }

            });
        $(document)
                .mousemove(function(e) {
                    if (move) {
                        var x = e.pageX - _x, // 控件左上角到屏幕左上角的相对位置
                        y = e.pageY - _y,
                        // widget 拖动范围控制
                        maxL = document.documentElement.clientWidth
                                - layerManagerContainerDiv.width(), maxT = document.documentElement.clientHeight
                                - layerManagerContainerDiv.height();
                        x <= 0 && (x = 0);
                        y <= 0 && (y = 0);
                        x >= maxL && (x = maxL);
                        y >= maxT && (y = maxT);
                        // 设置 widget 位置
                        layerManagerContainerDiv.css({'top' : y, 'left' : x});
                    }
                }).mouseup(function() {
                    move = false;
                    // tab 部分鼠标设置为auto状态
                        layerManagerHeadDiv.css('cursor', 'auto');
                        // 不透明度设置
                        layerManagerContainerDiv.css('opacity', opacity);
                        layerManagerContainerDiv.css('filter', 'alpha(opacity=' + opacity * 100 + ')');
                    });
    };
    //
    return {
        createLayerManager : createLayerManager
    };

}(jQuery));
原文地址:https://www.cnblogs.com/gispathfinder/p/5745628.html