OpenLayers3实现图层控件功能

本文实例为大家分享了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" rel="external nofollow" >
  <link rel="stylesheet" href="css/bootstrap.min.css" rel="external nofollow" >
  <link rel="stylesheet" href="css/ZoomSlider.css" rel="external nofollow" >
  <script src="js/ol.js"></script>
  <script src="js/loadLayersControl.js"></script>
  <style>
    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;
      /*在地图容器中的层,要设置z-index的值让其显示在地图上层*/
      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;
      /*在地图容器中的层,要设置z-index的值让其显示在地图上层*/
    }
  </style>
</head>

<body onload="init()">
  <div id="map">
    <div id="layerControl" class="layerControl">
      <div class="title"><label>图层列表</label></div>
      <ul id="layerTree" class="layerTree"></ul>
    </div>
  </div>
</body>

</html>

代码解析:

创建一个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. 实现效果如下:

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

(0)

相关推荐

  • OpenLayers实现图层切换控件

    OpenLayers并没有封装图层切换的控件,所以我们需要自己来实现图层控件. 自定义图层切换控件的原理很简单:显示某个图层时,将其他图层隐藏. 完整代码: layerSwitch.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="wi

  • OpenLayers3实现图层控件功能

    本文实例为大家分享了OpenLayers3实现图层控件的具体代码,供大家参考,具体内容如下 1. 前言 在实际应用中,我们将加载到地图容器中的图层通过图层显示的控件功能,来显示加载的图层,便于用户查看与操作,OpenLayers 3 中并没有提供类似的图层控件,但是他的 API 却提供了该功能的相关接口,我们可以通过调用相关的接口,实现该功能. 2. 实现思路 (1)新建一个网页,参考前面的文章加载OSM瓦片图层的方法,加载OSM瓦片.MapQuest 影像.JSON 与KML 格式的矢量图.

  • Angularjs 实现动态添加控件功能

    实现下面这样的需求: 点击增加一块数据盘,会出现数据盘选项. (1)最开始,想到原生JavaScript,jQuery (appendChild()等方法结合AngularJS来添加新的元素.但是突然发现控件里面的数据绑定,原生javascript没法控制. (2)上网查资料,找到$compile服务,动态改变html内容.本以为这可以解决我的需求,但是仔细研究发现$compile是这样的东西. 用$compile服务创建一个directive 'compile',这个complie会将传入的h

  • iOS表视图之下拉刷新控件功能的实现方法

    下拉刷新是重新刷新表视图或列表,以便重新加载数据,这种模式广泛用于移动平台,相信大家对于此也是非常熟悉的,那么iOS是如何做到的下拉刷新呢? 在iOS 6之后,UITableViewControl添加了一个refreshControl属性,该属性保持了UIRefreshControl的一个对象指针.UIRefreshControl就是表视图实现下拉刷新提供的类,目前该类只能用于表视图界面.下面我们就来试试该控件的使用. 编写代码之前的操作类似于前面几篇文章.代码如下: #import "View

  • Android开发之拖动条/滑动条控件、星级评分控件功能的实例代码

    ProgressBar有2个子控件: SeekBar   拖动条控件 RatingBar   星级评分控件 1.拖动条控件 <SeekBar android:layout_width="300dp" android:layout_height="wrap_content" android:id="@+id/seekBar" android:min="0" android:max="100" andro

  • 微信小程序实现动态显示和隐藏某个控件功能示例

    本文实例讲述了微信小程序实现动态显示和隐藏某个控件功能.分享给大家供大家参考,具体如下: 在小程序的开发过程中,经常需要用到隐藏某个控件这种情况. 因为项目原本是需要将两个canvas切换,但是小程序的canvas支持的功能实在是少,本来就jquery mobile或者将canvas转为图片就可以很容易实现滑动效果,但是都不支持,最后只能是做一个canvas,需要时显示,不需要时隐藏. 实现方法: logs.wxml <view> <button bindtap="onChan

  • WPF开发技巧之花式控件功能扩展详解

    目录 No1. 自定义控件模板 No2. 重写控件 No3. 附加属性来试试 总结 文章默认你已经入门WPF了 ​ WPF日常开发,经常遇到默认的控件功能不满足需求,怎么办? No1. 自定义控件模板 ​ 平时开发中,经常遇到比较"俗"的需求,嫌弃控件默认的样子.怎么办?哈哈,那就整个容呗.....

  • Android自定义带有圆形进度条的可长按控件功能

    这几天有在学习Jetpack中CameraX的内容,在拍摄视频的时候想着做一个自定义带有进度条的可长按控件,用来显示拍摄进度,故记录下来与大家分享!效果如下: (篇幅过长是因为有代码解析过程,可直接到最后查看完整代码) 这个控件较为简易,从效果中可以看出,控件模拟了单击拍照,长按可以录制视频的功能,中途松手或者时间到都可以停止录制 思路很简单,使用简单的画笔工具就可以完成这个控件 继承自View 定义自定义属性并获取 定义填充样式的画笔 onMeasure中测量大小,onDraw中绘制圆与扇形

  • Android实现图片滚动和页签控件功能的实现代码

    首先题外话,今天早上起床的时候,手滑一下把我的手机甩了出去,结果陪伴我两年半的摩托罗拉里程碑一代就这么安息了,于是我今天决定怒更一记,纪念我死去的爱机. 如果你是网购达人,你的手机上一定少不了淘宝客户端.关注特效的人一定都会发现,淘宝不管是网站还是手机客户端,主页上都会有一个图片滚动播放器,上面展示一些它推荐的商品.这个几乎可以用淘宝来冠名的功能,看起来还是挺炫的,我们今天就来实现一下. 实现原理其实还是之前那篇文章Android仿人人客户端滑动菜单的侧滑菜单效果,史上最简单的侧滑实现  ,算是

  • Android 自定义日期段选择控件功能(开始时间-结束时间)

    开发中碰到个需求,需要在一个空间中选择完成开始和结束时间.实现的过程走的是程序员开发的老路子,找到轮子后自己改吧改吧就成了. 当时做的时候有几个需求:1.当天为最大的结束日期,2.最大选择范围1年,3.开始时间和结束时间可以为同一天.如有其他需求实现,可以参考代码改进一下.先上效果图: 视频点击后的虚影是屏幕录制的原因.实现步骤:(如有缺失什么资源,请告知.开始时间和结束时间显示自己布局内添加就可以) 1.自定义控件属性 <declare-styleable name="MyCalenda

  • ASP.NET My97DatePicker日期控件实现OA日期记事功能

    My97DatePicker日期控件是一个非常好用的日期控件,功能非常优秀的日期控件. 对实现页面刷新完善的很好,用日期控件时可以有比较好的享受,这次的OA日期记事功能也得益于此控件,具体效果图如下: 部分代码: Default页布局一个Calendar日期控件 <div> <asp:Calendar ID="Calendar1" runat="server" Width="100%" ShowGridLines="T

随机推荐