vue引用高德地图电子围栏功能

2023-12-19 01:40

本文主要是介绍vue引用高德地图电子围栏功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

<template>

  <div class="main">

    <section class="section">

      <div class="ebox">

        <ButtonGroup>

          <Tooltip content="左键绘制围栏,右键绘制结束退出">

            <Button

              type="info"

              icon="ios-locate-outline"

              :disabled="addFlag"

              @click="drawRectangle"

            >

              绘制围栏</Button

            ></Tooltip

          >

          <!-- <Button

            type="primary"

            icon="ios-create-outline"

            @click="editRectangle"

            >编辑围栏</Button

          > -->

          <!-- <Button type="warning" icon="md-close" @click="cancelRectangle"

            >结束编辑</Button

          > -->

          <Button

            type="success"

            icon="md-checkmark-circle"

            @click="saveRectangle"

            >保存围栏</Button

          >

          <Tooltip content="清空未保存围栏">

            <Button type="error" icon="ios-trash-outline" @click="deleRectangle"

              >重新绘制</Button

            ></Tooltip

          >

        </ButtonGroup>

      </div>

      <!-- 地图 -->

      <div id="container" style="width: 100%; height: 100%" />

      <!-- 控制按钮组 -->

    </section>

  </div>

</template> 

<script>

import {

  addFence,

  getFence,

  setFence,

  delFence,

} from "@/api/totalEquipment/totalEquipmentRequest.js";

export default {

  props: { iotId: String, tabName: String },

  data() {

    return {

      companyId: window.sessionStorage.getItem("companyId"),

      // 地图对象

      map: null,

      // 右键菜单对象

      contextMenu: null,

      centerArr: [113.756232, 23.055855], //地图中心位置,不能为空数组【为空数组会报错】

      path: [], //以前绘制的数据

      paths: [], // 当前绘制的多边形经纬度数组

      polygonItem: [], // 地图上绘制的所有多边形对象

      polyEditors: [], // 新增数据=>所有编辑对象数组

      addFlag: false,

      editFlag: false,

      // 编辑参数对象

      editParams: [],

      // 围栏删除ID

      deleteID: "",

    };

  },

  watch: {},

  created() {},

  mounted() {

    setTimeout(() => {

      //异步加载(否则报错initMap is not defined)

      this.initMap();

      // 初始化数据

      this.init();

    }, 100);

  },

  methods: {

    // 地图初始化

    initMap() {

      this.map = new AMap.Map("container", {

        resizeEnable: true, // 窗口大小调整

        center: this.centerArr, // 中心

        zoom: 15, //放大级别

        showLabel: true, // 是否显示地图文字标记

        willReadFrequency: true,

      });

      // 创建右键菜单

      this.contextMenu = new AMap.ContextMenu();

      const that = this;

      this.contextMenu.addItem(

        "编辑",

        function () {

          that.editParams.map((item) => {

            that.editRectangle(item);

          });

        },

        0

      );

      this.contextMenu.addItem(

        "删除",

        function () {

          if (that.editParams != "" && that.editParams.length > 1) {

            that.$Modal.confirm({

              title: "删除确认",

              content: "<p>还有正在编辑的电子围栏尚未保存,请问是否保存?</p>",

              okText: "继续删除",

              cancelText: "保存",

              onOk: () => {

                this.delFence();

              },

              onCancel: () => {

                that.saveRectangle(that.deleteID);

              },

            });

          } else {

            this.delFence();

          }

        },

        1

      );

      // 添加工具栏

      this.map.plugin(["AMap.ToolBar", "AMap.Scale", "AMap.Geocoder"], () => {

        const toolbar = new AMap.ToolBar(); // 工具条

        const scale = new AMap.Scale(); // 比例尺

        this.map.addControl(toolbar);

        this.map.addControl(scale);

        new AMap.Geocoder({

          radius: 1000,

        });

      });

    },

    // 绘制多边形

    drawRectangle() {

      this.addFlag = true;

      const This = this;

      let mouseTool = new AMap.MouseTool(This.map);

      mouseTool.polygon({

        //polygon:绘制多边形【线段:polyline;矩形:rectangle;圆:circle】

        strokeColor: "red",

        strokeOpacity: 0.4,

        strokeWeight: 6,

        fillColor: "#1791fc",

        fillOpacity: 0.2,

        // strokeStyle还支持 solid

        strokeStyle: "solid",

        // strokeDasharray: [30,10],

      });

      mouseTool.on("draw", function (event) {

        // console.log(event);

        // event.obj 为绘制出来的覆盖物对象

        let polygonItem = event.obj;

        let paths = polygonItem.getPath(); //取得绘制的多边形的每一个点坐标

        // console.log('覆盖物对象绘制完成各个点的坐标', paths, event);

        let path = []; // 编辑的路径

        paths.forEach((v) => {

          path.push([v.lng, v.lat]);

        });

        This.paths.push(path); //将新增数据放入paths数组里

        // This.editRectangle();//绘制完成,默认进入编辑状态

        // mouseTool.close();

        // This.mapNaNpxove(event.obj); // 删除多边形

      });

    },

    // 编辑围栏

    editRectangle(obj) {

      const path = obj.deviceFence;

      //新增的进入编辑状态

      let polygon = new AMap.Polygon({

        path: path,

        strokeColor: "#FF33FF",

        strokeWeight: 6,

        strokeOpacity: 0.2,

        fillOpacity: 0.2,

        fillColor: "#1791fc",

        zIndex: 50,

      });

      this.map.add(polygon);

      this.polygonItem.push(polygon);

      // 缩放地图到合适的视野级别

      this.map.setFitView([polygon]);

      const that = this;

      this.polyEditor = new AMap.PolyEditor(this.map, polygon);

      this.polyEditor.open();

      this.polyEditors.push(this.polyEditor);

      this.polyEditor.on("end", function (event) {

        // console.info("触发事件: end", event);

        // console.info("end修改后的经纬度:", polygon.getPath());

        const paths = []; //编辑的路径

        let path = polygon.getPath();

        path.forEach((v) => {

          paths.push([v.lng, v.lat]);

        });

        that.editParams.map((item) => {

          if (item.id == obj.id) {

            item.deviceFence = paths;

          }

        });

      });

    },

    // 删除围栏

    delFence() {

      delFence(this.deleteID).then((res) => {

        // console.log(res);

        this.$Message.success(res.msg);

        this.deleteID = "";

        that.editParams = [];

        this.init();

      });

    },

    // 结束编辑状态

    cancelRectangle() {

      this.polyEditors.forEach((item) => {

        item.close();

      });

    },

    //保存围栏

    saveRectangle(val) {

      // 结束编辑状态

      this.polyEditors.forEach((item) => {

        item.close();

      });

      // console.log(this.path);

      // console.log(this.paths);

      if (this.editParams != "") {

        if (val && val == this.deleteID) {

          let i = this.editParams.findIndex((item) => item.id == val);

          this.editParams.splice(i, 1);

          // console.log(this.editParams);

        }

        setFence(this.editParams).then((res) => {

          // console.log(res);

          this.$Message.success(res.msg);

          this.editParams = [];

          if (this.paths == "") {

            this.init();

          }

        });

      }

      if (this.paths != "") {

        var num = this.path.length + this.paths.length;

        if (num > 3) {

          return this.$Message.info("请勿保存超过3个电子围栏!");

        }

        var params = {

          companyId: this.companyId,

          iotId: this.iotId,

        };

        addFence(params, this.paths).then((res) => {

          // console.log(res);

          this.paths = [];

          this.polygonItem = [];

          this.init();

          this.$Message.success(res.msg);

        });

      }

    },

    // 重新绘制

    deleRectangle() {

      // 结束编辑状态

      this.polyEditors.forEach((item) => {

        item.close();

      });

      this.init();

    },

    //获取后台数据

    init() {

      const that = this;

      let params = {

        iotId: this.iotId,

        companyId: this.companyId,

      };

      that.path = [];

      getFence(params).then((res) => {

        that.map.clearMap();

        this.marker = new AMap.Marker({

          position: this.centerArr,

          offset: new AMap.Pixel(-13, -30),

          icon: new AMap.Icon({

            image:

              "http://a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png",

            size: new AMap.Size(28, 35), //图标大小

            imageSize: new AMap.Size(28, 35),

          }),

        });

        this.marker.setMap(this.map);

        // console.log(res);

        res.map((item) => {

          var polygon = new AMap.Polygon({

            path: item.deviceFence,         

            strokeColor: "#FF33FF",

            strokeWeight: 6,

            strokeOpacity: 0.2,

            fillOpacity: 0.4,

            fillColor: "#1791fc",

            zIndex: 50,

          });

          that.path.push(item.deviceFence);

          that.map.add(polygon);

          //创建右键菜单

          polygon.on("rightclick", function (e) {

            // 设置右键菜单位置

            that.contextMenu.open(that.map, e.lnglat);

            that.editParams.push(item);

            that.deleteID = item.id;

          });

          that.map.setFitView();

        });

      });

    },

  },

};

