看别人搞的GIS应用,常常有勾选、取消某个图层的操作,然后地图上就有相应的图形显隐,觉得好酷。

咋实现的?

其实说起来好像也不是特别复杂。在WEB端,实现该功能的原理和步骤是:

1、WEB端加载地图服务的时候,可以拿到图层信息,包括名称,ID,父ID,子图层数组,默认可见性,等等。

2、如此,即可以在WEB端列出图层信息矣

3、在列出图层的同时,可根据图层的默认可见性来控制图层的显隐,这是初始化阶段

4、之后,手动勾选每个图层前面的复选框,每勾选一次,则遍历图层列表,凡checked=true的,都将该图层ID放入某个数组,然后该数组作为参数,调用设置函数,如此,可相应控制图层显隐矣。

由4可知,控制任一图层的显示或隐藏,策略都是重绘地图。

代码如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>zt</title>
<link rel="stylesheet" type="text/css" href="http://localhost/arcgis_js_api/library/3.15/3.15/dijit/themes/tundra/tundra.css"/>
<link rel="stylesheet" type="text/css" href="http://localhost/arcgis_js_api/library/3.15/3.15/esri/css/esri.css" />
<style type="text/css">
.block{
border:1px solid #999;
height:600px;
}
.list_item{ }
</style>
</head>
<body class="tundra">
<div id="mapDiv" style="float:right;width:85%;" class="block"></div>
<div id="layer_list" style="float:right;width:13%;margin-right:10px;" class="block"></div>
</body>
</html> <script type="text/javascript" src="http://localhost/arcgis_js_api/library/3.15/3.15/init.js"></script>
<script type="text/javascript">
dojo.require("esri.map");
var map,visible = [];
var layer;
function init() {
map = new esri.Map("mapDiv", {logo:false}); layer = new esri.layers.ArcGISDynamicMapServiceLayer("http://WIN-NH9JATPNTFA:6080/arcgis/rest/services/ZT/MapServer"); if (layer.loaded) {
buildLayerList(layer);
}
else {
dojo.connect(layer, "onLoad", buildLayerList);
}
}
function buildLayerList(layer) {
var items = dojo.map( // 适用于回调到给定数组中的每个元素,并返回一个数组的结果。
layer.layerInfos, // 在服务返回可见的图层的数组,默认是可见的
function(info,index){
if(info.parentLayerId != -1){
if (info.defaultVisibility) {
visible.push(info.id); // 将id编号放入数组中
}
return "<div><input type='checkbox' class='list_item'" + (info.defaultVisibility ? "checked=checked" : "") + "' id='" + info.id + "' onclick='updateLayerVisibility();' /><label for='" + info.id + "'>" + info.name + "(" + info.parentLayerId + ")</label></div>";
}
}
);
dojo.byId("layer_list").innerHTML = items.join(' ');
layer.setVisibleLayers(visible,true); // setVisibleLayers(ids, doNotRefresh?) 默认为false(及时刷新)
map.addLayer(layer); // 将图层加入到地图中
}
function updateLayerVisibility() {
var inputs = dojo.query(".list_item"), input; // 使用dojo.query()方法查询 visible = []; // 遍历每一个文本框
dojo.forEach(inputs,function(input){
if (input.checked) {
visible.push(input.id); // 填充数组值
}
});
// 如果它们中有任何一个不显示的图层将 设置数组为 -1
if(visible.length === 0){
visible.push(-1);
}
layer.setVisibleLayers(visible);
}
dojo.addOnLoad(init);
</script>

有个东西忘了讲,如果父层默认显示,并且选中,则子层的勾选没有意义,任你怎么点,都没啥反应,全部都是可见。所以我在代码中,并没有将根层列出来。

