首页 > 其他分享 >vue2使用 AMap-Vue 高德地图(矩形、圆形、多边形)绘制电子围栏

vue2使用 AMap-Vue 高德地图(矩形、圆形、多边形)绘制电子围栏

时间:2023-09-08 11:22:42浏览次数:45  
标签:Vue 鼠标 vm mouseTool objEditor AMap vue2 pathArr

 AMap-Vue 参考 安装使用 | AMap-Vue (gitee.io)

main.js引入

import AmapVue from '@amap/amap-vue';
Vue.use(AmapVue);
AmapVue.config.key ='您申请的key值';
AmapVue.config.version = '2.0'; // 默认2.0,这里可以不修改
AmapVue.config.plugins = [
  "AMap.Scale", //右下角缩略图插件 比例尺
  "AMap.PolyEditor", //编辑 折线多,边形
  "AMap.CircleEditor", //圆形编辑器插件,
  "AMap.RectangleEditor",//矩形 ,
  "AMap.MouseTool",//鼠标工具
// 在此配置你需要预加载的插件,如果不配置,在使用到的时候会自动异步加载
];

   electricFence.vue

<template>
  <div>
      <amap :zoom="zoom" :center="position" ref="grawAmap" style="z-index:99;width:100%;height:600px;">
          <div v-if="drawer.path">
              <amap-rectangle v-if="drawer.mode == 1" :bounds.sync="drawer.path" fill-color="#409EFF" stroke-color="#000A58" :fill-opacity="0.3" />
              <amap-circle v-if="drawer.mode == 2" :center.sync="drawer.path.center" :radius.sync="drawer.path.radius" fill-color="#409EFF" stroke-color="#000A58" :fill-opacity="0.5" />
              <amap-polygon v-if="drawer.mode == 3" :path.sync="drawer.path" fill-color="#409EFF" stroke-color="#000A58" :fill-opacity="0.5" />
          </div>
      </amap>
      <Button @click="drawerChange(1)">矩形</Button>
      <Button @click="drawerChange(2)">圆形</Button>
      <Button @click="drawerChange(3)">多边形</Button>
      <Button style="margin-left:10px;" icon="md-close" @click="eliminateChange()" type="warning">清除围栏</Button>
     <Alert show-icon style="margin-top:10px;">Tip:自定义围栏需要单击绘制,双击当前原点完成绘制;其他围栏则按住鼠标左键拖动绘制。</Alert>
  </div>
</template>
<script>
  export default {
    components: {},
    data() {
      return {
          zoom: 12,//地图级别
          position: [116.378517,39.865246],//地图中心点
          drawer: {
            mode: 0,
            path: null,
          },
          mouseTool:null,
          objEditor:null,
          pathData:[]
      };
    },
    methods: {
      drawerChange(type){
        let vm=this
        vm.drawer.path=null
        vm.drawer.mode=type
        vm.mouseTool ? vm.mouseTool.close(true) : '' //鼠标工具 取消
   
        let map=vm.$refs.grawAmap.$map //获取地图对象

        //创建鼠标工具
        AMap.plugin(["AMap.MouseTool"],function () {
          let mouseTool = new AMap.MouseTool(map) 
          vm.mouseTool=mouseTool
          switch (type) {
              case 1:
                mouseTool.rectangle()//鼠标工具 画矩形
                break
              case 2:
                mouseTool.circle()//鼠标工具 画圆
                break
              case 3:
                mouseTool.polygon()//鼠标工具 画多边形
                break
          }
          // 鼠标工具绘制覆盖物结束触发此事件。
          mouseTool.on('draw', function(e) {
              mouseTool.close(false) //鼠标工具 关闭
              var path = e.obj.getPath()
              let pathArr=[],newDada=[]
              path.forEach(e => {
                pathArr.push([e.getLng(), e.getLat()])
              })
              vm.pathData=pathArr
              console.log("圈选:", pathArr);

              //  处理编辑  开始
              switch (type) {
                case 1:
                  vm.objEditor = new AMap.RectangleEditor(map, e.obj)//矩形编辑
                  break
                case 2:
                  vm.objEditor = new AMap.CircleEditor(map, e.obj)//圆形编辑
                  break
                case 3:
                  vm.objEditor = new AMap.PolyEditor(map, e.obj)//多边形编辑
                  break
              }
              // 打开编辑功能。调整图形形状
              vm.objEditor.open()
              //鼠标调整横向和纵向半径时触发该事件
              vm.objEditor.on('adjust', function(event) {
                  pathArr=[]
                  newDada = event.target.getPath()
                  newDada.forEach(el => { pathArr.push([el.lng,el.lat]) })
                  vm.pathData=pathArr
                  console.log("鼠标调整横向和纵向半径:", pathArr);
              })
              //鼠标调整图形位置时触发该事件
              vm.objEditor.on('move', function(event) {
                  newDada=[]
                  pathArr = event.target.getPath()
                  pathArr.forEach(el => { newDada.push([el.lng,el.lat]) })
                  vm.pathData=newDada
                  console.log("鼠标移动圈选区域:", pathArr);
              })
              //  处理编辑  结束
          })
        })
      },
      eliminateChange(){
        this.mouseTool ? this.mouseTool.close(true) : '' //鼠标工具 取消
        this.objEditor ? this.objEditor.close() : '' //绘制 取消编辑 关闭编辑功能
        this.drawer.mode = 0
        this.drawer.path=null
      }
    }
  };
