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

时间: 2024-10-06 16:50:35

ArcGIS API ArcGISDynamicMapServiceLayer.setVisibleLayers对带有GroupLayer图层组的数据无效(针对LayerInfo)问题探讨的相关文章

ArcGIS API for JavaScript 4.2学习笔记[0] AJS4.2概述、新特性、未来产品线计划与AJS笔记目录

放着好好的成熟的AJS 3.19不学,为什么要去碰乳臭未干的AJS 4.2? 诸君,我喜欢嫩的--呸呸呸 诸君,我喜欢3D咋了?新事物会替代旧事物不是~ ArcGIS API for JavaScript 4.2概述 AJS 4.2,即ArcGIS API for JavaScript 4.2,是美国ESRI公司针对WebGIS市场推出的.利用JavaScript和Dojo开发的一款产品,它在2016年12月发布.而AJS 4.0 beta则在一年前就发布了. 关于AJS3和AJS4选择的问题,

初学ArcGIS API for JavaScript

初学ArcGIS API for JavaScript 对于初学者来说,关于esri提供的一些样式和dojo自带的一些样式还是需要有一定的了解,这块在<WebGIS开发从基础到实践>讲解的特别详细,在这里以笔记的形式来帮助自己加以理解和记忆. esri.css样式主要用于ESRI提供的小部件与组件,比如地图.信息框等.此外,还可以引用Dojo提供的样式表,Dojo提供了4组样式,分别是claro\tundra\soria以及nihilo,每种是一组定义用户界面的字体.颜色与大小等设置.在Arc

ArcGIS Api for Js基础

1.创建ArcGISDynamicMapServiceLayer var demographicsLayerURL = "http://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer"; var demographicsLayerOptions = { "id": "demographicsLayer", "opacity": 0.8,

ArcGIS API for JavaScript3.x 学习笔记[8] 动态地图服务图层

在ArcGIS API 中给我们提供了一个类叫做ArcGISDynamicMapServiceLayer利用这个类,我们可以获得发布的地图服务.调用动态地图服务一般只需要两步: 通过地图服务的URL创建一个ArcGISDynamicMapServiceLayer对象 将动态地图服务的对象添加到地图容器中 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"

ArcGIS API调用动态地图服务

引言 调用动态地图服务 需求 1根据需求隐藏服务中的某一个图层 11代码解释 2通过属性查询地图服务中的信息 21代码实现 22代码解释 3通过空间查询地图服务中的信息 31代码实现 32代码解释 4补充 1.引言 在本篇博客中主要记录一下在ArcGIS API如何调用自己发布的动态地图服务,利用动态地图服务我们可以完成哪一些需求等等. 注:(如何利用ArcGIS Server发布动态地图服务请看博客ArcGIS Server发布动态地图服务), 2.调用动态地图服务 在ArcGIS API 中

ArcGIS API for Silverlight中加载Google地形图(瓦片图)

原文:ArcGIS API for Silverlight中加载Google地形图(瓦片图) 在做水利.气象.土地等行业中,若能使用到Google的地形图那是再合适不过了,下面就介绍如何在ArcGIS API for Silverlight中加载Google地 形图.先上一个图,初步制作,待后续继续改进 ArcGIS API for Silverlight 中的ArcGISTiledMapServiceLayer图层,继承自TiledMapServiceLayer.如果想实现自己的缓存地图图 层

我的ArcGIS API for Javascript

为大家贴贴最基本的地图加载: 一. API 根据Dom树上节点的 ID 确定 Map 的显示位置; 二. setBasemap 方法可得到一些ArcGIS制作好的底图,例如: "streets" , "satellite" , "hybrid", "topo", "gray", "oceans", "national-geographic", "osm&qu

ArcGIS API for JavaScript 学习笔记 (一) --第一个WebGIS应用程序

说明:本地部署后续我会尝试. 简单介绍: 开发环境是Visual Studio 2012,因为它为所有的.aspx文件..htm文件以及外部的.js文件提供了IntelliSense(智能提示),相当于其他软件的代码自动补全功能,非常方便.接下来是我的第一个Javascript API 应用程序.ESRI在其arcgis online中提供了在线的ArcGIS API for JavaScript,在web应用中直接引用即可,无需下载安装:当然也可以下载API,然后部署到自己的web服务器,在这

ArcGIS Api For Flex 动态画点和线

<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:supportCl