本文实例为大家分享了OpenLayers3实现图层控件的具体代码,供大家参考,具体内容如下
1. 前言
在实际应用中,我们将加载到地图容器中的图层通过图层显示的控件功能,来显示加载的图层,便于用户查看与操作,OpenLayers 3 中并没有提供类似的图层控件,但是他的 API 却提供了该功能的相关接口,我们可以通过调用相关的接口,实现该功能。
2. 实现思路
(1)新建一个网页,参考前面的文章加载OSM瓦片图层的方法,加载OSM瓦片、MapQuest 影像、JSON 与KML 格式的矢量图。
(2)在地图容器中新建一个div 层,用于显示图层列表,在图层列表div 中,添加一个列表头部div 、图层列表 ul ,并通过 css 控制他的样式。
(3)编写加载图层列表的功能函数,在地图加载后,调用该方法,实现图层列表的展示。
3. 实现图层列表功能的代码如下:
html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>加载图层控件</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <link rel="stylesheet" href="css/ol.css" > <link rel="stylesheet" href="css/bootstrap.min.css" > <link rel="stylesheet" href="css/ZoomSlider.css" > <script src="/UploadFiles/2021-04-02/ol.js">代码解析:
创建一个id为 layerControl 的 div 作为显示图层列表,通过设置 z-index 让其显示到地图的上方,以及通过图层列表容器中新建一个列表(id为layerTree的ul)来承载地图容器中的图层。列表中的 li 是通过代码动态创建的,在html中只创建ul。
js代码 :
var layer = new Array(); //map中的图层数组 var layerName = new Array(); //图层名称数组 var layerVisibility = new Array(); //图层可见属性数组 /** * 加载图层列表数据 * @param {ol.Map} map 地图对象 * @param {string} id 图层列表容器ID */ function loadLayersControl(map, id) { var treeContent = document.getElementById(id); //图层目录容器 var layers = map.getLayers(); //获取地图中所有图层 for (var i = 0; i < layers.getLength(); i++) { //获取每个图层的名称、是否可见属性 layer[i] = layers.item(i); layerName[i] = layer[i].get('name'); layerVisibility[i] = layer[i].getVisible(); //新增li元素,用来承载图层项 var elementLi = document.createElement('li'); treeContent.appendChild(elementLi); // 添加子节点 //创建复选框元素 var elementInput = document.createElement('input'); elementInput.type = "checkbox"; elementInput.name = "layers"; elementLi.appendChild(elementInput); //创建label元素 var elementLable = document.createElement('label'); elementLable.className = "layer"; //设置图层名称 setInnerText(elementLable, layerName[i]); elementLi.appendChild(elementLable); //设置图层默认显示状态 if (layerVisibility[i]) { elementInput.checked = true; } addChangeEvent(elementInput, layer[i]); //为checkbox添加变更事件 } } /** * 为checkbox元素绑定变更事件 * @param {input} element checkbox元素 * @param {ol.layer.Layer} layer 图层对象 */ function addChangeEvent(element, layer) { element.onclick = function() { if (element.checked) { layer.setVisible(true); //显示图层 } else { layer.setVisible(false); //不显示图层 } }; } /** * 动态设置元素文本内容(兼容) */ function setInnerText(element, text) { if (typeof element.textContent == "string") { element.textContent = text; } else { element.innerText = text; } } function init() { //实例化Map对象加载地图 var map = new ol.Map({ target: 'map', //地图容器div的ID //地图容器中加载的图层 layers: [ //加载瓦片图层数据 new ol.layer.Tile({ source: new ol.source.OSM(), name: '世界地图(OSM瓦片)' }), new ol.layer.Vector({ source: new ol.source.Vector({ url: 'data/geojson/countries.geojson', format: new ol.format.GeoJSON() }), name: '国界(Json格式矢量图)' }), new ol.layer.Vector({ source: new ol.source.Vector({ url: 'data/kml/2012-02-10.kml', format: new ol.format.KML({ extractStyles: false }) }), name: '点(KML格式矢量图)' }) ], //地图视图设置 view: new ol.View({ center: [0, 0], //地图初始中心点 zoom: 2 //地图初始显示级别 }) }); //实例化ZoomSlider控件并加载到地图容器中 var zoomslider = new ol.control.ZoomSlider(); map.addControl(zoomslider); //实例化zoomToExent控件并加载到地图容器中 var zoomToExent = new ol.control.ZoomToExtent({ extend: [13100000, 4290000, 13200000, 5210000 ] }); map.addControl(zoomToExent); //加载图层列表数据 loadLayersControl(map, "layerTree"); }代码解析:
(1)首先创建一个地图容器,分别加载 OSM 瓦片图层、JSON 与 KML 格式的矢量图,并在初始化这些图层时,新增一个 name 属性,用于说明当前图层的名称。
(2)封装了一个功能函数 loadLayersControl ,用于加载图层了列表,需要传入两个参数,map 与 id 分别为地图容器对象、图层列表 id ,实现思路:①调用 Map 对象的 getLayers 方法获取当前地图容器中加载的所有图层,存入图层数组layer中。
②遍历这些图层,通过图层对象调用 get(‘name') 得到图层名,并存入图层名称数组 layerName 中,调用 getVisible() 得到图层的可见属性,并存入到图层可见性数组中(layerVisibility)
③分别新增 li 元素,用来承载图层项,在 li 中创建复选框元素(checkbox)控制图层显示,创建 label 元素显示图层名称。其中,通过 addChangeEvent 方法为checkbox 元素绑定变更事件,在事件中实现通过 Layer 的 setVisible 方法控制图层的显示。
(3)在 head 标签中,通过 script 标签引入 loadLayersControl.js,实现动态加载图层列表。4. 实现效果如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]