VueBaiDuMap实现绘制自定义区域(即多边形)

效果

 前提是得在main.js中引入vueBaiDuMap以及安装依赖

   <el-button
          style="margin: 20px 0 0 20px"
          type="primary"
          size="small"
          @click="showDrawAreaDialog"
          >绘制多边形弹窗</el-button
        >



    /**
     * @Event 方法
     * @description: 打开绘制区域弹窗
     * */
    showDrawAreaDialog() {
      this.$refs.drawAreaDialog.showDialog();
    },
<!--
 * @Description: vueBaiDuMap绘制自定义区域 弹窗 页面
 * @Author: mhf
 * @Date: 2023-04-27 11:37:11
-->

<template>
  <el-dialog
    title="绘制区域"
    width="50%"
    :visible.sync="dialogVisible"
    :before-close="hideDialog"
    :close-on-click-modal="false"
  >
    <div class="dialog-body">
      <baidu-map
        class="map"
        :center="center"
        :zoom="zoom"
        :map-click="false"
        :scroll-wheel-zoom="true"
        @mousemove="syncPolygon"
        @ready="handler"
        @click="paintPolygon"
        @rightclick="newPolygon"
      >
        <bm-polygon
          :path="path"
          v-for="path of polygonPath.paths"
          :key="path.toString()"
          stroke-color="#1492FF"
          fill-color="#1492FF"
          :fill-opacity="0.2"
          :stroke-opacity="1"
          :stroke-weight="3"
          @click="alertpath"
        />
        <bm-control>
          <el-button type="danger" size="small" @click="toggle('polygonPath')">
            {{ polygonPath.editing ? "停止绘制" : "开始绘制" }}
          </el-button>
        </bm-control>
      </baidu-map>
    </div>
    <span slot="footer" class="dialog-footer">
      <el-button @click="hideDialog">取 消</el-button>
      <el-button type="primary" @click="hideDialog">确 定</el-button>
    </span>
  </el-dialog>
</template>

<script>
export default {
  name: "drawAreaDialog",
  components: {},
  props: {},
  data() {
    return {
      dialogVisible: false,
      haha: "百度地图",
      center: { lng: 119.93344129237624, lat: 28.464762954747187 },
      zoom: 13,
      polygonPath: {
        editing: false,
        paths: [], // 绘制完成后的经纬度,其实是在画的时候动态push的,因为在点击的时候触发了 paintPolygon 函数
      },
    };
  },
  methods: {
    handler({ BMap, map }) {
      console.log(BMap, map);
    },
    getClickInfo(e) {
      console.log(e.point.lng);
      console.log(e.point.lat);
    },
    // 开启多边形绘制
    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);
    },
    alertpath(e) {
      console.log(e.currentTarget.so);
      console.log(this.polygonPath.paths[0]);
    },

    /**
     * @Event 方法
     * @description: 关闭弹窗
     * */
    hideDialog() {
      this.dialogVisible = false;
    },

    /**
     * @Event 方法
     * @description: 打开弹窗
     * */
    showDialog() {
      this.dialogVisible = true;
    },
  },
  created() {},
  mounted() {},
};
</script>

<style lang="scss" scoped>
.dialog-body {
  width: 100% !important;
  height: 500px !important;

  .map {
    width: 100% !important;
    height: 100% !important;
  }
}
</style>

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
amap-vue 是一个基于Vue.js的高德地图组件,它提供了丰富的地图相关功能和工具,其中包括区域绘制功能。 在使用 amap-vue 进行区域绘制时,我们需要先引入相关的组件,比如 Amap,同时还要进行相应的配置。然后我们可以在需要显示地图的区域使用 Amap 组件,并设置一些参数来指定地图的中心点、缩放级别等。 接下来,我们可以在地图上添加一个绘制工具条,该工具条可以包含多个绘制类型的按钮,比如多边形、折线、圆形等。当用户点击其中一个按钮时,即可开始绘制相应类型的区域。用户可以通过鼠标在地图上点击来绘制区域的各个点,最后双击完成绘制。 在绘制区域的过程中,我们可以根据用户的操作实时更新绘制结果,比如添加新的点、移动点的位置、删除不需要的点等。同时我们也可以提供一些交互效果,比如在绘制区域后将其高亮显示、显示区域的面积或周长等信息。 除了绘制区域,我们还可以对已绘制区域进行编辑。编辑工具可以让用户对每个点进行移动、删除或添加操作,从而修改区域的形状。编辑完成后,我们可以将最终得到的区域数据保存到数据库或者进行其他处理。 总之,amap-vue 的区域绘制功能提供了一种简单方便的方式来在地图上进行区域绘制和编辑操作。它可以应用于很多实际场景,比如地图标注、区域规划、路径规划等。在开发过程中,我们可以根据具体需求来定制化地图样式和功能,以满足不同的业务需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值