WEBGIS控制图层的显示的更多相关文章

  1. (二十)WebGIS中图层树功能的设计和实现

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 在GIS的桌面工具中,比如arcgis desktop或者S ...

  2. ArcGIS AO中控制图层中要素可见状态的总结

    一.DefinitionExpression 实现新建查询图层,查询结果要素为选中状态 该接口可以通过两种方法来控制要素的可见状态. 思路1 通过该接口的 DefinitionExpression 方 ...

  3. AE控制图层中要素可见状态的几种方法

    转自原文 AE控制图层中要素可见状态的几种方法 工作中常有这样的需求,一个作业图层由几个作业员来操作,我们要 控制每一个作业员只能看到他负责的区域.作业员的可见区域控制有时候是按空间区域划分,有时候是 ...

  4. js 控制Div循环显示 非插件版

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. [转] 使用反射机制控制Toast的显示时间

    大体上说就是利用toast的内部类TN 来控制show和hide ,这是一个反射机制 怎么控制toast的显示时间呢?这个就是通过tn类的show和hide的方法 http://blog.csdn.n ...

  6. C# 计算字符串在控制台中的显示长度

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  7. js中控制小数点的显示位数的技术整理

    js中自带方法控制小数点的显示位数(四舍五入) alert((12.9299).toFixed(2)); //12.93 alert((12.9243).toFixed(2)); //12.92 小数 ...

  8. JS控制DIV隐藏显示

    转载自:http://blog.sina.com.cn/s/blog_6c3a67be0100ldbe.html JS控制DIV隐藏显示 一,需求描述: 现在有3个DIV块,3个超链接,需要点击一个链 ...

  9. jQuery控制TR的显示隐藏

    网上有很多,这里介绍三种: 第一种方法,就是使用id,这个方法可以在生成html的时候动态设置tr的id,也是用得最多最简单的一种,如下: <table> <tr><td ...

随机推荐

  1. Leetcode 354.俄罗斯套娃信封问题

    俄罗斯套娃信封问题 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现.当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样. 请计 ...

  2. BZOJ 2134 单选错位 ——期望DP

    发现概率是∑1/两道题答案相同的概率, 稍加化简 #include <map> #include <ctime> #include <cmath> #include ...

  3. bzoj 1818 Cqoi2010 内部白点 扫描线

    [Cqoi2010]内部白点 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1126  Solved: 530[Submit][Status][Disc ...

  4. com.alibaba.fastjson和org.json遍历获取key

    推荐都是用fastjson.org.json好像不支持序列化. com.alibaba.fastjson遍历获取key的方法: //fastjson解析方法 for (Map.Entry<Str ...

  5. angular中的this指向问题

    this是指向当前$scope的. 例如在ng-click的使用中,this是指向当前的$scope而并不是dom元素的. 我们可以使用this的一些方法和属性 我们打印一下this就会发现,this ...

  6. excel打乱各行的顺序,实现无序随机排列

    由于公司做活动,经常会发些激活码过来,为了让激活码能够充分使用,经常要打乱激活码的顺序,百度了下,看了下网上的介绍,还不错,挺实用,记录下来. 具体方法如下: 1.将文本里的内容复制到Excel里的任 ...

  7. Laravel 报500错误

    Laravel报500错误 发生情境: 使用Composer安装Laravel5.1版本到本地wamp环境,可以成功访问框架首页,然后上传到服务器上,报500错误. 解决: (1)在首页public/ ...

  8. AC日记——[USACO08DEC]干草出售Hay For Sale 洛谷 P2925

    题目描述 Farmer John suffered a terrible loss when giant Australian cockroaches ate the entirety of his ...

  9. android 服务

    1.创建服务 Exported:是否允许除了当前程序之外的其他程序访问这个服务 Enable:是否启用这个服务 点击完成后自动生成 import android.app.Service; import ...

  10. Idea基本讲解、常用配置以及快捷键设置

    IDEA官网学习文档:https://www.jetbrains.com/idea/documentation/ IDEA官网入门教程:https://www.jetbrains.com/help/i ...