OpenLayers教程三:地图控件之缩放控件

395 阅读4分钟

一、地图控件简介

OpenLayers封装了很多控件用于对地图进行操作、显示地图信息等。

具体来说,控件是一个地图上可见的小部件,其DOM元素位于屏幕上的固定位置。它们可以包含用户输入(以按钮的形式),也可以只提供信息。控件的位置是使用CSS来确定,当然也可以使用CSS来调整。默认情况下,控件被放置在地图控件层(地图控件层在上一篇文章讲过),也就是CSS类名为ol-overlayContainer-stopEvent的元素中,但也可以调整,使控件基于外部DOM元素来实现。

从OpenLayers的API来看,具体有如下控件类:

具体来说,这些控件是干嘛的呢?这里简单介绍一下

  • 归属控件(Attribution) —— 用于展示地图资源的版权或者归属,它会默认加入到地图中。
  • 全屏控件(FullScreen) —— 控制地图全屏展示
  • 坐标拾取控件(MousePosition) —— 用于在地图上拾取坐标
  • 鹰眼控件(OverviewMap) —— 生成地图的一个概览图
  • 旋转控件(Rotate) —— 用于鼠标拖拽旋转地图,它会默认加入到地图中。
  • 比例尺控件(ScaleLine) —— 用于生成地图比例尺
  • 滑块缩放控件(ZoomSlider) —— 以滑块的形式缩放地图
  • 缩放至特定位置控件(ZoomToExtent) —— 用于将地图视图缩放至特定位置
  • 普通缩放控件(Zoom) —— 普通缩放控件,它会默认加入到地图中。

二、普通缩放控件

现在先在上一篇文章中创建的openlayers文件夹中再创建一个controls文件夹:

然后把first文件夹中的simple_map.html复制到controls文件夹中,并将其改名为zoom.html:

普通缩放控件具有两个按钮分别用于地图的缩小和放大。因为它会默认加入到地图中,所以在前面一篇文章中,我们其实已经见到它了,用浏览器打开zoom.html:

可以用鼠标分别点击这两个按钮用于地图缩小和放大。

打开浏览器的开发者工具,可以发现普通缩放控件的DOM元素确实放在地图控件层中:

将开发者工具的选项卡切换到console,然后输入map.getControls().getArray(),会打印如下内容:

map.getControls().getArray()会返回一个数组,里面包含了地图中默认的控件实例,而这个数组的第一个元素就是普通缩放控件的实例了。

查看ol.control.Zoom类的API文档,可以发现OpenLayers设计了许多属性以方便开发人员对普通缩放控件进行调整:

可以通过为target属性赋值为自定义的DOM元素来为普通缩放控件绑定指定的DOM元素。

三、滑块缩放控件

普通缩放控件(ol.control.Zoom)是会被默认加入到地图中的,而滑块缩放控件(ol.control.ZoomSlider)不会被默认加入到地图中,因此我们来编写代码将其加入,修改zoom.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>Simple Map</title>
    <link rel="stylesheet" href="../v5.3.0/css/ol.css" />
    <script src="../v5.3.0/build/ol.js"></script>
</head>
<body>
    <div id="map"></div>
 
    <script>
        let map = new ol.Map({
            target: 'map',                          // 关联到对应的div容器
            layers: [
                new ol.layer.Tile({                 // 瓦片图层
                    source: new ol.source.OSM()     // OpenStreetMap数据源
                })
            ],
            view: new ol.View({                     // 地图视图
                projection: 'EPSG:3857',
                center: [0, 0],
                zoom: 0
            }),
            // 新增代码
            controls: ol.control.defaults().extend([    // 往地图增加滑块缩放控件
                new ol.control.ZoomSlider()
            ])
        });
    </script>
</body>
</html>

OpenLayers实现了一个对原生JavaScript的Array类进行扩展的类ol.Collection,Map对象会保存一个ol.Collection实例用于存放控件。

上面的新增代码中,ol.control.defaults()方法就用于返回保存默认控件的ol.Collection实例,然后使用ol.Collection类的extend()方法往里增加了滑块缩放控件。

现在,使用浏览器打开zoom.html:

可以发现滑块缩放控件已经渲染在地图界面上了(透明度有点高),可以使用鼠标拖拉滑块来缩放地图!

打开浏览器的开发者工具,可以发现在地图控件层中增加了一个用于承载滑块缩放控件的DOM元素。

四、缩放至特定位置控件

现在让我们来看看缩放至特定位置控件(ol.control.ZoomToExtent)。

打开zoom.html,修改代码:

zoom.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>Simple Map</title>
    <link rel="stylesheet" href="../v5.3.0/css/ol.css" />
    <script src="../v5.3.0/build/ol.js"></script>
</head>
<body>
    <div id="map"></div>
 
    <script>
        let map = new ol.Map({
            target: 'map',                          // 关联到对应的div容器
            layers: [
                new ol.layer.Tile({                 // 瓦片图层
                    source: new ol.source.OSM()     // OpenStreetMap数据源
                })
            ],
            view: new ol.View({                     // 地图视图
                projection: 'EPSG:3857',
                center: [0, 0],
                zoom: 0
            }),
            controls: ol.control.defaults().extend([    // 往地图增加控件
                new ol.control.ZoomSlider(),            // 滑块缩放控件
                // 新增代码
                new ol.control.ZoomToExtent({           // 缩放至特定位置控件      
                    extent: [
                        12667718, 2562800,
                        12718359, 2597725
                    ]
                })
            ])
        });
    </script>
</body>
</html>

这里new了一个ol.control.ZoomToExtent类的实例,从而创建了一个缩放至特定位置控件。其中的extent属性用于指定缩放的目标位置,它是一个数组,前两个元素表示位置矩形的左下角坐标,后两个元素表示位置矩形的右上角坐标:

最后通过ol.Collection类的extend()方法将该控件增加到地图中。

可以用浏览器打开zoom.html:

五、修改控件样式

OpenLayers为承载控件的各个DOM元素都自动设置了类名,所以通过CSS的类选择符就可以修改指定的控件样式。

这里我们来修改一下前面介绍的三个控件的样式,打开zoom.html:

zoom.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>Simple Map</title>
    <link rel="stylesheet" href="../v5.3.0/css/ol.css" />
    <script src="../v5.3.0/build/ol.js"></script>
    <style>
        #map .ol-zoom .ol-zoom-out {
            margin-top: 204px;
        }
        #map .ol-zoomslider {
            background-color: transparent; 
            top: 2.3em;
        }
        #map .ol-zoom-extent {
            top: 280px;
        }
    </style>
</head>
<body>
    <div id="map"></div>
 
    <script>
        let map = new ol.Map({
            target: 'map',                          // 关联到对应的div容器
            layers: [
                new ol.layer.Tile({                 // 瓦片图层
                    source: new ol.source.OSM()     // OpenStreetMap数据源
                })
            ],
            view: new ol.View({                     // 地图视图
                projection: 'EPSG:3857',
                center: [0, 0],
                zoom: 0
            }),
            controls: ol.control.defaults().extend([    // 往地图增加控件
                new ol.control.ZoomSlider(),            // 滑块缩放控件
                new ol.control.ZoomToExtent({           // 缩放至特定位置控件      
                    extent: [
                        12667718, 2562800,
                        12718359, 2597725
                    ]
                })
            ])
        });
    </script>
</body>
</html>

使用浏览器打开zoom.html,可以发现三个缩放控件得到合理的样式修改:

怎么样?通过本文的介绍,是不是对OpenLayers控件有了一个较为详细的认识。。