openlayers自定义图层控制的实现

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

最近一直在考虑一件事情,那就是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就不会在地图中显示。实现后的效果如下:

没有节点选中

选中“省级行政区”节点

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

时间: 2024-08-03 08:20:19

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

iOS开发——图形编程OC篇&amp;(二)CALayer自定义图层

一.第一种方式 1.简单说明 以前想要在view中画东西,需要自定义view,创建一个类与之关联,让这个类继承自UIView,然后重写它的DrawRect:方法,然后在该方法中画图. 绘制图形的步骤: (1)获取上下文 (2)绘制图形 (3)渲染图形 如果在layer上画东西,与上面的过程类似. 代码示例: 新建一个类,让该类继承自CALayer YYMylayer.m文件 1 // 2 // YYMylayer.m 3 // 05-自定义layer(1) 4 // 5 // Created b

ArcGis for Android中如何获取自定义图层中的图片并旋转

============问题描述============ RT,在GraphicsLayer自定义图层中,有一个图片,现在可以获取到手机的旋转角度,然后根据角度去旋转那个图片.现在只能remove掉GraphicsLayer后旋转图片重新添加到map中,这样的话会非常不连贯,达不到百度地图的旋转效果,请教大神们如何解决? ============解决方案1============ BitmapDrawable bd = new BitmapDrawable(context.getResource

【Core Animation】系列之(一) 自定义图层

UIView的一个重要组成就是CALayer, 我们先创建一个自定义图层 //创建一个图层 CALayer *layer = [CALayer layer]; //设置大小 layer.bounds = CGRectMake(0, 0, 60, 60); //设置位置 layer.position = CGPointMake(100, 200); //设置背景色 layer.backgroundColor = [UIColor blueColor].CGColor; [self.view.lay

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

前三篇简单的总结了下会话控制和文件操作,这一篇说说会话控制的自定义处理方式.既然知道了文件的基本读写,而且在会话控制中,也有人提到,session数据可以保存到缓存或数据库中,实际上当然不会是直接利用php的session处理机制,将所有用户的session信息保存报一个文件中,访问量大.信息数据多.无法共享等等问题可能会出现,因此,我们需要自定义会话控制.在实现自定义会话控制前,就要知道php本身是如何来做会话管理的,.这里,就简单的实现它被保存到自定义目录下的文件里边,那么缓存或数据库就很明

ggplot2绘图入门系列之二:图层控制与直方图

如前文所述,ggplot2使用图层将各种图形元素逐步添加组合,从而形成最终结果.第一层必须是原始数据层,其中data参数控制数据来源,注意数据形式只能是数据框格式.aes参数控制了对哪些变量进行图形映射,以及映射方式,aes是Aesthetic的缩写. 下面我们来绘制一个直方图作为示例.数据集仍采取mpg,对hwy变量绘制直方图.首先加载了扩展包,然后用ggplot函数建立了第一层,hwy数据映射到X轴上:使用+号增加了第二层,即直方图对象层.此时p被视为一种层对象,使用summary函数可得到

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

图层控制是很多GIS系统里面必须的一个小功能,本文就说说arcgis for javascript下ArcGISDynamicMapServiceLayer图层控制的实现方式.首先看图: 实现效果 重点有以下两点:1.获取ArcGISDynamicMapServiceLayer的图层:2.控制图层的显示.图层的获取可通过layerInfos实现,图层的显示通过setVisibleLayers实现,源代码如下: <!DOCTYPE html> <html> <head>

【iOS开发-图层】自定义图层的两种方式

想要自定义图层,只需要构建一个类继承CALayer方法 如果让自定义图层初始化上面就有画好的图形,有两种办法 重写drawInContext方法 自定义的图层下面的方法,然后必须自定义的图层对象显示调用 [layer setNeedsDisplay]然后才会调用这个方法; 自定图层文件 - (void)drawInContext:(CGContextRef)ctx { CGContextSetRGBFillColor(ctx, 1, 0, 0, 1);//设置红色 CGContextAddEll

【iOS开发-90】CALayer图层:自定义图层,图层的一些动画

(1)效果 (2)代码 http://download.csdn.net/detail/wsb200514/8261547 (3)总结 --可以自定义图层,尤其需要对图片进行圆角裁剪. --图层的动画都是假象,其实属性根本没有变化,尽管用如下代码,但也只是强制让图层停留在最后的地方,实际属性还是没有变. anim.fillMode=kCAFillModeForwards; anim.removedOnCompletion=NO; --尽量使用UIView的动画,少用CALayer的动画.

OpenLayers 之 图层(Layers) 详解

声明:文章为本人原创,转载或使用请注明作者和出处!!谢谢! 如果不是专业的地图工作者,看到地图,可能觉得地图就是一张将三维世界映射到二维空间,很多信息混杂在一起表示空间信息的动态可交互图片,其实这只是表面现象.实际上地图是由一个或多个图层组成的,使用不同的图层存储不同类型的地物,比如由存储道路的图层,有展示拥堵情况的图层,通常还有一个含有基础地理信息(比如政区划分)的底图图层. 在 OpenLayers 中,图层是使用 layer 对象表示的,主要有 热度图层(heatmaplayer).图片图