vue中使用leaflet实现地图卷帘功能

背景

最近在做一个vue项目里面需要实现一个地图卷帘功能,本来是打算使用arcgis api 来实现这个功能,后来发现leaflet中的有一个leaflet-side-by-side的插件可以直接使用,于是决定尝试使用leaflet的插件来实现。本以为有插件的存在,肯定可以很快实现,没想到每一步都是坑(主要原因我是菜鸡)。下面讲一下我的爬坑之路。

卷帘效果图.gif

官网使用方法

var map = L.map('map').setView([51.505, -0.09], 13);

var myLayer1 = L.tileLayer(...).addTo(map);

var myLayer2 = L.tileLayer(...).addTo(map)

L.control.sideBySide(myLayer1, myLayer2).addTo(map);

1.创建一个map实例
2.加载左边的地图
3.加载右边的地图
4.将两个地图放入到sideByside的控件中就可以了。

就是这么简单。然而实际的操作中却是一步一坑啊。为了实现它,在这个过程中用到了很多其他的插件,下面具体介绍。

用到的插件

leaflet,
esri-leafle,
proj4, 
proj4leaflet,
leaflet-side-by-side

实现流程

引入插件

    import L from 'leaflet';#通过npm安装
    import'leaflet/dist/leaflet.css';#
    import"../../assets/sliderbyslider/leaflet-side-by-side.js";#通过git地址下载直接引用
    import "proj4";#通过npm安装
    import "proj4leaflet";#通过npm安装
    var esri = require('esri-leaflet')#通过npm安装,直接使用import不起作用,只能通过这种方式。

leaflet, Proj4Leaflet这些都可以使用npm直接安装,为了使用Proj4leaflet时候不出现问题,把proj4也直接引用到了工程中。leaflet-side-by-side.js通过git官网下载,记得把样式拷入到工程文件中。我一开始就是忘记引入样式问题,地图一直出不来,控件错乱。因为我的地图服务是通过arcgis server发布的地图服务,所以用到了esri-leaflet。使用的时候犯了难,不清楚是什么原因,直接import,使用其中的方法都是实现未定义,最后在网上找到了上述的进行引用。

地图参数配置

leaflet中默认加载的地图只有以下几种,本项目中使用的地图是CGCS2000的坐标系,需要使用proj4.js和Proj4leaflet.js来自定义坐标系。具体可参考https://blog.csdn.net/aliasone/article/details/80355184,这种方法我只能实现标准的坐标系,但是地方自定义坐标系,没有成功,如果有大神有更好的方法,希望热心告知。

leaflet默认坐标系

本文参数配置如下:

origin: [-400.0, 399.9999999999998], //
EPSG: "EPSG:4490", //地图空间参考值
epsginfo: '+proj=longlat +ellps=GRS80 +no_defs', //proj4描述
resolutions: [
        1.5228550437313792E-4,
        7.614275218656896E-5,
        3.807137609328448E-5,
        1.903568804664224E-5,
        9.51784402332112E-6,
        4.75892201166056E-6,
        2.37946100583028E-6,
        1.18973050291514E-6,
        5.9486525145757E-7,
        2.97432625728785E-7,
    ], //分辨率
 center: [32.05898506104946, 118.83657915219665], //地图中心点
const  CRS = new L.Proj.CRS(mapConfig.EPSG,mapConfig.epsginfo,// EPSG:4490的PROJ.4描述
                        {
                            origin: mapConfig.origin,
                            resolutions: mapConfig.resolutions,
                        }
                    );

地图实例化

this.Lmap = L.map('leafletmap',{
     crs: CRS,  // 定义的坐标系
     center: mapConfig.center,
     zoom: 3,
});

图层添加

使用esri-leaflt中的方法加载arcgis 发布的地图服务,具体可以参考eari-leaflet网站。本文加载切片服务

this.leftlayer =  esri.tiledMapLayer({url:lefturl}).addTo(this.Lmap);
this.rightlayer = esri.tiledMapLayer({url:righturl}).addTo(this.Lmap);
this.sidecontrol = L.control.sideBySide(this.leftlayer,this.rightlayer).addTo(this.Lmap);
this.Lmap.on('layeradd', function(params) {
    setTimeout(function update() {
        this.sidecontrol._updateClip();
    }, 100)
})

实现左右地图动态切换

动态切换地图服务,实现多个地图的对比。

var that = this;
var sidecontrol =that.sidecontrol;
var Lmap =that.Lmap;
var leftlayer =that.leftlayer;
if (sidecontrol && Lmap && leftlayer) {
    if ( that.lefturl== that.righturl) {
           return;
     }
    if (Lmap.hasLayer(leftlayer)) {
        Lmap.removeLayer(leftlayer);
    }
    leftlayer = esri.tiledMapLayer({url:that.lefturl});
    Lmap.addLayer(leftlayer);
    that.leftlayer = leftlayer
    that.sidecontrol.setLeftLayers(leftlayer);
};

实现效果

实现效果.png

参考

1.https://github.com/digidem/leaflet-side-by-side
2.https://blog.csdn.net/aliasone/article/details/80355184
3.https://blog.csdn.net/liyuanxiang1984/article/details/54947345
4.https://blog.csdn.net/qq_34790644/article/details/89308133
5.https://epsg.io/2439
6.http://esri.github.io/esri-leaflet/


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342