Openlayers进阶学习——多标注显示/点击弹出框/图层控制/搜索定位/新增标注等
来源:互联网 发布:产品培训知乎 编辑:程序博客网 时间:2024/06/16 14:48
一、多标注显示
1、多标注显示:通过Feature和Marker实现多点标注。
我对openlayers例子提供的代码做了一些改动,添加单个标注函数如下:
/** * Function: addMarker * Add a new marker to the markers layer given the following lonlat, * popupClass, and popup contents HTML. Also allow specifying * whether or not to give the popup a close box. * * Parameters: * ll - {<OpenLayers.LonLat>} Where to place the marker * popupClass - {<OpenLayers.Class>} Which class of popup to bring up * when the marker is clicked. * popupContentHTML - {String} What to put in the popup * closeBox - {Boolean} Should popup have a close box? * overflow - {Boolean} Let the popup overflow scrollbars? */ function addMarker(markerName,icon,ll, popupClass, popupContentHTML, closeBox, overflow) { var feature = new OpenLayers.Feature(markerName,ll,{icon:icon.clone()}); feature.closeBox = closeBox; feature.popupClass = popupClass; feature.data.popupContentHTML = popupContentHTML; feature.data.overflow = (overflow) ? "auto" : "hidden"; var marker = feature.createMarker(); var markerClick = function (evt) { if (this.popup == null) { this.popup = this.createPopup(this.closeBox); this.popup.setBackgroundColor("#E2E7EB"); this.popup.setBorder("1px #0066ff solid"); map.addPopup(this.popup); this.popup.show(); } else { this.popup.toggle(); } currentPopup = this.popup; OpenLayers.Event.stop(evt); }; marker.events.register("mousedown", feature, markerClick); markerName.addMarker(marker); }
上诉函数中
if (this.popup == null) { this.popup = this.createPopup(this.closeBox); this.popup.setBackgroundColor("#E2E7EB"); this.popup.setBorder("1px #0066ff solid"); map.addPopup(this.popup); this.popup.show(); } else { this.popup.toggle(); } currentPopup = this.popup;
同时也实现了点击弹出框的效果,显示内容见下面。
var url = 'gis/img/cctv.gif';var sz = new OpenLayers.Size(20, 20); //尺寸大小var calculateOffset = function(size) {return new OpenLayers.Pixel(-(size.w/2), -size.h); }; var icon = new OpenLayers.Icon(url, sz, null, calculateOffset); var lonLat,popupContentHTML,popupClass; if(cctvList == null){ return; }//遍历显示for(var i=0;i<cctvList.length;i++){lonLat = new OpenLayers.LonLat(cctvList[i].gis_x,cctvList[i].gis_y);//google地图需要转换坐标lonLat.transform(map.displayProjection, map.getProjectionObject());device_name = cctvList[i].device_name;//popupContentHTML = "<b> 治安监控<br> "+device_name+"</b>";popupContentHTML = createPopupContentHTML('治安监控',cctvList[i]);popupClass = OpenLayers.Popup.Anchored;addMarker(cctvMarkers,icon,lonLat, popupClass, popupContentHTML,true);}其中cctvList是从数据库获取设备列表json格式;
createPopupContentHTML函数实现点击GIS标注弹出框显示内容;
cctvMarkers是定义的全局图层变量,用于多图层显示控制;
用户通过遍历将多个点在GIS上显示;
二、图层控制
通过定义全局Markers变量实现不同图层的显示控制。
预先定义几个变量,如:var cctvMarkers,tgsMarkers,epsMarkers; 每个变量表示一个图层,每个图层上的标注通过方法一实现添加即可;
在页面加载时把各图层的标注全部加载完毕,需要隐藏某一个图层则通过调用Markers.clearMarkers()方法清理掉该图层数据即可,待需要显示时再重新加载,即调用方法一即可。
//隐藏图层function hiddenMarker(markerName){if(markerName == 'cctv'){cctvMarkers.clearMarkers();}else if(markerName == 'tgs'){tgsMarkers.clearMarkers();}else{epsMarkers.clearMarkers();}}
三、搜索定位
搜索定位其实首先是从数据库中根据关键字查找出符合的结果项,然后再将这些结果根据坐标在GIS上进行渲染标注,当点击某一结果是进行定位;
我这里定位的实现是通过marker标注的定位图片的方式实现,这样做有个问题就是定位marker会覆盖方法一中设备的点击弹出事件,我这里用了最笨的方法就是定位标注时重新注册点击弹出事件。关键代码如下:
//gis定位并居中function deviceLocate(data){//alert(data);var url = 'jsp/gis/img/location.gif';var sz = new OpenLayers.Size(25, 30); //尺寸大小var calculateOffset = function(size) {return new OpenLayers.Pixel(-(size.w/2), -size.h); };var icon = new OpenLayers.Icon(url, sz, null, calculateOffset);var lonLat = new OpenLayers.LonLat(locationDataList[data].gis_x,locationDataList[data].gis_y);//google地图需要转换坐标lonLat.transform(map.displayProjection, map.getProjectionObject());locateMarkers.clearMarkers();//var popupContentHTML,popupClass;var title = '设备信息';if(locationDataList[data].device_type == '10'){title = '卡口';}else if(locationDataList[data].device_type == '11'){title = '电警';}else if(locationDataList[data].device_type == '12'){title = '治安监控';}popupContentHTML = createPopupContentHTML(title,locationDataList[data]);popupClass = OpenLayers.Popup.Anchored;addMarker(locateMarkers,icon,lonLat, popupClass, popupContentHTML,true);//locateMarkers.addMarker(new OpenLayers.Marker(lonLat, icon));//居中显示map.setCenter(lonLat, 4);}
四、新增标注
在GIS上添加新标注只需获取相应的经纬度坐标,保存志数据库即可。
init方法里增加
//单击事件var click = new OpenLayers.Control.Click(); map.addControl(click); click.activate();单机获取坐标函数
//单击事件响应 OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, { defaultHandlerOptions: { 'single': true, 'double': false, 'pixelTolerance': 0, 'stopSingle': false, 'stopDouble': false }, initialize: function(options) { this.handlerOptions = OpenLayers.Util.extend( {}, this.defaultHandlerOptions ); OpenLayers.Control.prototype.initialize.apply( this, arguments ); this.handler = new OpenLayers.Handler.Click( this, { 'click': this.trigger }, this.handlerOptions ); }, trigger: function(e) { markers.clearMarkers(); var url = 'gis/img/biaozhu.png'; var sz = new OpenLayers.Size(30, 30); //尺寸大小 var calculateOffset = function(size) { return new OpenLayers.Pixel(-(size.w/2), -size.h); }; var icon = new OpenLayers.Icon(url, sz, null, calculateOffset); var lonlat = map.getLonLatFromPixel(e.xy);marker = new OpenLayers.Marker(lonlat, icon);markers.addMarker(marker);//将墨卡托坐标转换成经纬坐标lonlat.transform(new OpenLayers.Projection("EPSG:900913"),new OpenLayers.Projection("EPSG:4326")); //坐标传回给父页面变量parent.gisx = lonlat.lon.toFixed(5);parent.gisy = lonlat.lat.toFixed(5); } });
典型界面如下:
7 0
- Openlayers进阶学习——多标注显示/点击弹出框/图层控制/搜索定位/新增标注等
- SharpMap增加标注图层LabelLayer及标注样式控制
- openlayers 2实现vector图层文字标注
- supermap 学习系列(二)——添加标注(鼠标点击弹出窗口)
- 添加标注图层
- OpenLayers学习笔记5——使用jQuery UI实现查询并标注(UI篇)
- OpenLayers学习笔记8——使用servlet从mysql获取数据并标注
- Openlayers之地图标注
- Openlayers之Popup标注
- Openlayers之聚合标注
- Maplex高级标注控制—道路压盖
- 按照比例尺标注图层
- OpenLayers学习笔记6——使用jQuery UI实现查询并标注(功能实现篇)
- 基于内容的视频标注——视频类型层标注
- 基于内容的视频标注——关键帧图象层标注
- 基于内容的视频标注——物体层视频标注
- ArcGIS API for Silverlight之Web Mapping开发:根据图层属性查询、定位、高亮显示并显示标注(2)
- 标注
- 在toString()方法中不要单独使用this关键字,否则会产生递归调用
- Linux Mint + Apache2.2搭建SSL/HTTPS/SPDY服务器
- FusionCharts简单教程(二)-----使用js加载图像和setDataXML()加载数据
- B - 一个人的旅行
- 可变长参数方法注意事项
- Openlayers进阶学习——多标注显示/点击弹出框/图层控制/搜索定位/新增标注等
- 使用Hibernate.initialize解决no session的延迟加载问题
- Linux下使用PHP远程连接Oracle----笛风读书笔记系列
- 使用VC6将32位程序编译成为64位程序
- DDR2芯片内部终结ODT技术解析
- 浙大PAT 1067题 1067. Sort with Swap(0,*)
- vs还原窗口布局
- SPI总线之CPOL CPHA(转)
- linux 指令大全