网络知识 娱乐 vue项目中使用百度离线地图(最新全面爬坑版)

vue项目中使用百度离线地图(最新全面爬坑版)

最近项目需求中需要使用百度离线地图,查找翻阅资料整理出来的最详细最新的使用步骤(内含地图下载器 - 无水印版)。希望可以帮到你。


1. 获取js文件

打开此链接,点击框中的 js 文件就可以获得百度地图api的 js 代码。点击左下角的图标,整理代码格式。

然后新建 js 文件,将格式化后的代码粘贴进去,命名为 map.js,再然后将此 js 文件放在 vue 项目中,我的放在了 static/map 下。最后,在 vue 项目的启动入口 index.html 的 head 中引入这个js。

2. 修改map.js文件

以下代码会在百度更新有些出入,但基本样式不变,找相似

2.1 查找 Math.random(),定位到以下位置

function ra(a, b) {
      if(/^http/.test(a)) return;
      // !!!!!这里加判断,如果是调用外部资源就退出去
​
      if (b) {
          var c = (1E5 * Math.random()).toFixed(0);
          B._rd["_cbk" + c] = function(a) {
              b && b(a);
              delete B._rd["_cbk" + c]
          }
          ;
          a += "&callback=BMap._rd._cbk" + c
      }
      var d = H("script", {
          type: "text/javascript"
      });
      d.charset = "utf-8";
      var e = window.___abvk ? window.___abvk : Ec("SECKEY_ABVK")
        , f = Ec("BMAP_SECKEY");
    //     , a = a + ("&seckey=" + encodeURIComponent(e + "," + f));
      // !!!!!这里要引掉,不然会报错
      d.src = a;
      d.addEventListener ? d.addEventListener("load", function(a) {
          a = a.target;
          a.parentNode.removeChild(a)
      }, q) : d.attachEvent && d.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(d);
          d = p
      }, 1)
  }

 2.2 设置引入本地资源路径

 B.url.domain.main_domain_nocdn.baidu  全局多查找几次,定位到下面的代码

B.kz = window.HOST_TYPE || "0";
  B.url = B.s0[B.kz];
  B.Fp = B.url.proto + B.url.domain.baidumap + "/";
  B.oc = B.url.proto + ("2" == B.kz ? B.url.domain.main_domain_nocdn.other : B.url.domain.main_domain_nocdn.baidu) + "/";
  B.la = 'static/map/' // !!!!修改
  // B.la = B.url.proto + ("2" == B.kz ? B.url.domain.main_domain_cdn.other[0] : B.url.domain.main_domain_nocdn.baidu) + "/";
  B.gj = B.url.proto + B.url.domain.main_domain_cdn.webmap[0] + "/";
  B.JN = B.url.proto + B.url.domain.panoVerify + "/";
  B.Sf = function(a, b) {
      var c, d, b = b || "";
      switch (a) {
      case "main_domain_nocdn":
          c = B.oc + b;
          break;
      case "main_domain_cdn":
          c = B.la + b;
          break;
      default:
          d = B.url.domain[a],
          "[object Array]" == Object.prototype.toString.call(d) ? (c = [],
          x.jc.Fb(d, function(a, d) {
              c[d] = B.url.proto + a + "/" + b
          })) : c = B.url.proto + B.url.domain[a] + "/" + b
      }
      return c
  }

2.3 下载本地资源

所谓本地资源,就是在使用地图时需要用到的一些模块(module),比如图层类,标记类,控件类。

你在地图中用到这些模块时,它会自动加载,因此我们需要先把这些模块的js文件下载下来,保存到本地。我这里是把页面中的js都下载下来了,以备不时只需。

定位到下面的代码

