好久没写博文了,今天出来冒个泡。

最近一直在考虑一件事情,那就是openlayers中自定义wms的图层控制。用过openlayers的人都知道,在openlayers中有自带的图层控制的控件,调用方法也很简单:

map.addControl(new OpenLayers.Control.LayerSwitcher({'ascending':true}));//图层控制

但是,不论是从操作的方便程度还是美观性方面考虑,自带的图层控制是无法满足需求的,考虑了一段时间,今天终于有时间实现了,下面就说说我的实现思路。

首先,说说难点,用过arcgis for javascript的人都知道,在arcgis for javascript API中的wmsLayer有setVisibleLayers(layers)的方法,可以很方便的实现WMS的图层控制,但是在openlayers的wms没有类似的实现方法,所以得自己考虑实现。

接着,说说实现的环境。地图服务我用的是geoserver,图层控制用jquery的zTree,下面详细说说我的实现步骤。

1、在geoserver中发布wms图层,发布的图层包括以下。

var zNodes =[
	{ id:"base", pId:0, name:"行政区划图", open:true},
	{ id:"china:capital", pId:"base", name:"省会城市"},
	{ id:"china:pro_polygon", pId:"base", name:"省级行政区"},
	{ id:"theme", pId:0, name:"专题图", open:true},
	{ id:"china:lake", pId:"theme", name:"湖泊"}
];

2、地图发布好以后就定义地图与图层,并将图层添加到地图中。

map = new OpenLayers.Map('map');
wms=GetExtendWms('china:pro_polygon',"wms",false);
map.addLayer(wms);

GetExtendWms的方法代码如下:

var GetExtendWms = function(layer,layername,visibility){
	var wms = new OpenLayers.Layer.WMS(
		layername,
		"http://localhost:8088/geoserver/china/wms",
		{
			LAYERS: layer,
			transparent:true,
			STYLES: '',
			format: format
		},
		{
			singleTile: false,
			ratio: 1,
			isBaseLayer: false,
			visibility:visibility,
			yx : {'EPSG:4326' : true}
		}
	);
	return wms;
}

在图层初始化的时候不显示wms。

3、创建图层控制面板与树

var setting = {
	check: {
		enable: true
	},
	data: {
		simpleData: {
			enable: true
		}
	},
	callback: {
		onCheck: getCheckedNodes
	}
};
$(document).ready(function(){
	$.fn.zTree.init($("#tree"), setting, zNodes);
});

树创建完成后效果如下:

没有对样式做太大的装饰,比较丑陋,先凑合用。

4、图层控制的实现
主要效果为选中图层控制目录的节点,在图中显示该图层,取消选择,不显示该图层。图层节点的选中与否主要是实现zTree的onCheck事件,实现方法为getCheckedNodes,代码如下:
function getCheckedNodes(){
	var checked="";
	var zTree = $.fn.zTree.getZTreeObj("tree");
	var checkedNodes = zTree.getCheckedNodes(true);
	if(checkedNodes.length!=0){
		for(var i=0;i<checkedNodes.length;i++){
			if(!checkedNodes[i].isParent){
				checked+=checkedNodes[i].id+",";
			}
		}
		checked=checked.substring(0,checked.length-1);
		map.removeLayer(wms);
		wms=GetExtendWms(checked,"wms",true);
		map.addLayer(wms);
	}
	else{
		map.removeLayer(wms);
		wms=GetExtendWms('china:pro_polygon',"wms",false);
		map.addLayer(wms);
	}
}

思路是:首先获取选中的子节点的图层的名称,如果有子节点被选中,在地图中将wms图层移除,再定义wms的图层为选中的子节点,并设置其可见为true,并将wms添加到地图中,这时选中的涂层就会在地图中显示;如果没有节点被选中,在地图中将wms图层移除,再定义wms的图层为任一图层,设置其可见为false,将wms添加到地图中,wms就不会在地图中显示。实现后的效果如下:


没有节点选中

选中“省级行政区”节点

总结:虽然在效果上实现了类似于图层控制的效果,但是始终感觉这种方式不怎么靠谱,不知道哪位仁兄有更好的办法,小弟在线等答案!



