OpenLayers实现图层切换控件


Posted in Javascript onSeptember 25, 2020

OpenLayers并没有封装图层切换的控件,所以我们需要自己来实现图层控件。

自定义图层切换控件的原理很简单:显示某个图层时,将其他图层隐藏。

完整代码:

layerSwitch.html:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>图层切换控件</title>
 <link rel="stylesheet" href="../v5.3.0/css/ol.css" />
 <script src="../v5.3.0/build/ol.js"></script>
</head>
<body>
 <div id="controls">
 <input type="checkbox" id="osm" checked />OpenStreetMap
 <input type="checkbox" id="bingmap" />Bing Map
 <input type="checkbox" id="stamen" />Stamen Map
 </div>
 <div id="map"></div>
 
 <script>
 let map = new ol.Map({
  target: 'map', // 关联到对应的div容器
  layers: [
  new ol.layer.Tile({ // OpenStreetMap图层
   source: new ol.source.OSM() 
  }),
  new ol.layer.Tile({ // Bing Map图层
   source: new ol.source.BingMaps({
   key: '略', // 可以自行到Bing Map官网申请key
   imagerySet: 'Aerial'
   }),
   visible: false // 先隐藏该图层
  }),
  new ol.layer.Tile({
   source: new ol.source.Stamen({
   layer: 'watercolor'
   }),
   visible: false // 先隐藏该图层
  })
  ],
  view: new ol.View({ // 地图视图
  projection: 'EPSG:3857',
  center: [0, 0],
  zoom: 0
  })
 });
 
 let controls = document.getElementById('controls'); 
 // 事件委托
 controls.addEventListener('click', (event) => {
  if(event.target.checked){ // 如果选中某一复选框
  // 通过DOM元素的id值来判断应该对哪个图层进行显示
  switch(event.target.id){
   case "osm": 
   map.getLayers().item(0).setVisible(true);
   break;
   case "bingmap":
   map.getLayers().item(1).setVisible(true);
   break;
   case "stamen": 
   map.getLayers().item(2).setVisible(true);
   break;
   default: break;
  }
  }else{  // 如果取消某一复选框
  // 通过DOM元素的id值来判断应该对哪个图层进行隐藏
  switch(event.target.id){
   case "osm": 
   map.getLayers().item(0).setVisible(false);
   break;
   case "bingmap":
   map.getLayers().item(1).setVisible(false);
   case "stamen": 
   map.getLayers().item(2).setVisible(false);
   default: break;
  }
  } 
 });
 </script>
</body>
</html>

实现效果:

OpenLayers实现图层切换控件

代码整体逻辑是很简单的,其中使用了事件委托这一机制来绑定事件,事件委托可以减少事件绑定导致的内存消耗,所以平时开发时推荐多使用事件委托。

另外,map.getLayers()返回一个ol.Collection类的对象,该对象中包含了地图中的三个图层对象(ol.layer.Tile),可以为item()方法传入对应索引来取出对应图层对象。

最后,ol.layer.Tile类的setVisible()方法可以设置图层的显示与隐藏。

怎么样,自己实现一个图层切换控件是不是很简单呢?

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
Feb 05 Javascript
JavaScript toFixed() 方法
Apr 15 Javascript
jQuery 获取和设置select下拉框的值实现代码
Nov 08 Javascript
JS下载文件|无刷新下载文件示例代码
Apr 17 Javascript
AngularJS 自定义指令详解及示例代码
Aug 17 Javascript
js时间控件只显示年月
Jan 08 Javascript
js实现数字递增特效【仿支付宝我的财富】
May 05 Javascript
Angular使用Md5加密的解决方法
Sep 16 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
Oct 27 Javascript
javascript设计模式 ? 原型模式原理与应用实例分析
Apr 10 Javascript
Vue是怎么渲染template内的标签内容的
Jun 05 Javascript
vue.js Router中嵌套路由的实用示例
Jun 27 Vue.js
OpenLayers3实现对地图的基本操作
Sep 28 #Javascript
vue中实现弹出层动画效果的示例代码
Sep 25 #Javascript
OpenLayers3加载常用控件使用方法详解
Sep 25 #Javascript
在webstorm中配置less的方法详解
Sep 25 #Javascript
OpenLayers加载缩放控件使用方法详解
Sep 25 #Javascript
Javascript confirm多种使用方法解析
Sep 25 #Javascript
OpenLayers3实现地图显示功能
Sep 25 #Javascript
You might like
《星际争霸2》终章已出 RTS时代宣告终结
2017/02/07 星际争霸
PHP写日志的实现方法
2014/11/05 PHP
Yii扩展组件编写方法实例分析
2015/06/29 PHP
javascript css在IE和Firefox中区别分析
2009/02/18 Javascript
原生js 秒表实现代码
2012/07/24 Javascript
jQuery带箭头提示框tooltips插件集锦
2014/11/17 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
Bootstrap每天必学之表格
2015/11/23 Javascript
JS给Array添加是否包含字符串的简单方法
2016/10/29 Javascript
BootStrap 图片样式、辅助类样式和CSS组件的实例详解
2017/01/20 Javascript
webpack引入eslint配置详解
2018/01/22 Javascript
详解webpack 热更新优化
2018/09/13 Javascript
Vue中父子组件的值传递与方法传递
2020/09/28 Javascript
Python中的pprint折腾记
2015/01/21 Python
简单介绍Python的Tornado框架中的协程异步实现原理
2015/04/23 Python
Python封装shell命令实例分析
2015/05/05 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
2019/06/24 Python
python sorted方法和列表使用解析
2019/11/18 Python
python编写一个会算账的脚本的示例代码
2020/06/02 Python
CSS3 :nth-child()伪类选择器实现奇偶行显示不同样式
2013/11/05 HTML / CSS
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
夏尔巴人登珠峰品牌:Sherpa Adventure Gear
2018/02/08 全球购物
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
用C#语言写出与SQLSERVER访问时的具体过程
2013/04/16 面试题
小学教师师德感言
2014/02/10 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
教师节感谢信
2015/01/22 职场文书
庐山导游词
2015/02/03 职场文书
社区三八妇女节活动总结
2015/02/06 职场文书
2015年学校总务工作总结
2015/07/20 职场文书
劳动合同变更协议书范本
2019/04/18 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript
sqlserver2017共享功能目录路径不可改的解决方法
2021/04/16 SQL Server
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python
Python中Numpy和Matplotlib的基本使用指南
2021/11/02 Python