大部分情况下我们开发会使用原生的地图切换器,由于每个项目的页面风格不同,业务场景不同,因此需要做一些样式不同的地图切换器。

首先可以照猫画虎,自己照着地图切换器的样式抄一个,或者看看主流的地图切换器都长什么样,然后以这些为基本框架,自己再去设计地图切换器的样式,从核心功能上都大同小异,本篇文章主要想介绍的就是“换壳”。


前端部分

我们在前端做一个地图切换器。代码如下:

<div class="mapSwitch" onclick="mapSwitch(mtype)"></div>

<div> 标签中的 CSS 样式代码为:

.mapSwitch{
    height: 60px;
    width: 80px;
    background: url(img/0.png) center center;
    border: 1.5px solid rgb(255, 255, 255);
    position: absolute;
    z-index: 1;
    border-radius: 5px;
    top: 2%;
    right: 1%;
    cursor: pointer;
}

给 <div> 标签赋予点击事件,指向的函数为“mapSwitch()”,其中的 mtype 参数接下来会讲到。

JS 部分

为了识别我们切换的状态,需要用到一个全局变量来辅助我们做判断。

var mtype = 0;

在地图中假设我们有两份底图,将其加入地图中,并隐藏其中的一个。

var BaseMap=new esri.layers.ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services/dark/MapServer",{id:"BaseMap"});
var BaseMapx=new esri.layers.ArcGISTiledMapServiceLayer("http://localhost:6080/arcgis/rest/services/basemap/ArcGIS_img_17/MapServer",{id:"BaseMapx"});
map.addLayer(BaseMap,2);
map.addLayer(BaseMapx,1);
map.getLayer('BaseMapx').setVisibility(false);

这样我们就将名为“BaseMap”的图层默认显示,将“BaseMapx”的图层用代码关闭显示了。

我们在向地图添加图层的过程中也会遇到图层顺序的问题,假设上述两张底图“BaseMap”是影像层,“BaseMapx”是标记层,那么标记层就应该叠加在影像层之上才能正常显示。

有两种操作方式:

  1. 由下到上地进行图层添加,例如先添加“BaseMap”,然后再添加“BaseMapx”,即可获得标记层叠加在影像层的效果

  2. 图层叠加是无序的,但我想要为其添加图层顺序,这里就可以在 map.addLayer() 函数中在图层对象后面追加一个数字,这个数字越小,图层的位置越靠下,反之亦然。 例如上述代码中如果我没有屏蔽“BaseMapx”图层,那么在地图中“BaseMap”会压盖在“BaseMapx”之上,就是因为我们在函数中为其定义了 index 序号。序号越小越处于底层,序号越大越处于顶层。

接下来我们写控制图层开关的函数,如下:

function mapSwitch(v){
    if(v == 1){
        map.getLayer('BaseMapx').setVisibility(false);
        map.getLayer('BaseMap').setVisibility(true);
        $('#mapSwitch')[0].style.background = 'url("img/1.png") center center';
        $('#map')[0].style.background = "#061827";
        mtype = 0;
    }else{
        map.getLayer('BaseMapx').setVisibility(true);
        map.getLayer('BaseMap').setVisibility(false);
        $('#mapSwitch')[0].style.background = 'url("img/0.png") center center';
        $('#map')[0].style.background = "#0d2941";
        mtype = 1;
    }
}

这里用 mtype 的状态来判断当前地图是哪种类型,我们可以走一遍。

初始状态加载后,mtype = 0 ,默认显示的是”BaseMap“底图,

当我们点击事件后,会进入 else 语句,关闭”BaseMap“图层的显示状态,打开”BaseMapx“图层的显示状态。

同时前端的地图容器背景也会发生改变,地图容器中的图片也会被修改,这时 mtype 则修改为 1 ,完成了一次地图切换。

当我们再次点击地图切换器后,进入 if 语句执行相反的操作。

拓展联想

地图切换器的核心就是对图层的显示状态控制,对于判断的参数,大家也可以使用图层本身的属性或者其他形式。

另外图层开关的思路实际上也是这样的,如果要写一个图层开关器,可以在前端使用该图层的名称为标签 id ,用样式 class 作判断依据,将二者传入开关函数,即可完成该图层的显示/隐藏。

我参考了 2018 年谷歌地图网页版的切换器设计思路,我发现在地图的缩放拖拽过程中,地图控制器中的小地图不是一张图片而是另一个地图容器,会跟随外部的大地图联动,这是一个很有意思的小细节,于是我沿用了谷歌地图的思路,在新的项目中对原生地图切换器进行了重新开发。

如果大家有更多有意思的地图切换方案,也可以在留言评论。