</script>
<style scoped></style>

 实现效果

 

标签:Vue,鼠标,vm,mouseTool,objEditor,AMap,vue2,pathArr
From: https://www.cnblogs.com/yj-ang3141/p/17687108.html

相关文章

  • vue组件级别的权限控制
    核心思想:尽量减少对组件的侵入性,也就是权限控制的代码剔除出来实现authority.vue<template><div>//将用户权限通过作用域插槽传递出去<slotv-if="showSlot":permissions="rights"></slot></div></template><scriptsetuplang="ts&......
  • VueJS 处理表单组件上 api 调用的错误
    问题出在可组合项中对errors的处理上。在register函数中,你将errors重新赋值为空对象{},而应该将其赋值给errors.value来保持响应式。修改useAuth可组合项的代码如下:exportdefaultfunctionuseAuth(){leterrors=ref({});constregister=(request)=>{errors.val......
  • Vue中数组操作方法有哪些?
    在Vue中,有一些数组操作方法是专门为了处理响应式数组而提供的。这些方法会触发Vue的响应式更新机制,确保视图能够正确地响应数组的变化。以下是Vue提供的数组操作方法:1:push():向数组末尾添加一个或多个元素,并返回新的长度。this.array.push('newitem');2:pop():移除数组的最后一......
  • Vue的数组操作方法和JavaScript原生数组方法有什么区别?
    Vue的数组操作方法和JavaScript原生数组方法之间存在一些区别,主要体现在对响应式更新的处理上。#####1:响应式更新:Vue数组操作方法是对JavaScript原生数组方法的封装,能够触发Vue的响应式更新机制。这意味着当你使用Vue的数组操作方法修改数组时,Vue会自动检测到数组的变化......
  • 在 Vue 中,子组件如何向父组件传递数据?
    在Vue中,子组件向父组件传递数据可以通过自定义事件来实现。下面是一种常见的方法:在子组件中,使用$emit方法触发一个自定义事件,并传递要传递给父组件的数据作为参数。<template><button@click="sendDataToParent">传递数据给父组件</button></template><script>exportde......
  • 深度理解vue3中选项式语句和组合式语句的区别
    选项式语句和组合式语句是Vue3中的两种不同的编程风格,它们都是用于编写Vue组件的方法。在本文中,我将详细介绍选项式语句和组合式语句的概念、区别和使用场景。选项式语句是Vue3中最常用的编写组件的方式之一。它使用了Vue的选项对象,其中包含了组件的各种选项,如数据、计算......
  • vue-router 路由模式有几种?
    VueRouter提供了三种路由模式:######1:Hash模式(默认):在URL中使用带有#符号的哈希值来管理路由。例如:http://xxxx.com/#/path。在Hash模式下,当URL的哈希值发生变化时,浏览器不会向服务器发送请求,而是通过监听hashchange事件来进行路由导航。######2:History模式:使用HTM......
  • Vue简单浮动标签(simple floating labels)
    简介及使用教程Vue简单浮动标签(simplefloatinglabels)是一个基于Vue.js的简单浮动表单标签组件,支持自定义颜色、边框及错误信息。安装npmivue-simple-floating-labels使用引入组件importFloatingLabelfrom'vue-simple-floating-labels'exportdefault{......
  • Vue 拖拽组件(Draggable)
    简介及使用教程Vue拖拽组件(Draggable)是一个允许与View-Model同步进行拖放排序的Vue组件。这是基于Sortable.js并提供它的所有功能。特点完全支持Sortable.js特性:支持触摸设备支持拖动句柄和可选择的文本智能自动滚动支持在不同列表之间拖放,没有jQuery依赖项保持......
  • 滚动到底部的Vue指令插件
    简介及使用教程VueChatScroll是一个保持可滚动内容滚动到底部的Vue指令插件,用于Vue.js2,当在该元素中添加新内容时,滚动到该元素的底部。安装npmivue-chat-scroll使用importVuefrom'vue'importVueChatScrollfrom'vue-chat-scroll'Vue.use(VueChatScroll)......