control

作者: 扶不起的蝌蚪 | 来源:发表于2020-04-17 22:55 被阅读0次

control是openlayer中的控件类


他们不会随着地图的移动而移动,一直处于一个固定的位置。 在实现上,并不是在画布上绘制的,而是使用传统的HTML元素来实现的,便于同地图分离,也便于界面实现。 在本章节中,将先概览OpenLayers 3中已有的地图控件,对其实现进行分析,在此基础上进一步修改其样式,从而定义自己的控件。

默认情况下,在地图上是不会显示这么多地图控件的,只会应用ol.control.defaults()这个函数返回的地图控件,默认包含了ol.control.Zoomol.control.Rotateol.control.Attribution这个控件。 其使用方式同ol.interaction.defaults()很像,同样可以设置一些参数来控制控件的一些功能,从而实现定制化需求。

实现一个没有任何控件的地图

var map = new ol.Map({
        // 设置地图控件,默认的三个控件都不显示
        controls: ol.control.defaults({
            //右下角的地图信息控件
            attribution: false,
            //指北针控件
            rotate: false,
            //缩放按钮控件
            zoom: false
        }),
//或者这样写:
        controls: [],
        layers: [
          new ol.layer.Tile({
            source: new ol.source.OSM()
          })
        ],
        target: 'map',
        view: new ol.View({
          center: ol.proj.transform(
              [120.374798,36.07316], 'EPSG:4326', 'EPSG:3857'),
          zoom: 10
        })
    });

默认控件

在地图中默认配置以下选项,如果不自行设置,会返回一个包含下面控件的集合。
1.zoom
缩放控件,包含两个按钮,一个放大,一个缩小,默认的 CSS样式类分别为 .ol-zoom-in.ol-zoom-out

zoom
可选参数
new ol.control.zoom({ 
            duration:number=250, // 动画毫秒
            className:string,  
            zoomInLabel:HTMLElement | string,//缩小按钮的文字,也可以用DOM元素进行替换,如(`span`元素)
            zoomOutLabel://放大按钮的文字,也可以用DOM元素进行替换,如(`span`元素)
            zoomInTipLabel:string ,//鼠标放在缩小按钮上的提示信息
            zoomOutTipLabel: string  //鼠标放在放大按钮上的提示信息
            delta:number    //点击按钮的缩放层次
            target:HTMLElement | string  //如果你想把控件放置在地图的外面
        })

2. rotate

地图旋转控件,主要作用是当地图角度不为 0 时,默认显示,点击,使地图恢复旋转角度为 0。


rotate

可选参数

new ol.control.Rotate({ 
            className:string (默认 'ol-rotate')  //
            label:  string | HTMLElement(默认  '⇧') //渲染按钮的文字,也可以用DOM元素替代 
            tipLabel:string (默认  'Reset rotation')  //鼠标悬浮在按钮上的提示文字
            duration:number (默认  250) //动画毫秒
            autoHide:   boolean (默认  true) // 旋转方向为0时自动隐藏
            render: function //当控件重新绘制的时候,调用的函数
            resetNorth:function //点击控件时触发的函数 
            target: HTMLElement | string  // 如果你想把控件放置在地图的外面如document.getElementById('')
        })
            取消当前默认控件
            controls: ol.control.defaults({
    rotate: false
})

默认情况下,该控件不会显示;当地图旋转角度不为 0 时,才会显示,原因是该控件为地图默认添加控件。当该控件显示时候,其默认的位置和全屏控件重合,所以如果想要显示该按钮,那么全屏按钮就会被覆盖。

有两种方法可以解决该问题:

  • 按照mousepositioncontrol的方式,将其默认位置放于其它地方;
  • 覆盖其原有的 CSS 样式,最好不要修改原文件,因为其它地方如果使用的话,就会同样改变。
.ol-rotate{
    right:40px;
  }
  new ol.control.Rotate({ 
            autoHide:false
        })

3.Attribution

其他控件

加载了所有基本控件的地图

var map = new ol.Map({
         // 在默认控件的基础上,再加上其他内置的控件
        controls: ol.control.defaults().extend([
            //全屏
            new ol.control.FullScreen(),
            //鼠标位置控件
            new ol.control.MousePosition(),
            //鸟瞰图控件
            new ol.control.OverviewMap(),
            //比例尺控件
            new ol.control.ScaleLine(),
            //缩放滚动条控件
            new ol.control.ZoomSlider(),
            // 放大到设定区域控件
            new ol.control.ZoomToExtent()
        ]),
        layers: [
          new ol.layer.Tile({
            source: new ol.source.OSM()
  
          })
        ],
        target: 'map',
        view: new ol.View({
          center: ol.proj.transform(
              [120.374798,36.07316], 'EPSG:4326', 'EPSG:3857'),
          zoom: 10
        })
    });

1.fullscreen- 全屏控件
地图全屏控件,该控件提供一个全屏按钮,当点击的时候,地图充满整个屏幕(注意是整个屏幕,而不是整个浏览器窗口);当在全屏模式时,在屏幕的右上角会出现一个退出按钮,用于退出全屏模式,同时按 Esc 按钮也可以退出全屏模式。

fullscreen
controls: ol.control.defaults().extend([
        new ol.control.FullScreen()
      ])

2.mouseposition- 鼠标位置控件

mouseposition

鼠标位置控件,用于显示鼠标指针 2D 坐标,默认情况下,它显示的是地图的 view 对象中设置的投影,但是可以修改为任意投影。鼠标位置控件是加载在地图右上角的位置,如,我们在以上全屏控件的基础上加如下代码:

 controls: ol.control.defaults().extend([
        new ol.control.FullScreen(),
        new ol.control.MousePosition()
      ])

