vue整合百度离线地图api3.0


前言

这篇文章记录的是我第一次vue整合的百度离线地图,api用的是3.0,之前也用过2.0的方法一致(在下一个java小白)


一、场景

vue使用百度离线地图

二、操作步骤

1.引入3.0js文件

访问这个地址http://api.map.baidu.com/api?v=3.0
拷贝src里的内容http://api.map.baidu.com/getscript?v=3.0&ak=&services=&t=20200927172029
再打开这个链接,复制保存到本地js文件,就命名bmap_offline_api_v3.0_min.js吧
在这里插入图片描述

2.创建map_load.js

BMap_3.0是我存放这些js的文件夹

(function() {
  window.BMap_loadScriptTime = (new Date).getTime();
  window.BMap = window.BMap || {};
  window.BMap.apiLoad = function () {
    delete window.BMap.apiLoad;
  };
  let s = document.createElement('script');
  s.src = '/BMap_3.0/bmap_offline_api_v3.0_min.js';
  document.body.appendChild(s);
})
();

3.修改bmap_offline_api_v3.0_min.js文件

3.1屏蔽ak验证

function oa(a, b) {
        if (/^http/.test(a))  return;//修改  屏蔽ak验证,若调用外部资源直接返回

        if (b) {
            var c = (1E5 * Math.random()).toFixed(0);
            D._rd["_cbk" + c] = function(a) {
                b && b(a);
                delete D._rd["_cbk" + c]
            }
            ;
            a += "&callback=BMap._rd._cbk" + c
        }
        var e = L("script", {
            type: "text/javascript"
        });
        e.charset = "utf-8";
        e.src = a;
        e.addEventListener ? e.addEventListener("load", function(a) {
            a = a.target;
            a.parentNode.removeChild(a)
        }, t) : e.attachEvent && e.attachEvent("onreadystatechange", function() {
            var a = window.event.srcElement;
            a && ("loaded" == a.readyState || "complete" == a.readyState) && a.parentNode.removeChild(a)
        });
        setTimeout(function() {
            document.getElementsByTagName("head")[0].appendChild(e);
            e = q
        }, 1)
    }

3.2加载modules到本地

我的这段代码就在修改ak验证下面,要细心查找
这里是所有的模块,用到时自动加载(在线),离线的话要先下载下来放到本地,如
http://api0.map.bdimg.com/getmodules?v=3.0&mod=模块1,模块2
模块命名格式是map_01arux,直接拼接起来
保存到自己建的modules文件里

var Bc = {
        map: "01arux",
        common: "g1wth0",
        style: "n4zjcm",
        tile: "4h5riy",
        groundoverlay: "hanqlf",
        pointcollection: "mzctia",
        marker: "qq2pj0",
        symbol: "xnfufp",
        canvablepath: "bi2unv",
        vmlcontext: "3wsb1f",
        markeranimation: "vbzta0",
        poly: "bpulbb",
        draw: "qhsgk3",
        drawbysvg: "jdynmi",
        drawbyvml: "yldn4m",
        drawbycanvas: "ilnwax",
        infowindow: "cu34p0",
        oppc: "nwlvbl",
        opmb: "lix5dg",
        menu: "vhxxn0",
        control: "j15uuh",
        navictrl: "atju25",
        geoctrl: "2j1jki",
        copyrightctrl: "1ezsod",
        citylistcontrol: "fjkpbq",
        scommon: "dnbhjq",
        local: "i0prg0",
        route: "4zemxy",
        othersearch: "3bi0vd",
        mapclick: "di1qem",
        buslinesearch: "g5wey4",
        hotspot: "5ak1wj",
        autocomplete: "hg2dum",
        coordtrans: "su4y5t",
        coordtransutils: "0kslnk",
        convertor: "khwhiz",
        clayer: "w3ptjt",
        pservice: "xzax22",
        pcommon: "wajq4y",
        panorama: "am3won",
        panoramaflash: "amklzb"
    };

方法名可能会有区别,但是大体的方法是一致的,这里要细心找

3.3修改modules加载

此处的’/BMap_3.0/modules/'都是我本地的modules

