ArcGIS API ArcGISDynamicMapServiceLayer.setVisibleLayers對帶有GroupLayer圖層組的數據無效(針對LayerInfo)問題探討


首先看下setVisibleLayers方法:

setVisibleLayers(ids, doNotRefresh?)
Sets the visible layers of the exported map. By default, the visible layers are as defined by the default visibility in LayerInfo. 
To display no visible layers specify an array with a value of -1. if(visible.length === 0){ visible.push(-1); } layer.setVisibleLayers(visible);

經過測試,JS開發中,setVisibleLayers對帶有圖層組的要素無法直接操作。

例如:

在加載后 對圖層 LayerInfo(紅圈,為GroupLayer)進行show/hide,無法正常操作。

解決方法1:

  發布圖層時不要增加圖層組(GroupLayer),所有圖層都在一層之下,發布后調用即可正常使用;

解決方法2:

  第一種解決方法需把所有數據放同一層,不設置圖層組,可針對簡單數據,但數據繁多需要分組時,就需要考慮分組問題,GroupLayer本身在JS API加載后也是LayerInfo,

思路是:把VisibleLayer里面的圖層組都刪掉,再調用setVisibleLayers(visibleLayer)。

 1 function getVisibleLayers(layer, subLayerIndex) {
 2     require(["dojo/_base/array"],function(array) {
 3         var layerInfos = layer.layerInfos;
 4         var i;
 5         // array for setting visible layers
 6         var visibleLayers = [-1];
 7 
 8         if (typeof subLayerIndex !== "undefined") {
 9             var newVis = !layerInfos[subLayerIndex].defaultVisibility;
10             // reverse current visibility of sublayer
11             layerInfos[subLayerIndex].defaultVisibility = newVis;
12         }
13 
14         // for each sublayer
15         for (i = 0; i < layerInfos.length; i++) {
16             var info = layerInfos[i];
17             // push to visible layers if it's visible
18             if (info.defaultVisibility) {
19                 visibleLayers.push(info.id);
20                 var negative = array.lastIndexOf(visibleLayers, -1);
21                 if (negative !== -1) {
22                     visibleLayers.splice(negative, 1);
23                 }
24             }
25         }
26         //Now that the array of visibleLayer Ids is assembled,說明:此處即是對GroupLayer進行處理
27         //strip off Ids of invisible child layers, and
28         //Ids of group layers (group layer Ids should not be submitted
29         //in .setVisible() or loss of toggle control madness ensues.
30         //Remove layers whos parents are not visible:
31         var noInvisibleParents = [];
32         for (i = 0; i < visibleLayers.length; i++) {
33             var id = visibleLayers[i];
34             var hasParentsInVisibleArray = this._allIdsPresent(layer, id, visibleLayers);
35             if (hasParentsInVisibleArray) {
36                 noInvisibleParents.push(id);
37             }
38         }
39         var noGroups = [];
40         for (var j = 0; j < noInvisibleParents.length; j++) {
41             var lyrInfo = this._getLayerInfo(layer, noInvisibleParents[j]);
42             if (lyrInfo && lyrInfo.subLayerIds === null) {
43                 noGroups.push(noInvisibleParents[j]);
44             }
45         }
46         // note: set -1 if array is empty.
47         if (!noGroups.length) {
48             noGroups = [-1];
49         }
50         return noGroups;
51     });
52 }

  代碼略顯復雜,不過對於自定義圖層操作可做參考。

  注:參考ArcGIS JS API的LayerList源碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM