1. 程式人生 > >通過Easy-UI 樹外掛實現ArcGIS多個服務圖層的圖層控制

通過Easy-UI 樹外掛實現ArcGIS多個服務圖層的圖層控制

       專案上要一個圖層控制功能,當時也找到一些別人分享的,但是隻能實現對一個動態服務圖層的控制,然而專案上疊加了好幾個圖層,需要實現對多個服務圖層的控制。一開始想簡單了,覺得有幾個圖層構建幾次樹不就完事了,這肯定是不行的,你會發現最後構建完成之後只有一個圖層(最後構建的那個)。仔細想想其實就是在原來的圖層之上再加一個層級關係。要把圖層控制樹顯示出來問題不大,關鍵在於如何通過勾選框實現各個圖層的顯示與隱藏,程式碼寫的有點亂。

效果圖:

詳細程式碼:

<!DOCTYPE html>
<html>
    <head lang="zh-CN">
        <meta charset="UTF-8">
        <title>TOC</title>
        <link rel="stylesheet" href="http://localhost/arcgis_js_api/library/3.25/3.25/dijit/themes/tundra/tundra.css">
        <link rel="stylesheet" type="text/css" href="http://localhost/arcgis_js_api/library/3.25/3.25/esri/css/esri.css" />

        <link rel="stylesheet" href="easyui/themes/default/easyui.css">
        <script type="text/javascript" src="easyui/jquery.min.js "></script>
        <script type="text/javascript" src="easyui/locale/easyui-lang-zh_CN.js "></script>
        <script type="text/javascript" src="easyui/jquery.easyui.min.js "></script>
        <script type="text/javascript" src="http://localhost/arcgis_js_api/library/3.25/3.25/init.js"></script>
        <style type="text/css">
            *{
                margin:0px;
                padding:0px;
            }
            html,body{
                height:100%;
                width:100%;
                position: relative;
                overflow: hidden;
            }
        </style>

    </head>
    <body class="tundra">
        <div id="mapDiv" style="float:left;width: 70%;height: 100%;"></div>
        <div id="toc" style="float:left;width: 30%;height: 100%;"></div>
        <script type="text/javascript">
          require([
            'dojo/on',
            'esri/map',
            'esri/layers/ArcGISDynamicMapServiceLayer'
          ],function(
            on,
            Map,
            ArcGISDynamicMapServiceLayer
          ){
            var map=new Map('mapDiv');
            var layer1 = new ArcGISDynamicMapServiceLayer("http://10.200.223.191:6080/arcgis/rest/services/SDKD/MapServer", {id:"DynamicLayer1"});
            var layer2 = new ArcGISDynamicMapServiceLayer("http://10.200.223.191:6080/arcgis/rest/services/SDKD2/MapServer", {id:"DynamicLayer2"});
            var layers = [];
            layers.push(layer1);
            layers.push(layer2);
            map.addLayer(layer2);
            map.addLayer(layer1);
            map.on('load', function () {
              buildLayerList(layers);
            });

            /**
             * 構建圖層樹形結構
             */
            function buildLayerList(layers) {
              var treeList = [];//jquery-easyui的tree用到的tree_data.json陣列

              var root = { "id": "rootnode", "text": "所有圖層", "children": [] };//增加一個根節點
              var root2 = {};//二級根節點,對應動態地圖服務圖層個數
              let me = this;
              dojo.forEach(layers,function (layer) {
                root2  = {
                  "id": layer.id,
                  "text": layer.id,
                  "pid":-1,
                  "checked": layer.visible ? true : false,
                  "children": []
                };
                root.children.push(root2);
                var layerinfos = layer.layerInfos;
                var parentnodes = [];//儲存所有的父親節點
                var node = {};
                if (layerinfos != null && layerinfos.length > 0) {
                  for (var i = 0; i < layerinfos.length; i++) {
                    var info = layerinfos[i];
                    //node為tree用到的json資料
                    node = {
                      "id": info.id,
                      "text": info.name,
                      "pid": info.parentLayerId,
                      "checked": info.defaultVisibility ? true : false,
                      "children": []
                    };
                    if (info.parentLayerId == -1) {
                      parentnodes.push(node);
                      root2.children.push(node);
                    } else {
                      getChildrenNodes(parentnodes, node);
                      parentnodes.push(node);
                    }
                  }
                }
              });
              treeList.push(root);
              //jquery-easyui的樹
              $('#toc').tree({
                data: treeList,
                checkbox: true, //使節點增加選擇框
                lines:true,
                onCheck: function (node, checked) {//更新顯示選擇的圖層
                  var visible = [];
                  var tempVisible = [];
                  for(var i=0; i<layers.length; i++){
                    visible[i] = tempVisible;   //二維陣列
                  }
                  var nodes = $('#toc').tree("getChecked");
                  dojo.forEach(nodes, function (node) {
                    if (!isNaN(node.id)){
                      var tempNode = $('#toc').tree('getParent',node.target);
                      //只找葉子結點,
                      if(node.pid != -1){
                        for(var i=0; i<layers.length; i++){  //判斷屬於哪個圖層服務
                          var layerId = $('#toc').tree('getParent',tempNode.target).id;
                          if(layerId === layers[i].id){
                            visible[i].push(node.id);

                          }
                        }
                      }

                    }

                  });
                  for(var i=0; i<layers.length; i++){
                    layers[i].setVisibleLayers(visible[i]);
                  }
                }
              });
            }


            function getChildrenNodes(parentnodes, node) {
              for (var i = parentnodes.length - 1; i >= 0; i--) {
                var pnode = parentnodes[i];
                //如果是父子關係,為父節點增加子節點,退出for迴圈  
                if (pnode.id == node.pid) {
                  pnode.state = "closed";//關閉二級樹  
                  pnode.children.push(node);
                  return;
                } else {
                  //如果不是父子關係,刪除父節點棧裡當前的節點,  
                  //繼續此次迴圈,直到確定父子關係或不存在退出for迴圈  
                  parentnodes.pop();
                }
              }
            }
          })
        </script>
    </body>
</html>

      如果遇到樹結構顯示不全問題,可能是圖層未載入完成,獲取不到LayerInfo資訊,可以把構建樹的操作放在ArcGIS JS API  裡面的狀態監聽事件。

 map.on('load', function () {
              buildLayerList(layers);
            });