vue项目中使用百度地图js生成地图

vue yekong

数据可视化大屏项目中经常会使用到百度地图,今天我们实现在vue项目使用使用百度地图。

在以前的数据大屏中,我们使用的是vue2 使用百度地图插件vue-baidu-mapvue3 vite项目使用百度地图插件在vue2和vue3项目中我们都是使用的封装的vue插件来实现我们想要的效果,今天我们不使用封装插件直接使用百度地图js来实现我们想要的效果。

文档地址

vue项目中使用百度地图

获取百度地图key

在使用前,您需先申请密钥(ak)才可使用
申请密钥(ak)

引入js

vue2项目引入js

public/index.html引入百度js

<script src="//api.map.baidu.com/api?type=webgl&v=1.0&ak=yourak"></script>

初始化

vue项目中使用百度地图

<template>
  <div class="bdMap">
    <div class="container" ref="mapContainer" id="container"></div>
  </div>
</template>

<script>
export default {
  name: 'BaiduMap',
  data() {
    return {
      map: null
    };
  },
  mounted() {
    const checkBMap = setInterval(() => {
      if (typeof BMapGL !== 'undefined') {
        this.initMap();
        clearInterval(checkBMap);
      } else {
        console.log('BMapGL is undefined')
      }
    }, 100);
  },
  methods: {
    initMap() {
      var map = new BMapGL.Map("container");          // 创建地图实例
      var point = new BMapGL.Point(116.404, 39.915);  // 创建点坐标
      map.centerAndZoom(point, 15);                 // 初始化地图,设置中心点坐标和地图级别
    }
  }
};
</script>

<style lang="scss" scoped>

.bdMap {
  position: fixed;
  width: 100%;
  height: 100%;
  z-index: 0;
  .container {
    position: relative;
    width: 100%;
    height: 100%;
    z-index: 10;
  }

}
</style>

百度地图自定义动态标注图标

百度地图自定义动态标注图标

动态效果

演示地址

百度地图自定义动态标注图标

11 vue 项目echarts地图点击切换百度地图缩放返回echarts地图

百度地图和echarts互相切换:地图默认显示的是echarts地图,点击对应的地点后,会跳转到百度地图,百度地图缩放以后,重新显示echarts地图。

演示地址

vue 项目echarts地图点击切换百度地图缩放返回echarts地图

动态效果

9.GeoJSON图层渲染

GeoJSON图层渲染

演示地址

vue项目中在百度地图上渲染geoJson轮廓

7.百度地图设置卫星图

百度地图设置卫星图

// 创建地图实例
this.map = new BMapGL.Map('container')
// 创建点坐标
var point = new BMapGL.Point(116.404, 39.915)
// 初始化地图,设置中心点坐标和地图级别
this.map.centerAndZoom(point, 15)
// 设置地图的默认显示类型为卫星地图
this.map.setMapType(BMAP_SATELLITE_MAP);

百度地图设置卫星图

演示地址

百度地图设置卫星图

6.设置自定义图标弹窗

设置自定义图标,自定义图标可以点击后显示浮窗,再次点击浮窗可以显示弹窗

设置自定义图标

为了避免浮窗出现层级问题,我们将组件插入到body中

添加弹窗

演示地址

百度地图设置自定义图标弹窗

5.自定义浮窗样式

右下角为中心点的浮窗效果

自定义浮窗样式

演示地址

百度地图自定义浮窗样式

关键代码

CustomOverlay.prototype.draw = function() {
  var map = this._map;
  var pixel = map.pointToOverlayPixel(this._point);
  this._div.style.left = (pixel.x - this._div.offsetWidth) + "px"; // offsetX为元素的宽度
  this._div.style.top = (pixel.y - this._div.offsetHeight) + "px"; // offsetY为元素的高度
}

4.自定义覆盖物点击显示弹窗

自定义覆盖物点击显示弹窗

我们添加完自定义覆盖物后,还需要通过点击弹窗显示详细信息,这需要给弹窗增加一个点击事件,点击后显示弹窗,并且可以通过点击关闭图标关闭弹窗。

演示地址

百度地图点击自定义覆盖物显示弹窗

实现代码

在上面自定义覆盖物代码的基础上进行修改

