vue-baidu-map 绘制多边形

一、效果图
在这里插入图片描述

二、安装百度地图

npm install vue-baidu-map --save
// 或者
yarn install vue-baidu-map

三、main.js引入

import BMap from 'vue-baidu-map'
 
Vue.use(BaiduMap, {
  // ak 是在百度地图开发者平台申请的密钥 详见 http://lbsyun.baidu.com/apiconsole/key */
  ak: '*******'
})

四、代码

<template>
  <div class="draw-map">
    <baidu-map
      :center="center"
      :zoom="zoom"
      :map-click="false"
      @mousemove="syncPolygon"
      @ready="handler"
      style="height:500px"
      @click="paintPolygon"
      @rightclick="newPolygon"
      :scroll-wheel-zoom="true"
    >
      <bm-polygon
        :path="path"
        v-for="path of polygonPath.paths"
        :key="path.toString()"
        stroke-color="blue"
        fill-color="red"
        :fill-opacity="0.8"
        :stroke-opacity="0.5"
        :stroke-weight="2"
        @click="alertpath"
        :editing="true"
        @lineupdate="updatePolygonPath"
      />
      <bm-control>
        <button @click="toggle('polygonPath')">
          {{ polygonPath.editing ? "停止绘制" : "开始绘制" }}
        </button>
      </bm-control>
    </baidu-map>
  </div>
</template>

<script>
export default {
  name: "Polygon",
  data() {
    return {
      center: {
        lng: 117.233486,
        lat: 31.826972,
      },

      zoom: 13,
      polygonPath: {
        editing: false,
        paths: [], // 绘制完成后的经纬度,其实是在画的时候动态push的,因为在点击的时候触发了 paintPolygon 函数
      },
    };
  },
  methods: {
    handler({ BMap, map }) {
      console.log(BMap, map);
      //map.disableDoubleClickZoom(); //禁止双击地图放大
      //禁止双指缩放disablePinchToZoom()
    },
    // 开启多边形绘制
    toggle(name) {
      this[name].editing = !this[name].editing;
      // 在这里做一步判断,如果有路径且开启绘制就把原来的路径清空
      if (this.polygonPath.paths && this.polygonPath.editing) {
        this.polygonPath.paths = [];
      }
    },
    // 鼠标移动时
    syncPolygon(e) {
      if (!this.polygonPath.editing) {
        return;
      }
      const { paths } = this.polygonPath;
      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);
    },
    // 鼠标右键点击时往路径里push一个面
    newPolygon(e) {
      if (!this.polygonPath.editing) {
        return;
      }
      // 当开始绘制后把按钮调回开始绘制状态,防止绘制多个图形
      this["polygonPath"].editing = !this["polygonPath"].editing;
      const { paths } = this.polygonPath;
      if (!paths.length) {
        paths.push([]);
      }
      const path = paths[paths.length - 1];
      path.pop();
      if (path.length) {
        paths.push([]);
      }
    },
    // 鼠标左键多边形绘制
    paintPolygon(e) {
      if (!this.polygonPath.editing) {
        return;
      }
      const { paths } = this.polygonPath;
      !paths.length && paths.push([]);
      paths[paths.length - 1].push(e.point);
      console.log(this.polygonPath);
    },
    alertpath(e) {
      console.log(e.currentTarget.so);
      console.log(this.polygonPath.paths[0]);
    },
    updatePolygonPath(e) {
      //编辑覆盖物时触发,获取坐标点集合
      this.polygonPath.paths[0] = e.target.getPath();
      console.log(this.polygonPath);
    },
  },
};
</script>
<style lang="scss" scoped>
.draw-map {
  width: 100%;
  height: 500px;
}
</style>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值