load: function(a, b, c) {
            var e = this.ob(a);
            if (e.Le == this.Bj.Np)
                c && b();
            else {
                if (e.Le == this.Bj.bG) {
                    this.UJ(a);
                    this.hN(a);
                    var f = this;
                    f.gC == t && (f.gC = p,
                    setTimeout(function() {
                        for (var a = [], b = 0, c = f.Qd.gn.length; b < c; b++) {
                            var e = f.Qd.gn[b]
                              , n = "";
                            ia.py.PJ(e) ? n = ia.py.get(e) : (n = "",
                            a.push(e + "_" + Bc[e]));
                            f.Qd.Dv.push({
                                zM: e,
                                rE: n
                            })
                        }
                        f.gC = t;
                        f.Qd.gn.length = 0;
                        // 0 == a.length ? f.DK() : oa(f.TF.IP + "&mod=" + a.join(","))
                        // 修改 加载本地模块文件,在 modules 目录下
						// console.log(a);   //打印所需模块  
                        if( a.length > 0 ){
                            for (let i = 0; i < a.length; i++) {
                                // console.log(a)
                                mf = '/BMap_3.0/modules/' + a[i] + '.js'
                                oa(mf)
                            }
                          } else {
                            f.DK()
                          } 
                          //就到这
                    }, 1));
                    e.Le = this.Bj.xP
                }
                e.zu.push(b)
            }
        },

3.4修改本地工具资源引用

 window.BMAP_PROTOCOL && "https" === window.BMAP_PROTOCOL && (window.HOST_TYPE = 2);
    D.$t = window.HOST_TYPE || "0";
    D.url = D.s0[D.$t];
    D.fp = D.url.proto + D.url.domain.baidumap + "/";
    D.nd = D.url.proto + ("2" == D.$t ? D.url.domain.main_domain_nocdn.other : D.url.domain.main_domain_nocdn.baidu) + "/";
    // D.oa = D.url.proto + ("2" == D.$t ? D.url.domain.main_domain_cdn.other[0] : D.url.domain.main_domain_nocdn.baidu) + "/";
    // D.oa = bmapcfg.home //修改 本地工具资源引用 (离线路径)
    D.oa = '/BMap_3.0/' // 修改,本地工具资源引用(离线路径)
    D.Yi = D.url.proto + D.url.domain.main_domain_cdn.webmap[0] + "/";

3.5修改加载瓦片图

这里是自己搭建的百度地图瓦片图文件资源服务器

pe.getTilesUrl = function(a, b, c) {
        var e = a.x
          , a = a.y
          , f = Tb("normal")
          , g = 1
          , c = oe[c];
        // this.map.mx() && (g = 2);
        // e = this.map.$e.gw(e, b).Zl;
        // return (ne[Math.abs(e + a) % ne.length] + "?qt=vtile&x=" + (e + "").replace(/-/gi, "M") + "&y=" + (a + "").replace(/-/gi, "M") + "&z=" + b + "&styles=" + c + "&scaler=" + g + (6 == A.fa.na ? "&color_dep=32&colors=50" : "") + "&udt=" + f + "&from=jsapi3_0").replace(/-(\d+)/gi, "M$1")
        
        // tdir = bmapcfg.tiles_dir.length>0?bmapcfg.tiles_dir:bmapcfg.home + "tiles";
        // return tdir + "/" + b + "/" + e + "/" + a + bmapcfg.imgext; // 使用本地的瓦片 
        
        return `http://localhost:8686/baiduMap/baidumaps/roadmap/${b}/${e}/${a}.png`//离线瓦片图
    };

此时应该有modules,bmap_offline_api_v3.0_min.js,map_load.js了,其他文件是根据自己所需引入的
在这里插入图片描述

4.修改index.html文件

在index.html通过script标签引入js文件,先引入bmap_offline_api_v3.0_min.js,其次是map_load.js

5.在vue创建地图

在模板里给地图一个容器

a-card(
      style='float: right;width: 70%;height: 588px;margin-top: 4%;margin-right: 5%;'
    )
      #mapShow

写一个创建地图的方法,具体方法可以去参考百度地图api示例,一般3.0向下兼容,具体要看各自的类参考

