在vue中使用百度地图的鼠标绘制功能,轻松实现画个圈就可以查询范围内的坐标

820 阅读1分钟

直接上代码实现

  • 在 vue的工程 public/index.html引入代码
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="renderer" content="webkit">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' https://* 'unsafe-inline'; worker-src 'self' https://* http://* 'unsafe-inline'; script-src 'self' https://* 'unsafe-inline' 'unsafe-eval'" />
    <script type="text/javascript" src="https://api.map.baidu.com/api?v=3.0&ak=申请的百度ak"></script>
    <script type="text/javascript" src="https://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js"></script>
    <script type="text/javascript" src="https://api.map.baidu.com/library/GeoUtils/1.2/src/GeoUtils_min.js"></script>
    <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=申请的百度ak"></script>
    <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=申请的百度ak&plugin=AMap.Autocomplete,AMap.PlaceSearch"></script>
    <script type="application/javascript">
    </script>
    <title><%= webpackConfig.name %></title>
  </head>
  <body>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>

切记一定要百度地图的控制台申请的权限为JavaScript的使用权限才可以调用。

  • 在vue.config.js中配置百度地图的插件,在module.exports中的configureWebpack配置插件功能,代码如下:
  configureWebpack: {
    // provide the app's title in webpack's name field, so that
    // it can be accessed in index.html to inject the correct title.
    name: name,
    resolve: {
      alias: {
        '@': resolve('src')
      }
    },
    externals: {
      BMap: 'window.BMap',
      BMapLib: 'window.BMapLib'
    }
  },
  • 在页面调用百度地图的鼠标绘制功能,
<template>
  <div id="app">
    <div id="container" style="width: 100%;min-height: 900px" />
  </div>
</template>

<script>
import BMap from 'BMap'
import BMapLib from 'BMapLib'
export default {
  name: 'OppoMap',
  data() {
    return {
      map: '',
      point_addr: '',
      drawer: false,
      distance: 0,
      overlays: [],
      coordinate: []
    }
  },
  mounted() {
    this.init()
  },
  methods: {
    init() {
      this.map = new BMap.Map('container')
      var poi = new BMap.Point(118.800122, 32.064407)
      this.map.centerAndZoom(poi, 15)
      this.map.enableScrollWheelZoom()
      var styleOptions = {
        strokeColor: 'red', // 边线颜色。
        fillColor: 'red', // 填充颜色。当参数为空时,圆形将没有填充效果。
        strokeWeight: 3, // 边线的宽度,以像素为单位。
        strokeOpacity: 0.8, // 边线透明度,取值范围0 - 1。
        fillOpacity: 0.6, // 填充的透明度,取值范围0 - 1。
        strokeStyle: 'solid' // 边线的样式,solid或dashed。
      }
      // 实例化鼠标绘制工具
      var drawingManager = new BMapLib.DrawingManager(this.map, {
        isOpen: false, // 是否开启绘制模式
        enableSorption: true, // 是否开启边界吸附功能
        enableDrawingTool: true, // 是否显示工具栏
        drawingToolOptions: {
          anchor: BMAP_ANCHOR_TOP_RIGHT, // 位置
          offset: new BMap.Size(5, 5), // 偏离值
          drawingModes: [
            BMAP_DRAWING_CIRCLE
          ]
        },
        circleOptions: styleOptions // 圆的样式
      })

      var circlecomplete = function(e) {
        drawingManager.close()
      }
      // 添加鼠标绘制工具监听事件,用于获取绘制结果
      drawingManager.addEventListener('circlecomplete', circlecomplete)
      drawingManager.addEventListener('overlaycomplete', this.overlaycomplete)
    },
    overlaycomplete(e) {
      console.log(e)
      const distance = BMapLib.GeoUtils.getDistance(e.overlay.point, e.overlay.ja[0])

      if (distance === 0 || distance === null || distance === undefined) {
        return
      }
      const loading = this.$loading({
        lock: true,
        text: 'Loading',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      })
      this.clearAll()
      this.overlays = []
      this.coordinate = []
      var myGeo = new BMap.Geocoder({ extensions_town: true })
      const _this = this
      myGeo.getLocation(new BMap.Point(e.overlay.point.lng, e.overlay.point.lat), function(result) {
        if (result) {
          _this.point_addr = result.address
        }
      })
      this.distance = distance
      this.overlays.push(e.overlay)
    },
    clearAll() {
      for (let i = 0; i < this.overlays.length; i++) {
        this.map.removeOverlay(this.overlays[i])
      }
      this.overlays = []
      this.coordinate = []
    }
  }
}
</script>

上述代码直接复制就可以使用,overlaycomplete是监听在鼠标绘制完成时调用。可以在画图完成后调用自己的业务代码。