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

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


前端部分

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

<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. 《Java并发编程实战》读书笔记-第3章 对象的共享

    可见性 在没有同步的情况下,编译器.处理器以及运行时都可能做指令重排.执行结果可能会出现错误 volatile变量 编译器与运行时不会进行指令重排,不会进行缓存,使用volatile变量要满足以下条件 ...

  2. HDU 6607 Time To Get Up(状态压缩+枚举)

    题目网址: http://acm.hdu.edu.cn/showproblem.php?pid=6077 思路: 先预处理一下,将每个数字块的“X”看作1,“.”看作0,进行状态压缩转换成二进制数,用 ...

  3. 把图片在word中显示

    如下: //放入word中 #region word ThreadPool.QueueUserWorkItem(//使用线程池 (P_temp) =>//使用lambda表达式 { G_wa = ...

  4. 第3次作业-MOOC学习笔记:Python网络爬虫与信息提取

    1.注册中国大学MOOC 2.选择北京理工大学嵩天老师的<Python网络爬虫与信息提取>MOOC课程 3.学习完成第0周至第4周的课程内容,并完成各周作业 4.提供图片或网站显示的学习进 ...

  5. 包管理-rpm

    rpm包管理 程序源代码---->预处理---->编译---->汇编---->链接          数据处理  转为汇编代码  进行汇编    引入库文件    静态编译:. ...

  6. Mysql数据库(四)表记录的更新操作

    一.插入表记录 1.使用INSERT...VALUES语句插入新纪录 (1)插入完整数据 mysql> desc tb_manager; +-------+------------------+ ...

  7. python编译器的安装和pycharm的安装

    python编译器的安装 进入官网https://www.python.org/,根据提示安装 安装python编译器 pychram安装 下载地址: https://www.jetbrains.co ...

  8. jquery获取dom属性方法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. 网络安全-主动信息收集篇第二章-二层网络扫描之nmap

    nmap是网络层.传输层最重要的扫描工具之一,可以结合脚本对应用层的扫描和对网络弱点发现. 网络层发现nmap使用: Usage: nmap [Scan Type(s)] [Options] {tar ...

  10. CSPS模拟 54

    T1    $2^{联通块个数}-2$ T2 $bitset$随便水 T3 分类讨论,讨论,讨论