今天补发一个六月份给朋友做的一个vue+百度地图的微教程,这个教程本来是做在我的有道云笔记上的,今天特意去我有道云上搜出来这篇教程,让大家能够更轻松的写出地图相关功能!

此教程我主要教vue-baidu-map这个插件的使用,然后会补充一下百度地图原生api的用法

image.png

地图相关介绍:

生活中哪里会用到地图
最常见的:手机导航、车载导航、外卖app、同城跑腿配送类app、微信定位
地图api两大平台
国内常用百度地图api和高德地图api
百度地图开放平台:https://lbsyun.baidu.com/
高德地图开放平台:https://lbs.amap.com/
百度地图api接口文档
注意:接口文档有很多对应的类型,如果从官网进去找接口,我们需要选择支持javascript代码的文档
百度api秘钥获取
所有需要定位功能的代码,最终都会用到地图api,用地图api就需要注册,然后去申请,填写对应的内容即可申请到api秘钥【秘钥类似于调用百度api接口的身份证】

vue-baidu-map组件:

vue-baidu-map是什么
Vue Baidu Map 是一个基于 Vue.js 封装的百度地图组件
组件安装
npm命令:
npm install vue-baidu-map --save
CDN方式(src引入):
<script src="https://unpkg.com/vue-baidu-map"></script>
全局注册
/* vue-baidu-map注册 */ import BaiduMap from 'vue-baidu-map' Vue.use(BaiduMap, {  ak: 'd8zxnvqFie4boLsuUtRD1TB38oskalKL' })

小demo实现:

1、创建demo
将组件放入页面即可
<baidu-map class="bm-view" center="北京" ak="d8zxnvqFie4boLsuUtRD1TB38oskalKL" />
2、方法和属性
center:组件的默认值
zoom:地图默认比例
ready:组件展开后执行的默认异步函数(执行一次)
lng:经度

lat:纬度

<template>
  <div id="app">
    <baidu-map class="bm-view" :center="center" :zoom="zoom" @ready="handler" />
  </div>
</template>

<script>
export default {
  name: 'App',
  data() {
    return {
      center: { lng: 0, lat: 0 },
      zoom: 3
    }
  },
  methods: {
    handler({ BMap, map }) {
      console.log(BMap, map)
      this.center.lng = 116.404
      this.center.lat = 39.915
      this.zoom = 15
    }
  }
}
</script>
<style>
.bm-view {
  width: 100%;
  height: 600px;
}
</style>


电子围栏手动绘制:

<template>
  <div id="app">
    <baidu-map class="bm-view" center="北京" :zoom="zoom"  @mousemove="syncPolyline"
  @click="paintPolyline"
  @rightclick="newPolyline">
    <bm-control>
    <button @click="toggle('polyline')">{{ polyline.editing ? '停止绘制' : '开始绘制' }}</button>
  </bm-control>
  <bm-polyline :path="path" v-for="path of polyline.paths" :key="path"></bm-polyline>
  </baidu-map>

  </div>
</template>

<script>
export default {
  name: 'App',
  data() {
    return {
      center: { lng: 0, lat: 0 },
      zoom: 3,
      polyline: {
        editing: false,
        paths: []
      }
    }
  },
  methods: {
    handler({ BMap, map }) {
      console.log(BMap, map)
      this.center.lng = 116.404
      this.center.lat = 39.915
      this.zoom = 15
    },
    //
    toggle (name) {
      this[name].editing = !this[name].editing
    },
    syncPolyline (e) {
      if (!this.polyline.editing) {
        return
      }
      const {paths} = this.polyline
      if (!paths.length) {
        return
      }
      const path = paths[paths.length - 1]
      if (!path.length) {
        return
      }
      if (path.length === 1) {
        path.push(e.point)
      }
      this.$set(path, path.length - 1, e.point)
    },
    newPolyline (e) {
      if (!this.polyline.editing) {
        return
      }
      const {paths} = this.polyline
      if(!paths.length) {
        paths.push([])
      }
      const path = paths[paths.length - 1]
      path.pop()
      if (path.length) {
        paths.push([])
      }
    },
    paintPolyline (e) {
      if (!this.polyline.editing) {
        return
      }
      const {paths} = this.polyline
      !paths.length && paths.push([])
      paths[paths.length - 1].push(e.point)
    }
  }
}
</script>
<style>
.bm-view {
  width: 100%;
  height: 600px;
}
</style>

电子围栏绘制:

<template>
  <baidu-map class="bm-view" :center="{lng: 116.404, lat: 39.915}" :zoom="15">
    <bm-polygon :path="polygonPath" stroke-color="blue" :stroke-opacity="0.5" :stroke-weight="2" :editing="true" @lineupdate="updatePolygonPath"/>
  </baidu-map>
</template>

<script>
export default {
  data () {
    return {
      polygonPath: [
        {lng: 116.412732, lat: 39.911707},
        {lng: 116.39455, lat: 39.910932},
        {lng: 116.403461, lat: 39.921336}
      ]
    }
  },
  methods: {
    updatePolygonPath (e) {
      this.polygonPath = e.target.getPath()
    },
    addPolygonPoint () {
      this.polygonPath.push({lng: 116.404, lat: 39.915})
    }
  }
}
</script>
<style>
.bm-view {
  width: 100%;
  height: 600px;
}
</style>

百度地图原生api:

image.png

实例化后(第一个参数是容器,第二个是初始配置对象),就可以直接调用
例如禁用拖拽语法:实例对象.disableDragging()