栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > Web开发 > JavaScript

OpenLayers3实现图层控件功能

JavaScript 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

OpenLayers3实现图层控件功能

本文实例为大家分享了OpenLayers3实现图层控件的具体代码,供大家参考,具体内容如下

1. 前言

在实际应用中,我们将加载到地图容器中的图层通过图层显示的控件功能,来显示加载的图层,便于用户查看与操作,OpenLayers 3 中并没有提供类似的图层控件,但是他的 API 却提供了该功能的相关接口,我们可以通过调用相关的接口,实现该功能。

2. 实现思路

(1)新建一个网页,参考前面的文章加载OSM瓦片图层的方法,加载OSM瓦片、MapQuest 影像、JSON 与KML 格式的矢量图。
(2)在地图容器中新建一个div 层,用于显示图层列表,在图层列表div 中,添加一个列表头部div 、图层列表 ul ,并通过 css 控制他的样式。
(3)编写加载图层列表的功能函数,在地图加载后,调用该方法,实现图层列表的展示。

3. 实现图层列表功能的代码如下:

html:





 
 加载图层控件
 
 
 
 
 
 
 
 
 body,
 html,
 div,
 ul,
 li,
 iframe,
 p,
 img {
  border: none;
  padding: 0;
  margin: 0;
  font-size: 14px;
  font-family: "微软雅黑";
 }

 #map {
  width: 100%;
  height: 100%;
  position: absolute;
 }
 

 .layerControl {
  position: absolute;
  bottom: 5px;
  min-width: 200px;
  max-height: 200px;
  right: 0px;
  top: 5px;
  z-index: 2001;
  
  color: #ffffff;
  background-color: #4c4e5a;
  border-width: 10px;
  
  border-radius: 10px;
  
  border-color: #000 #000 #000 #000;
  
 }

 .layerControl .title {
  font-weight: bold;
  font-size: 15px;
  margin: 10px;
 }

 .layerTree li {
  list-style: none;
  margin: 5px 10px;
 }
 

 #mouse-position {
  float: left;
  position: absolute;
  bottom: 5px;
  width: 200px;
  height: 20px;
  z-index: 2000;
  
 }
 



 
 
  
  

    代码解析:

    创建一个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(); //图层可见属性数组
    
    
    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添加变更事件      
     }
    }
    
    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. 实现效果如下:

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

    转载请注明:文章转载自 www.mshxw.com
    本文地址:https://www.mshxw.com/it/68457.html
    我们一直用心在做
    关于我们 文章归档 网站地图 联系我们

    版权所有 (c)2021-2022 MSHXW.COM

    ICP备案号:晋ICP备2021003244-6号