首先看下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源碼