ArcGIS API For Javascript :如何制作地图切换器的更多相关文章

  1. ArcGIS api for javascript——查询没有地图的数据

    描述 本例展示了用户能够从没有显示服务的地图服务查询数据.大部分地图服务包含属性信息的数据集,数据集能够被查询并显示在一个简单的列或表格里. 本例按提供的州名称查询USA人口普查数据,然后显示关于州的 ...

  2. ArcGIS API For JavaScript 加载地图,设置地图中心点

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  3. ArcGIS API for JavaScript使用中出现的BUG(1)

    本人在使用ArcGIS API for JavaScript开发一个地图的搜索框时,总是出现一个BUG.如图所示: 搜索框总是出不来. 该引用的也引用了,找了半天终于解决,是因为路径没有定义详细. 应 ...

  4. ArcGIS.Server.9.3和ArcGIS API for JavaScript地图实现Toorbar功能(四)

    转自:http://www.cnblogs.com/hll2008/archive/2008/11/22/1338630.html 目的:1.ArcGIS API for JavaScript实现To ...

  5. ArcGIS API for JavaScript 4.2学习笔记[1] 显示地图

    ArcGIS API for JavaScript 4.2直接从官网的Sample中学习,API Reference也是从官网翻译理解过来,鉴于网上截稿前还没有人发布过4.2的学习笔记,我就试试吧. ...

  6. ArcGIS API for JavaScript根据两个点坐标在地图上画线

    ArcGIS API for JavaScript根据两个点坐标在地图上画线比如说a(xxxx,xxxxx),b(xxxx,xxxxx).利用这两个点画一条线 var polyline = new e ...

  7. ArcGIS API for JavaScript 4.4 版本加载谷歌地图

    ArcGIS API for JavaScript 4.X 版本升级后,API发生了很大的变化. 其中就支持了WebEarth展示,主要是通过 esri/views/SceneView 实现的. 在新 ...

  8. arcgis api for javascript本地部署加载地图

    最近开始学习arcgis api for javascript,发现一头雾水,决定记录下自己的学习过程. 一.下载arcgis api for js 4.2的library和jdk,具体安装包可以去官 ...

  9. ArcGis API for JavaScript学习——加载地图

    ArcGis API for JavaScript开发笔记——加载地图 在这个例子中使用的离线部署的API(请参见 http://note.youdao.com/noteshare?id=f42865 ...

随机推荐

  1. 为什么要学3D建模呢?你看中的肯定是这几点

    游戏行业的大环境 互联网的形态一直以来都是2D模式的,但是随着3D技术的不断进步,在未来的5年时间里,将会有越来越多的互联网应用以3D的方式呈现给用户,包括网络视讯.电子阅读.虚拟社区.网络游戏.电子 ...

  2. 怎样快速找到某一行代码的git提交记录

    利用notepad++提高问题分析效率,以及快速找到某一行代码的git提交记录 1. 全目录搜索/替换 Notepad++是一款强大的文本编辑工具,当知道大概的关键词但不知道在哪个日志时可以使用not ...

  3. std::shared_future/future

    std::future提供了一种访问异步操作结果的机制.

  4. 【RabbitMQ 实战指南】一 过期时间TTL

    RabbitMQ 可以对消息和队列设置过期时间(TTL) 1.设置消息的TTL 目前有两种方式可以设置消息的TTL 第一种方式是通过队列属性设置,队列中所有消息都有相同的过期时间 第二种方式是对消息本 ...

  5. 7.Linux文件编辑之Vim

    1.VIM基本概述 1.什么是VIM? vi和vim是Linux下的一个文本编辑工具.(可以理解为windows的记事本,或word文档) 2.为什么要使用VIM? 因为Linux系统一切皆为文件,而 ...

  6. xml 文件操作

      'XML添加   Public Sub Add(ID As String, RFSerialnumber As String, Mood As Integer)     If reatch(RFS ...

  7. Exception evaluating SpringEL expression:

    Exception evaluating SpringEL expression:错误 说明: 在帮助同事看BUG的时候遇上了这个问题,不知道是前端还是后端的错误 在网上找了很多文章解决的方法,很多都 ...

  8. 实现Button的动态响应

    按下不同的Button实现不同的逻辑 但用同样的代码: using System.Reflection; namespace valuableBook { /// <summary> // ...

  9. 一文读懂Java类加载机制

    Java 类加载机制 Java 类加载机制详解. @pdai Java 类加载机制 类的生命周期 类的加载:查找并加载类的二进制数据 连接 验证:确保被加载的类的正确性 准备:为类的静态变量分配内存, ...

  10. 使用webpack命令打包时,报错TypeError: Cannot read property 'presetToOptions' of undefined的解决办法

    我只安装了webpack,没有安装webpack-cli,第一次输入webpack打包时,提示 One CLI for webpack must be installed. These are rec ...