// 实现初始化方法
CustomOverlay.prototype.initialize = function (map) {
  this._map = map
  var div = document.createElement('div')
  div.innerHTML = this._html
  div.style.position = 'absolute'

  var oldPeopleHome = div.querySelector('.oldPeopleHome')
  oldPeopleHome.addEventListener('click', function () {
    var map4PopInfo = div.querySelector('.map4PopInfo')
    map4PopInfo.style.display = 'block'
  })
  var closeBtn = div.querySelector('.close')
  closeBtn.addEventListener('click', function (event) {
    console.log('Close button clicked!')  // 在控制台输出,方便调试
    var map4PopInfo = div.querySelector('.map4PopInfo')
    map4PopInfo.style.display = 'none'
    event.stopPropagation()  // 阻止事件冒泡
  })

  map.getPanes().labelPane.appendChild(div)
  this._div = div
  return div
}

数组渲染

  // 添加覆盖物
  const overlaysData = [
    {
      lng: 116.404,
      lat: 39.915,
      name: '养老院名称1',
      num: 50,
      phone: '0531-66668888'
    },
    {
      lng: 116.414,
      lat: 39.925,
      name: '养老院名称2',
      num: 50,
      phone: '0531-66668888'
    }
  ]
  // 批量添加覆盖物
  overlaysData.forEach(data => {
    var html = `<div class='oldPeopleHome'>
                  <div class="map4PopInfo">
                  <div class="popHead">
                  <div class="popIcon"></div>
                  <span>${data.name}</span>
                   </div>
                   <div class="popBody">
                   <div class="popBodyItem">
                   <div class="popBodyItemName">
                   <span>当前入住人数</span>
</div>
                   <div class="popBodyItemDesc">
                   <span>${data.num}人</span>
</div>
</div>
                   <div class="popBodyItem">
<div class="popBodyItemName">
                   <span>机构电话</span>
</div>
                   <div class="popBodyItemDesc">
                   <span>${data.phone}</span>
</div>
</div>
</div>
                      <div class="line"></div>
                      <div class="close"></div>
                   </div>
                </div>`
    let point = new BMapGL.Point(data.lng, data.lat)
    let overlay = new CustomOverlay(point, html)
    this.map.addOverlay(overlay)
  })

3.添加自定义覆盖物

效果图

添加自定义覆盖物

演示地址

百度地图添加自定义覆盖物

定义自定义覆盖物类

// 定义自定义覆盖物的构造函数
function CustomOverlay(point, html) {
  this._point = point;
  this._html = html;
}

// 继承API的BMapGL.Overlay
CustomOverlay.prototype = new BMapGL.Overlay();

// 实现初始化方法
CustomOverlay.prototype.initialize = function(map) {
  this._map = map;
  var div = document.createElement("div");
  div.innerHTML = this._html;
  div.style.position = "absolute";
  map.getPanes().labelPane.appendChild(div);
  this._div = div;
  return div;
}

// 实现绘制方法
CustomOverlay.prototype.draw = function() {
  var position = this._map.pointToOverlayPixel(this._point);
  this._div.style.left = position.x + "px";
  this._div.style.top = position.y + "px";
}

添加覆盖物

// 添加覆盖物
const overlaysData = [
{
  lng: 116.404,
  lat: 39.915,
  html: '<div class=\'oldPeopleHome\'></div>'
},
{
  lng: 116.414,
  lat: 39.925,
  html: '<div class=\'oldPeopleHome\'></div>'
}
]
// 批量添加覆盖物
overlaysData.forEach(data => {
let point = new BMapGL.Point(data.lng, data.lat)
let overlay = new CustomOverlay(point, data.html)
this.map.addOverlay(overlay)
})

2.允许滚轮缩放

map.enableScrollWheelZoom(true);

演示地址

百度地图允许滚轮缩放

1.设置自定义主题色

我们可以事先设置好主题色,百度地图修改地图主题色,然后将配置好的主题色id拿来使用。

设置自定义主题色

map.setMapStyleV2({
    styleId: '55a1a095168744db6bd54be6015a6547'
});

演示地址

设置自定义主题色

相关文件下载地址
此资源需支付 ¥6 后下载
支付宝购买扫右侧红包码购买更优惠,如无法下载请联系微信:17331886870
喜欢
vue项目中使用百度地图js生成地图