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源码

转载于:https://www.cnblogs.com/ajg016/p/4882985.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值