vue加载百度地图(只加载一次)

vue加载百度地图和热力图插件(只加载一次)

<template>
  <div style="height: 100%;width: 100%">
    <button @click="initHeatMap">显示热力图</button>
    <div id="bmap" style="height: 100%;width: 100%"></div>
  </div>
</template>

<script>
  const points = [
    {'lng': 116.418261, 'lat': 39.921984, 'count': 50},
    {'lng': 116.423332, 'lat': 39.916532, 'count': 51},
    {'lng': 116.419787, 'lat': 39.930658, 'count': 15},
    {'lng': 116.418455, 'lat': 39.920921, 'count': 40},
    {'lng': 116.418843, 'lat': 39.915516, 'count': 100},
    {'lng': 116.42546, 'lat': 39.918503, 'count': 6},
    {'lng': 116.423289, 'lat': 39.919989, 'count': 18},
    {'lng': 116.418162, 'lat': 39.915051, 'count': 80},
    {'lng': 116.422039, 'lat': 39.91782, 'count': 11},
    {'lng': 116.41387, 'lat': 39.917253, 'count': 7},
    {'lng': 116.41773, 'lat': 39.919426, 'count': 42},
    {'lng': 116.421107, 'lat': 39.916445, 'count': 4},
    {'lng': 116.417521, 'lat': 39.917943, 'count': 27},
    {'lng': 116.419812, 'lat': 39.920836, 'count': 23},
    {'lng': 116.420682, 'lat': 39.91463, 'count': 60},
    {'lng': 116.415424, 'lat': 39.924675, 'count': 8},
    {'lng': 116.419242, 'lat': 39.914509, 'count': 15},
    {'lng': 116.422766, 'lat': 39.921408, 'count': 25},
    {'lng': 116.421674, 'lat': 39.924396, 'count': 21},
    {'lng': 116.427268, 'lat': 39.92267, 'count': 1},
    {'lng': 116.417721, 'lat': 39.920034, 'count': 51},
    {'lng': 116.412456, 'lat': 39.92667, 'count': 7},
    {'lng': 116.420432, 'lat': 39.919114, 'count': 11},
    {'lng': 116.425013, 'lat': 39.921611, 'count': 35},
    {'lng': 116.418733, 'lat': 39.931037, 'count': 22},
    {'lng': 116.419336, 'lat': 39.931134, 'count': 4},
    {'lng': 116.413557, 'lat': 39.923254, 'count': 5},
    {'lng': 116.418367, 'lat': 39.92943, 'count': 3},
    {'lng': 116.424312, 'lat': 39.919621, 'count': 100},
    {'lng': 116.423874, 'lat': 39.919447, 'count': 87},
    {'lng': 116.424225, 'lat': 39.923091, 'count': 32},
    {'lng': 116.417801, 'lat': 39.921854, 'count': 44},
    {'lng': 116.417129, 'lat': 39.928227, 'count': 21},
    {'lng': 116.426426, 'lat': 39.922286, 'count': 80},
    {'lng': 116.421597, 'lat': 39.91948, 'count': 32},
    {'lng': 116.423895, 'lat': 39.920787, 'count': 26},
    {'lng': 116.423563, 'lat': 39.921197, 'count': 17},
    {'lng': 116.417982, 'lat': 39.922547, 'count': 17},
    {'lng': 116.426126, 'lat': 39.921938, 'count': 25},
    {'lng': 116.42326, 'lat': 39.915782, 'count': 100},
    {'lng': 116.419239, 'lat': 39.916759, 'count': 39},
    {'lng': 116.417185, 'lat': 39.929123, 'count': 11},
    {'lng': 116.417237, 'lat': 39.927518, 'count': 9},
    {'lng': 116.417784, 'lat': 39.915754, 'count': 47},
    {'lng': 116.420193, 'lat': 39.917061, 'count': 52},
    {'lng': 116.422735, 'lat': 39.915619, 'count': 100},
    {'lng': 116.418495, 'lat': 39.915958, 'count': 46},
    {'lng': 116.416292, 'lat': 39.931166, 'count': 9},
    {'lng': 116.419916, 'lat': 39.924055, 'count': 8},
    {'lng': 116.42189, 'lat': 39.921308, 'count': 11},
    {'lng': 116.413765, 'lat': 39.929376, 'count': 3},
    {'lng': 116.418232, 'lat': 39.920348, 'count': 50},
    {'lng': 116.417554, 'lat': 39.930511, 'count': 15},
    {'lng': 116.418568, 'lat': 39.918161, 'count': 23},
    {'lng': 116.413461, 'lat': 39.926306, 'count': 3},
    {'lng': 116.42232, 'lat': 39.92161, 'count': 13},
    {'lng': 116.4174, 'lat': 39.928616, 'count': 6},
    {'lng': 116.424679, 'lat': 39.915499, 'count': 21},
    {'lng': 116.42171, 'lat': 39.915738, 'count': 29},
    {'lng': 116.417836, 'lat': 39.916998, 'count': 99},
    {'lng': 116.420755, 'lat': 39.928001, 'count': 10},
    {'lng': 116.414077, 'lat': 39.930655, 'count': 14},
    {'lng': 116.426092, 'lat': 39.922995, 'count': 16},
    {'lng': 116.41535, 'lat': 39.931054, 'count': 15},
    {'lng': 116.413022, 'lat': 39.921895, 'count': 13},
    {'lng': 116.415551, 'lat': 39.913373, 'count': 17},
    {'lng': 116.421191, 'lat': 39.926572, 'count': 1},
    {'lng': 116.419612, 'lat': 39.917119, 'count': 9},
    {'lng': 116.418237, 'lat': 39.921337, 'count': 54},
    {'lng': 116.423776, 'lat': 39.921919, 'count': 26},
    {'lng': 116.417694, 'lat': 39.92536, 'count': 17},
    {'lng': 116.415377, 'lat': 39.914137, 'count': 19},
    {'lng': 116.417434, 'lat': 39.914394, 'count': 43},
    {'lng': 116.42588, 'lat': 39.922622, 'count': 27},
    {'lng': 116.418345, 'lat': 39.919467, 'count': 8},
    {'lng': 116.426883, 'lat': 39.917171, 'count': 3},
    {'lng': 116.423877, 'lat': 39.916659, 'count': 34},
    {'lng': 116.415712, 'lat': 39.915613, 'count': 14},
    {'lng': 116.419869, 'lat': 39.931416, 'count': 12},
    {'lng': 116.416956, 'lat': 39.925377, 'count': 11},
    {'lng': 116.42066, 'lat': 39.925017, 'count': 38},
    {'lng': 116.416244, 'lat': 39.920215, 'count': 91},
    {'lng': 116.41929, 'lat': 39.915908, 'count': 54},
    {'lng': 116.422116, 'lat': 39.919658, 'count': 21},
    {'lng': 116.4183, 'lat': 39.925015, 'count': 15},
    {'lng': 116.421969, 'lat': 39.913527, 'count': 3},
    {'lng': 116.422936, 'lat': 39.921854, 'count': 24},
    {'lng': 116.41905, 'lat': 39.929217, 'count': 12},
    {'lng': 116.424579, 'lat': 39.914987, 'count': 57},
    {'lng': 116.42076, 'lat': 39.915251, 'count': 70},
    {'lng': 116.425867, 'lat': 39.918989, 'count': 8}]
  const ak = '你的百度地图秘钥'
  const loadBaiDuMap = function () {
    return new Promise(function (resolve, reject) {
        try {
          console.log('BMap is defined:', BMap !== undefined)
          resolve(BMap)
        } catch (e) {
          window.init = function () {
            resolve(BMap)
            let script2 = document.createElement('script')
            script2.type = 'text/javascript'
            script2.src = 'http://api.map.baidu.com/library/Heatmap/2.0/src/Heatmap_min.js'
            script2.onerror = reject
            document.body.appendChild(script2)
          }
          let script1 = document.createElement('script')
          script1.type = 'text/javascript'
          script1.src = 'http://api.map.baidu.com/api?v=2.0&ak=' + ak + '&callback=init'
          script1.onerror = reject
          document.body.appendChild(script1)
        }
    })
  }

  export default {
    data () {
      return {
        bmap: {},
        heatmapOverlay: {}
      }
    },
    methods: {
      initBMap () {
        let vue = this
        loadBaiDuMap().then((BMap, BMapLib) => {
          vue.bmap = new BMap.Map('bmap', {enableMapClick: false})            // 创建Map实例
          vue.bmap.enableScrollWheelZoom()
          vue.bmap.centerAndZoom('北京', 15)
          // 不能在此处继续添加热力图,没有找到解决办法,如有高人还请指教一二啊
        })
      },
      initHeatMap () {
        this.heatmapOverlay = new BMapLib.HeatmapOverlay({'radius': 20})
        this.bmap.addOverlay(this.heatmapOverlay)
        this.heatmapOverlay.setDataSet({data: points, max: 100})
      }
    },
    mounted () {
      this.initBMap()
    }
  }