var Fc = {
      map: "e2n0fm",
      common: "jlxvtp",
      style: "bma30x",
      tile: "cj2rio",
      vectordrawlib: "4jxzso",
      newvectordrawlib: "y3150j",
      groundoverlay: "0jaelb",
      pointcollection: "lx5y2g",
      marker: "z011n4",
      symbol: "0tzzrj",
      canvablepath: "f0ium1",
      vmlcontext: "ej1lwf",
      markeranimation: "jliqxx",
      poly: "3npbm5",
      draw: "rujla0",
      drawbysvg: "tf4fal",
      drawbyvml: "jcodl3",
      drawbycanvas: "0dkwpn",
      infowindow: "wzr3ei",
      oppc: "yet1s3",
      opmb: "obnpmo",
      menu: "ylfr4a",
      control: "0f3itb",
      navictrl: "i3yt10",
      geoctrl: "vfmmu5",
      copyrightctrl: "ebvxlr",
      citylistcontrol: "j4yzdz",
      scommon: "rf35sx",
      local: "ii5goe",
      route: "w4ds5m",
      othersearch: "cxnese",
      mapclick: "ifnz0n",
      buslinesearch: "43am5j",
      hotspot: "1lfkfx",
      autocomplete: "0dkrlt",
      coordtrans: "mgpahl",
      coordtransutils: "udjlrm",
      convertor: "3tbyma",
      clayer: "czihnq",
      pservice: "tptfcz",
      pcommon: "cvjnoa",
      panorama: "jrlkoj",
      panoramaflash: "o2yrgq",
      vector: "ohmtlw"
  };

使用 http://api0.map.bdimg.com/getmodules?v=2.0&mod= 冒号前的字段_冒号后的字段 ,在浏览器地址栏输入后回车查看到相应js文件后,新建 static/map/modules 文件夹保存到此文件夹,命名为 冒号前的字段_冒号后的字段。

2.4 引用本地资源

定位到下面的代码,做如下修改:

load: function(a, b, c) {
          var d = this.kb(a);
          if (d.Dd == this.Lj.mq)
              c && b();
          else {
              if (d.Dd == this.Lj.IG) {
                  this.EK(a);
                  this.TN(a);
                  var e = this;
                  e.UC == q && (e.UC = o,
                  setTimeout(function() {
                      for (var a = [], b = 0, c = e.Sd.Nn.length; b  0) {
                        for (var i=0; i<a.length; i++) {
                          mf = 'static/map/modules/' + a[i] + '.js'
                          ra(mf)
                          // 修改这部分代码
                        //   console.log('加载模块文件:'+mf);
                        // 打印后可查看路径是否正确
                        }
                      } else {
                        e.pL()
                      }
                  }, 1));
                  d.Dd = this.Lj.eQ
              }
              d.bv.push(b)
          }
      },

3. 下载离线瓦片地址

离线瓦片可以理解为地图离线包,没有它,离线地图无法显示的。 

下载地图加载器,安装后下载地图瓦片。这里就不介绍工具的使用了,下载完之后可放在 static/map/tiles 目录里,下载几级的瓦片地图就显示到几级。

3.1 配置瓦片地址

新建 static/map/map_loader.js 文件

var bmapcfg = {
  'imgext'      : '.png',   //瓦片图的后缀  根据需要修改,一般是 .png .jpg
  'tiles_dir'   : '',       //普通瓦片图的地址,为空默认在tiles/ 目录
};
var scripts = document.getElementsByTagName("script");
var JS__FILE__ = scripts[scripts.length - 1].getAttribute("src");  //获得当前js文件路径
bmapcfg.home = JS__FILE__.substr(0, JS__FILE__.lastIndexOf("/")+1); //地图API主目录

 在 index.html 文件中引入

3.2 修改API文件加载瓦片路径

Vd.getTilesUrl = function(a, b, c) {
      var d = a.x
        , a = a.y
        , e = Ub("normal")
        , f = 1
        , c = Ud[c];
      // this.map.Xx() && (f = 2);
      // d = this.map.gb.os(d, b).nm;
      // return (Td[Math.abs(d + a) % Td.length] + "?qt=vtile&x=" + (d + "").replace(/-/gi, "M") + "&y=" + (a + "").replace(/-/gi, "M") + "&z=" + b + "&styles=" + c + "&scaler=" + f + (6 == x.da.ma ? "&color_dep=32&colors=50" : "") + "&udt=" + e + "&from=jsapi2_0").replace(/-(d+)/gi, "M$1")
    //   tdir = 'static/map/tiles'
    //   return tdir + '/' + b + '/' + d + '/' + a + '.png'
      let tdir = bmapcfg.tiles_dir.length>0?bmapcfg.tiles_dir:bmapcfg.home + "tiles";
    //   console.log(tdir + "/" + b + "/" + d + "/" + a + bmapcfg.imgext);
    // 可以打印看看瓦片图片地址是否正确
      return tdir + "/" + b + "/" + d + "/" + a + bmapcfg.imgext; // 使用本地的瓦片
  }

