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 相关文章推荐
在IE模态窗口中自由查看HTML源码的方法
Mar 08 Javascript
javascript实现动态CSS换肤技术的脚本
Jun 29 Javascript
浏览器中url存储的JavaScript实现
Jul 07 Javascript
jqGrid中文文档之选项设置
Dec 02 Javascript
Javascript获取统一管理的提示语(message)
Feb 03 Javascript
聊一聊JS中this的指向问题
Jun 17 Javascript
利用jQuery实现打字机字幕效果实例代码
Sep 02 Javascript
老生常谈js中0到底是 true 还是 false
Mar 08 Javascript
使用vuex缓存数据并优化自己的vuex-cache
May 30 Javascript
Vue CLI 3搭建vue+vuex最全分析(推荐)
Sep 27 Javascript
angularJs中ng-model-options设置数据同步的方法
Sep 30 Javascript
详解vue beforeEach 死循环问题解决方法
Feb 25 Javascript
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
PHP 和 MySQL 开发的 8 个技巧
2007/01/02 PHP
不用mod_rewrite直接用php实现伪静态化页面代码
2008/10/04 PHP
php的闭包(Closure)匿名函数详解
2015/02/22 PHP
php生成4位数字验证码的实现代码
2015/11/23 PHP
[原创]smarty简单模板变量输出方法
2016/07/09 PHP
List Information About the Binary Files Used by an Application
2007/06/18 Javascript
javascript 日期时间函数(经典+完善+实用)
2009/05/27 Javascript
通过JQuery实现win8一样酷炫的动态磁贴效果(示例代码)
2013/07/13 Javascript
js实现页面跳转重定向的几种方式
2014/05/29 Javascript
jquery获取节点名称
2015/04/26 Javascript
javascript使用 concat 方法对数组进行合并的方法
2016/09/08 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
vue组件jsx语法的具体使用
2018/05/21 Javascript
在小程序中使用canvas的方法示例
2018/09/17 Javascript
JS控制只能输入数字并且最多允许小数点两位
2019/11/24 Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
2020/12/09 Javascript
[40:01]OG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
2014/11/18 Python
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
2015/04/25 Python
python脚本设置系统时间的两种方法
2016/02/21 Python
深入解析Python设计模式编程中建造者模式的使用
2016/03/02 Python
python删除某个目录文件夹的方法
2020/05/26 Python
详解用 python-docx 创建浮动图片
2021/01/24 Python
CSS3中border-radius属性设定圆角的使用技巧
2016/05/10 HTML / CSS
美国眼镜网:GlassesUSA
2017/09/07 全球购物
水果花束:Fruit Bouquets
2017/12/20 全球购物
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
法律专业个人实习自我鉴定
2013/09/23 职场文书
勤奋学习演讲稿
2014/05/10 职场文书
九一八事变演讲稿范文
2014/09/14 职场文书
会计工作态度自我评价
2015/03/06 职场文书
第二次离婚起诉书
2015/05/18 职场文书
女方离婚起诉书
2015/05/18 职场文书
一文了解MySQL二级索引的查询过程
2022/02/24 MySQL
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js
nginx 添加http_stub_status_module模块
2022/05/25 Servers