</script>

<style>

</style>

### 集成离线百度地图Vue项目 为了在 Vue 项目中集成并使用离线的百度地图,需遵循特定流程来准备和配置环境。此过程涉及下载必要的地图瓦片文件以及调整应用设置以适应离线工作模式。 #### 准备阶段 确保已获取所需的地图瓦片数据集,并将其存储于项目的 `static` 文件夹下指定路径 `/map/tiles` 中[^3]。这一步骤至关重要,因为这些预先下载好的图像片段构成了最终呈现给用户的地图基础层。 #### 安装依赖库 对于 Vue 应用来说,推荐采用官方提供的 SDK 或者社区维护良好的第三方包来进行地图组件开发。考虑到当前需求为离线环境下运行,应优先考虑那些能够良好支持本地资源加载方案的选择。 ```bash npm install baidu-map-gl --save ``` 上述命令用于安装适用于 Web 的百度地图 JavaScript API 封装版本之一,它可以帮助简化后续编码过程中涉及到的地图初始化操作[^2]。 #### 修改入口文件 编辑主页面 HTML 文档,在 `<head>` 标签内部引入自定义样式表与脚本链接: ```html <!-- index.html --> <head> <!-- ...其他已有内容... --> <link rel="stylesheet" href="./css/baidumap.css"> </head> <body> <div id="app"></div> <!-- 加载本地缓存的地图API JS文件 --> <script type="text/javascript" src="/js/BMapGL.js"></script> </body> ``` 注意这里的 `BMapGL.js` 是指事先已经放置到服务器根目录下的百度地图 API 脚本副本;而 CSS 则用来定制化界面外观效果[^1]。 #### 编写地图组件逻辑 创建一个新的 Vue 组件负责渲染地图容器及其交互行为: ```javascript // components/OfflineMap.vue <template> <div ref="mapContainer" class="map-container"></div> </template> <script> export default { mounted() { const map = new BMapGL.Map(this.$refs.mapContainer); let point = new BMapGL.Point(116.404, 39.915); // 设置中心点坐标 map.centerAndZoom(point, 15); // 使用预加载的地图切片作为底图源 var tileLayer = new BMapGL.TileLayer(); tileLayer.getTilesUrl = function (tileCoord, zoom) { return '/static/map/tiles/' + zoom + '/' + tileCoord.x + '_' + (-tileCoord.y - 1) + '.png'; }; map.addTileLayer(tileLayer); } }; </script> <style scoped> .map-container { width: 100%; height: 100vh; } </style> ``` 这段代码展示了如何通过覆盖默认方法来自定义地图瓦片 URL 模板的方式实现离线访问功能。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值