默认的鼠标位置控件,连全屏按钮都遮盖了,为了避免遮盖,我们将鼠标位置控件移动到别的地方。
方法有两种:

  • 修改ol.control.MousePosition参数
<div  id="mouse-position" class="mouse-position-wrapper">
    <div class="custom-mouse-position"></div>
</div>
 .mouse-position-wrapper{
    width:300px; 
    height:29px; 
    color:#FFFFFF; 
    position:absolute; 
    right:20px; 
    bottom:6px; 
    z-index:999;
  }
controls: ol.control.defaults().extend([
        new ol.control.FullScreen(),
        new ol.control.MousePosition({
            coordinateFormat: ol.coordinate.createStringXY(4),
            projection: 'EPSG:4326',
            className: 'custom-mouse-position',
            target: document.getElementById('mouse-position')
        })        
      ])
  • 覆盖其原有的 CSS 样式,最好不要修改原文件,因为其它地方如果使用的话,就会同样改变。
.ol-mouse-position {
          right:40px;
}
  1. overviewmap - 全局地图控件

    overviewmap
    全局地图控件,显示当前视口中的地图位于全局地图的哪一部分
    默认情况下,控件为收缩状态,点击即可打开,打开后如下图所示:
  2. scaleline - 比例尺控件

比例尺控件,显示当前地图的分辨率,也就是比例尺,默认的位置和 overviewmap control位置重合,要移动位置避免覆盖,同样覆盖默认样式:

 /* rewrite the default css in `ol.css` */
  .ol-scale-line {
    #left:100px;
  }
  1. zoomslider - 缩放条控件

缩放条控件,主要显示当前的分辨率对应的刻度,给予一个直观的显示,其默认的条没有刻度,如果需要有刻度的,需要自己定制。

  1. zoomtoextent - 缩放到图层控件
    缩放到图层控件,将地图缩放到视口可以容纳整个地图的合适尺度
    这个控件也没有什么特殊的选项,除了 extent,表示缩放到范围的大小。需要注意的是该控件位置和 zoomslidercontrol 位置会有部分重叠,同样,我们需要覆盖zoomslidercontrol的样式类: .ol-zoomslider:
 .ol-zoomslider{
    top:100px;
    left: 9px;
  }

我们看一下点击之前和之后的效果对比:




点击之后其实已经到了合适的尺寸,但是地图配置为连贯显示,也就是左右不间断,重复拼接在一起,所以会有这样的效果。

修改控件UI

  • css修改控件UI
<style>
        .ol-zoom .ol-zoom-in {
        background-color: #0000ff;
        color: #ff0000;
        }
        .ol-zoom .ol-zoom-out {
        background-color: #0000ff;
        color: black;
        }
        
    </style>
  • js修改控件UI
// 设置放大按钮符号,下面这个代码需要引入jquery,或者zepto库
    $('#map2 .ol-zoom-in').html('<>');

添加自定义控件

  • 利用创建文档流进行DOM元素添加
<style>
        .share {
            position: absolute;
            top: 10px;
            right: 10px;
            border: 1px;
            border-color: #333;
            background-color: #339999;
            color: #fff;
            box-shadow: 0px 0px 2px #666;
            cursor: pointer;
            padding: 0 4px 0 4px;
        }
    </style>
    var map = new ol.Map({
        layers: [
          new ol.layer.Tile({
            source: new ol.source.OSM()
          })
        ],
        target: 'map',
        view: new ol.View({
          center: ol.proj.transform(
              [120.374798,36.07316], 'EPSG:4326', 'EPSG:3857'),
          zoom: 10
        })
    });
 
    // 在viewport节点下添加一个分享按钮
    var viewport = map.getViewport();
    $(viewport).append('<div id="share" class="share">地图输出</div>');
 
    // 监听按钮点击事件,执行相关操作
    document.getElementById('share').onclick = function() {
            map.once('postcompose', function (event) {
            var canvas = event.context.canvas;
            canvas.toBlob(function (blob) {
                saveAs(blob, 'map.png');
            });
        });
        map.renderSync();
    }

解释一下代码:首先在viewport节点下添加一个输出按钮,然后监听这个按钮,这里我们使用了一个saveAs方法,这是一个调用的封装好的保存文件的js文件,最后重新渲染了map,来看一下效果:



点击地图输出,会显示我们已经下载好的地图:



打开map.png:

相关文章

  • 2022-11-01 Release The Past

    “To control your life, control your mind. To control your...

  • control

    我要控制我自己,不然这世界将进入地狱

  • control

    //屏幕宽度的宏 #define SCR_W [UIScreen mainScreen].bounds.size....

  • control

    - (void)viewDidLoad { [selfuidata]; dataSource = [[NS...

  • Control

    我察觉到执着的来源是这样:在任何一个通道上倾泻过多的能量。 这让我明了长久以来自己对爱情和命运的执着。它们让我伤痕...

  • control

    1.生成木马软件 msfvenom -p windows/meterpreter/reverse_tcp LHOS...

  • CONTROL

    是不是不该再往前随心而走再走 我怕我的理智与意念都会脱手 我怕一个人走两个人的距离 线不够拉扯我怕你往别的方向出发...

  • In Control

    原创 (简书名:天行鹤)|007-12372|7月21日|第6篇|心情随笔 本文960字,大概需要阅读2分钟 I ...

  • Control

    今天看了篇文章说富豪为什么那么热爱工作? 比尔·盖茨今年64岁,在1995年,他40岁的时候就成为了世界首富。目前...

  • control

    control是openlayer中的控件类 他们不会随着地图的移动而移动,一直处于一个固定的位置。 在实现上,并...

网友评论

      本文标题:control

      本文链接:https://www.haomeiwen.com/subject/wijuvhtx.html