ps:地图不能显示出来,是瓦片相关有问题
地图的功能不能实现,是模块相关有问题

4. Nginx反向代理

如果你下载的瓦片图片太多,导致项目过于卡,可以使用Nginx反向代理进行解决。

server {
        #nginx代理端口
        listen       9090;
​
        #nginx代理名称,可以写域名或者ip,也可以写多个
        server_name  localhost;
​
        root   C:/Users/Administrator/Desktop/百度离线地图项目/bmap/;#百度离线的路经 用于nginx代理访问 相对于当前服务的位置
​
        location / {
            # 跨域问题
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
            add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
        }
        add_header Cache-Control "no-cache,must-revalidate"; #解决缓存问题
var bmapcfg = {
  'imgext': '.png', // 瓦片图的后缀  根据需要修改,一般是 .png .jpg
  'tiles_dir': 'http://127.0.0.1:9090' // 普通瓦片图的地址,为空默认在tiles/ 目录
};
var scripts = document.getElementsByTagName('script');
var JS__FILE__ = scripts[scripts.length - 1].getAttribute('src'); // 获得当前js文件路径
bmapcfg.home = JS__FILE__.substr(0, JS__FILE__.lastIndexOf('/') + 1); // 地图API主目录
​

链接:https://pan.baidu.com/s/1IYuSjop1KmowRumPHmHzZQ 

提取码:8ord

配置完如果还是不可以使用的,可以在此百度网盘链接中下载完整的压缩文件,包含 map.js 与 map_loader.js 文件与8,9级无水印瓦片地图。

完整项目目录

多标记示例


  
​ export default { data() { return { map: undefined, overView: undefined, marker: undefined, BMap: undefined, markerArr: [ { position: { lng: '116.403963', lat: '39.915119' } }, { position: { lng: '114.838532', lat: '40.818898' } }, { position: { lng: '116.686553', lat: '39.543145' } }, { position: { lng: '115.99599', lat: '39.487724' } }, ] } }, mounted() { this.$nextTick(() => { this.baiduMap() }) }, methods: { baiduMap(){ // debugger this.BMap = BMap; // 创建地图实例 this.map = new BMap.Map("mapShow"); // 创建点坐标 let point = new BMap.Point(116.403963,39.915119); //创建标注 ​ for(var i = 0; i < this.markerArr.length; i++){ var pt = new BMap.Point(this.markerArr[i].position.lng, this.markerArr[i].position.lat); var marker = new BMap.Marker(pt); this.map.addOverlay(marker); } ​ //缩略地图控件。 this.overView=new BMap.OverviewMapControl({isOpen: true}); //添加控件 this.map.addControl(this.overView); // 初始化地图,设置中心点坐标和地图级别 this.map.centerAndZoom(point, 9); //开启鼠标滚轮缩放 this.map.enableScrollWheelZoom(false); }, }, } ​ // 地图一定要设置尺寸,不然无法显示 .baiduMap { width: 100%; height: 100%; } ​ // 隐藏地图左下角版权 .anchorBL { display: none; }

效果

本文是我亲自爬坑经历,希望能对你有所帮助。编写文章不易,希望大家多多点赞打赏!

(声明:本人前端小白,发文章只为记录自己学习过程,如果文中有什么错误欢迎大家指出。)

如果觉得这篇文章帮助了你,关注、点赞或者打赏一下都是可以的(*^▽^*)

本文参考  vue集合离线百度地图(原创)

对作者表示感谢!