baiduMap() {
      let map = new window.BMap.Map('mapShow')

      // 左上角加入比例尺
      map.addControl(new window.BMap.ScaleControl({ anchor: BMAP_ANCHOR_TOP_LEFT }))

      map.setCurrentCity('温州')
      map.centerAndZoom(new window.BMap.Point(120.724759, 28.001661), 14)
      map.enableScrollWheelZoom(true)
      map.enableContinuousZoom() //启用地图惯性拖拽,默认禁用
      // map.addEventListener('click', function (e) {
      //   alert(e.point.lng + ',' + e.point.lat)
      // })

      var Navopts = {
        anchor: '',
        offset: new window.BMap.Size(10, 10), //控件的水平偏移值
        type: 'BMAP_NAVIGATION_CONTROL_LARGE', //平移缩放控件的类型
        //BMAP_NAVIGATION_CONTROL_LARGE  标准的平移缩放控件(包括平移、缩放按钮和滑块)
        //BMAP_NAVIGATION_CONTROL_SMALL  仅包含平移和缩放按钮
        //BMAP_NAVIGATION_CONTROL_PAN    仅包含平移按钮
        //BMAP_NAVIGATION_CONTROL_ZOOM   仅包含缩放按钮
        showZoomInfo: '', //是否显示级别提示信息
        enableGeolocation: '', //控件是否集成定位功能,默认为false
      }
      map.addControl(new window.BMap.NavigationControl(Navopts))
    },

在mounted里执行方法

mounted() {
    // console.log(window)
    // this.$nextTick(() => {
    this.baiduMap()
    // })
  },

控制容器布局,具体自己定

#mapShow {
  width: 100%;
  height: 540px;
  padding: 10px;
  position: relative;
}
/* 地图 */
/* .baiduMap{
        height: 100%;
        width: 100%;
    } */
/* 去除地图上,左下字体标注 */
.anchorBL {
  display: none;
}

三、效果图

在这里插入图片描述

总结

这样vue就可以展现离线的百度地图了,但是api还有许多方法还得个人亲自尝试,本人也是首次搭建,如有不足之处,还望多多包涵

  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
1. 在百度地图开放平台申请密钥 首先需要在百度地图开放平台上申请密钥,申请地址为:http://lbsyun.baidu.com/apiconsole/key/create。根据提示填写应用名称、应用类型等信息,然后点击创建密钥,即可获取到ak(Access Key)。 2. 引入百度地图JavaScript API 在页面中引入百度地图JavaScript API的代码,代码如下: ``` <script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak=你的ak"></script> ``` 需要将上面代码中的“你的ak”替换为你在百度地图开放平台申请到的ak。 3. 创建地图容器 在页面中创建一个div元素作为地图容器,代码如下: ``` <div id="mapContainer" style="width: 100%; height: 100%;"></div> ``` 需要为div元素设置宽度和高度,这里设置为100%。 4. 初始化地图 在页面中添加JavaScript代码,初始化地图,代码如下: ``` var map = new BMap.Map("mapContainer"); map.centerAndZoom(new BMap.Point(116.404, 39.915), 11); ``` 这里创建了一个地图对象,将地图容器的id传入BMap.Map()方法中,然后使用BMap.Point()方法创建一个地图中心点的坐标,最后使用map.centerAndZoom()方法将地图缩放级别设置为11。 5. 添加离线地图插件 在页面中引入离线地图插件的代码,代码如下: ``` <script type="text/javascript" src="http://api.map.baidu.com/library/OfflineMap/1.2/src/OfflineMap.min.js"></script> ``` 然后在JavaScript代码中添加以下代码,启用离线地图插件: ``` var offlineMap = new BMap.OfflineMap(); map.addControl(offlineMap); ``` 这里创建了一个离线地图对象,并将其添加到地图中。 6. 下载离线地图 使用离线地图插件提供的download()方法,下载离线地图,代码如下: ``` offlineMap.download(11); //将缩放级别为11的地图下载到本地 ``` 这里将缩放级别为11的地图下载到本地,可以根据自己的需求设置缩放级别。 7. 加载离线地图 使用离线地图插件提供的load()方法,加载离线地图,代码如下: ``` offlineMap.load(11); //加载缩放级别为11的离线地图 ``` 这里加载缩放级别为11的离线地图,可以根据自己的需求设置缩放级别。 8. 查看离线地图 在浏览器中打开网页,即可看到下载的离线地图。当网络不可用时,地图仍然可以正常显示,因为已经下载了离线地图

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值