openlayers自定义图层控制的实现的更多相关文章

  1. OpenLayers 3 的 图层控制控件

    openlayers3的control中没有提供默认的图层控制控件. 但是git上已经有造好的轮子,直接拿来用就可以了.地址 https://github.com/walkermatt/ol3-lay ...

  2. 【百度地图API】如何自定义地图图层?实例:制作麻点图(自定义图层+热区)

    原文:[百度地图API]如何自定义地图图层?实例:制作麻点图(自定义图层+热区) 摘要:自定义地图图层的用途十分广泛.常见的应用,比如制作魔兽地图和清华校园地图(使用切图工具即可轻松实现).今天我们来 ...

  3. arcgis api for js入门开发系列七图层控制(含源代码)

    上一篇实现了demo的地图分屏对比模块,本篇新增图层控制模块,截图如下(源代码见文章底部): 图层控制模块实现的思路如下: 1.在地图配置文件map.config.js里面配置图层目录树节点信息,作为 ...

  4. PHP之自定义会话控制---使用文件处理

    前三篇简单的总结了下会话控制和文件操作,这一篇说说会话控制的自定义处理方式.既然知道了文件的基本读写,而且在会话控制中,也有人提到,session数据可以保存到缓存或数据库中,实际上当然不会是直接利用 ...

  5. arcgis for javascript之ArcGISDynamicMapServiceLayer图层控制的实现

    图层控制是非常多GIS系统里面必须的一个小功能,本文就说说arcgis for javascript下ArcGISDynamicMapServiceLayer图层控制的实现方式.首先看图: 实现效果 ...

  6. openlayers4 入门开发系列之图层控制(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  7. arcgis api 3.x for js 入门开发系列七图层控制(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  8. ios中自定义图层的2种方法

    1:自定义图层,在图层中画图 #import <QuartzCore/QuartzCore.h> @interface MJLayer : CALayer @end #import &qu ...

  9. ios中自定义图层

    图层和VIEW的区别 1:view不具备显示功能,是因view内部有一个图层,才能显示出来 2:图层不具备事件功能,VIEW继承UIRespone具有处理事件功能 3:自定义的图层有一个影式动画,VI ...

随机推荐

  1. URAL - 1901 Space Elevators

    题目: Nowadays spaceships are never launched from the Earth's surface. There is a huge spaceport place ...

  2. NGUI如何使用汉字

    1:准备好字体文件,就是ttf后缀名的那些.. 2:在第一个红线部分,将下拉框选择为Unity,在后面的字体里面选择第一步准备好的字体. 3:创建UILabel,widget里面的Color才是字体的 ...

  3. 使用sqoop把mysql数据导入hive

    使用sqoop把mysql数据导入hive export HADOOP_COMMON_HOME=/hadoop export HADOOP_MAPRED_HOME=/hadoop   cp /hive ...

  4. springboot-vue项目后台2---pojo对查询结果手动分组

    <resultMap id="PResult" type="packs" > <result column="device_type ...

  5. linux命令详解之(at)--6/24

    在Linux下,有两个命令可以用来作为计划任务而执行,at:一次性定时任务计划执行crontab :每天定时任务计划执行 以下仅说一下一次性任务计划执行(at)要使用一次性任务计划,linux必须要有 ...

  6. HCNP学习笔记之TCP中FLAGS字段SYN, FIN, ACK, PSH, RST, URG

    在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG. 其中,对于我们日常的分析有用的就是前面的五个字段. 含义: SYN 表示建立连接, ...

  7. Spring Cloud 微服务开放平台接口

    github源码地址:https://github.com/spring-cloud/spring-cloud-security 前言: 什么是开放平台接口 场景 : 总公司与子公司 对接接口  还有 ...

  8. redis主从、集群、哨兵

    redis的主从.集群.哨兵 参考: https://blog.csdn.net/robertohuang/article/details/70741575 https://blog.csdn.net ...

  9. Mac OS X 下部分Android手机无法连接adb问题之解决方案

    [原文]  时至当今,Android山寨手机厂商已如此之多,能修改和个性化定制Android OS的能人已是多如牛毛,有的牛人修改Android系统只会影响所修改的点,不会影响其它,然后还有的就不多说 ...

  10. Remove Duplicates from Sorted List ,除去链表中相邻的重复元素

    Remove Duplicates from Sorted List : Given a sorted linked list, delete all duplicates such that eac ...