【vue】通过百度地图实现鼠标绘制多边形打点功能

本文介绍了如何利用百度地图API和绘制工具实现地图上的多边形绘制、保存以及清除功能。通过封装`loadBaiDuDrawMap`函数,实现了异步加载地图和绘制组件,支持绘制多边形、保存经纬度、清除单个多边形以及全部多边形。在实际应用中,可以根据需求进行页面调用和扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

今天接到这么一个需求:打开地图后,地图上显示提前预设好的区域。
实现方法:
1,通过高德或百度地图的鼠标绘制功能可以实现
2,先在地图上将区域选好并保存,显示时可以根据保存的区域来渲染。
3,但百度地图的鼠标绘制功能更强大完善,使用起来也简单一些,所以最后决定使用百度地图


将代码原封不动的复制到你的项目之后可实现的功能:
1,保存选中多边形的经纬度,多个多边形以二位数组形式保存;
2,清除上一个编辑完成的多边形;
3,清除所有多边形。

一、封装loadBaiDuDrawMap

1,新建一个loadBMap.js文件,将以下代码粘贴进去,将xxx修改为你申请的key

const ak = "xxx"; // 百度的地图密钥

// 异步加载百度地图
function loadBaiDuMap() {
  return new Promise(function (resolve, reject) {
    try {
      resolve(BMapGL);
    } catch (err) {
      window.init = function () {
        resolve(BMapGL);
      };
      let script = document.createElement("script");
      script.type = "text/javascript";
      script.src = `http://api.map.baidu.com/api?v=1.0&type=webgl&ak=${ak}&callback=init`;
      script.onerror = reject;
      document.body.appendChild(script);
    }
  });
}
export { loadBaiDuMap };

// 异步加载百度地图及绘制工具
function loadBaiDuDrawMap() {
  return loadBaiDuMap().then((BMapGL) => {
    let loaded = false;
    try {
      loaded = BMapGLLib && BMapGLLib.DrawingManager;
    } catch (err) {
      loaded = false;
    }
    if (!loaded) {
      let script = document.createElement("script");
      script.type = "text/javascript";
      script.src =
        "http://mapopen.cdn.bcebos.com/github/BMapGLLib/DrawingManager/src/DrawingManager.min.js";
      document.body.appendChild(script);
      let link = document.createElement("link");
      link.rel = "stylesheet";
      link.href =
        "http://mapopen.cdn.bcebos.com/github/BMapGLLib/DrawingManager/src/DrawingManager.min.css";
      document.body.appendChild(link);
    }
    return BMapGL;
  });
}
export { loadBaiDuDrawMap };

二、在页面中调用loadBaiDuDrawMap

<template>
  <div class="home">
    <!-- 地图容器 -->
    <div id="container"></div>

    <div class="btns">
      <button @click="draw">开始绘制多边形</button>
      <button @click="clear">清空所有多边形</button>
      <button @click="clearLast" :disabled="isDisable">清空上一个多边形</button>
    </div>
  </div>
</template>

<script>
import { loadBaiDuDrawMap } from "@/utils/loadBMap.js";
export default {
  name: "Home",
  data() {
    return {
      isDisable: true,
      map: null,
      // 多边形样式
      styleOptions: {
        strokeColor: "#5E87DB", // 边线颜色
        fillColor: "#5E87DB", // 填充颜色
        strokeWeight: 2, // 边线宽度
        strokeOpacity: 1, // 边线透明度
        fillOpacity: 0.2, // 填充透明度
      },
      polygons: [], // 所有多边形
      polygonPaths: [], // 所有坐标
    };
  },
  mounted() {
    this.initMap();
  },
  methods: {
    initMap() {
      loadBaiDuDrawMap().then((BMapGL) => {
        this.map = new BMapGL.Map("container");
        const point = new BMapGL.Point(114.031761, 22.542826);
        // 初始化地图,设置中心点坐标和地图级别
        this.map.centerAndZoom(point, 19);
        //开启鼠标滚轮缩放
        this.map.enableScrollWheelZoom(true);
      });
    },
    draw() {
      const drawingManager = new BMapGLLib.DrawingManager(this.map, {
        rectangleOptions: this.styleOptions,
      });
      drawingManager.setDrawingMode(BMAP_DRAWING_POLYGON);
      drawingManager.open();

      drawingManager.addEventListener("polygoncomplete", (e) => {
        this.polygons.push(e);
        this.polygonPaths.push(e.getPath());

        if (this.polygons.length > 1) {
          this.isDisable = false;
        }
      });
    },

    clear() {
      this.map.clearOverlays();
      this.polygons = [];
      this.polygonPaths = [];
    },

    clearLast() {
      const overlays = this.map.getOverlays();
      let length = overlays.length;
      const lastOverlay = overlays[length - 1];

      this.map.removeOverlay(lastOverlay);
      if (length <= 2) {
        this.isDisable = true;
      }
    },
  },
};
</script>

<style scoped>
#container {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
}

.btns {
  position: absolute;
  top: 20px;
  left: 20px;
  z-index: 10;
}
</style>


总结

loadBaiDuDrawMap中的代码没有特殊需求的话只需要将key值改为你的key值就行。页面中可根据自己需求随意修改扩展

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值