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

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


前端部分

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

<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. linux+jenkins+postman持续集成

    环境搭建:linux上安装newman,部署好jenkins linux上war包方式安装Jenkins 以下实现jenkins上执行postman测试脚本: 1.新建一个自动风格的job 2.构建- ...

  2. PAT-1022 Digital Library (30 分) 字符串处理

    A Digital Library contains millions of books, stored according to their titles, authors, key words o ...

  3. 解决Dubbo 2.7.3版本使用ConfigCenterConfig集成Apollo No Provider found的问题

    Dubbo 2.7.3 集成Apollo 问题描述 Dubbo 2.7.3支持配置中心外部化配置, 因此只需要定义一个ConfigCenterConfig的Bean. @EnableDubbo(sca ...

  4. Md5与HMAC-SHA256

    Md5签名算法 private string CalMd5(string str) { var md5 = MD5.Create(); var bs = md5.ComputeHash(Encodin ...

  5. vue-music 使用better-scroll遇到轮播图不能自动轮播

    根据vue-music视频中slider组建的使用,当安装新版本的better-scroll,轮播组件,不能正常轮播 这是因为,better-scroll发布新版本之后,参数设置发生改变 这是旧版本: ...

  6. 持久层框架JPA与Mybatis该如何选型

    一.现状描述 目前java 持久层ORM框架应用最广泛的就是JPA和Mybatis.JPA只是一个ORM框架的规范, 对该规范的实现比较完整就是Spring Data JPA(底层基于Hibernat ...

  7. IoTClient开发3 - ModBusTcp协议客户端实现

    前言 进过前面两章的介绍,今天开始正式的实战. 进制转换 很多朋友对于进制转换可能是在刚学计算机的时候有接触,后来做高级语言开发可能就慢慢忘记了.我们做工控开发的时候需要经常进行进制转换,这里和大家一 ...

  8. 死磕 java线程系列之线程池深入解析——未来任务执行流程

    (手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:线程池源码部分如无特殊说明均指ThreadPoolExecutor类. 简介 前面我们一起学习了线程池中普 ...

  9. Window 同时安装Python2和Python3 终极版

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/vitaminc4/article/det ...

  10. spring cloud 面试题总结

    前言,随着分布式的时代到来,现在微服务越来越火了,Spring Cloud已经成为一个面试必问的考点,下面我们就Cloud这一些列的组件来一个入门到面试的过程.开篇前,先让大家看几个常见的Spring ...