</script>

问题点:

1.当处理删除时,接口调用全删了,但是界面只清除掉一个围栏图层,init重新调用获取数据接口,也清不掉

2.要按照每个围栏去记录编辑和删除的结果,必定调用接口,但是绘制渲染围栏时,返回结果只有经纬度,并无法携带标识ID

解决:

1.在init()获取数据,渲染地图图层的时候 调用map.clearMap()方法清掉所有图层

2.进入编辑模式时,单击围栏编辑,单个围栏数据对应收集操作,避免所有围栏同时进入编辑模式

原因:1.每次初始化数据时,都会再在地图上渲染一遍图层,而且每删除或编辑新增一个电子围栏的时候,都会初始化一个图层,所以一个电子围栏可能覆盖了很多图层,但是删除围栏的时候只是删掉了一个最新的图层,然后初始化之后就又会覆盖一层,所以初始化渲染围栏时要先把旧的图层清掉

2.当电子围栏进入编辑模式时,只携带了path经纬度,

 所以返回的时候自然不会有Id,所以只能设置右键菜单,单个围栏进入编辑状态,以便调用接口处理编辑逻辑

这篇关于vue引用高德地图电子围栏功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/510485

相关文章

Java CompletableFuture如何实现超时功能

《JavaCompletableFuture如何实现超时功能》:本文主要介绍实现超时功能的基本思路以及CompletableFuture(之后简称CF)是如何通过代码实现超时功能的,需要的... 目录基本思路CompletableFuture 的实现1. 基本实现流程2. 静态条件分析3. 内存泄露 bug

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

详解如何在React中执行条件渲染

《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代

详解Vue如何使用xlsx库导出Excel文件

《详解Vue如何使用xlsx库导出Excel文件》第三方库xlsx提供了强大的功能来处理Excel文件,它可以简化导出Excel文件这个过程,本文将为大家详细介绍一下它的具体使用,需要的小伙伴可以了解... 目录1. 安装依赖2. 创建vue组件3. 解释代码在Vue.js项目中导出Excel文件,使用第三

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将