VUE调用高德地图之电子围栏

文章详细描述了使用AMapAPI在地图上实现电子围栏功能,包括地图操作、多边形绘制和数据保存的方法。

最近项目上电子围栏功能,就是地图上限定的区域内实现限行功能,用我们身边的事物来举例,共享单车的限行、限停区域就是电子围栏。由此可见,电子围栏最基础的做法就是在地图上实现多边形覆盖物。

效果图大概如下:

在这里插入图片描述照例,第一步:加载JS AP。

1.在public/index.html中加入:

<script src="https://webapi.amap.com/maps?v=1.4.15&key=您申请的key值&callback=init"></script>

2.放置地图极控制功能
在这里插入图片描述
3.初始化地图
在这里插入图片描述

4.绘制多边形

在这里插入图片描述
如果需要一次绘制多个矢量图,可以删除 __this.mouseTool.close()这一行,并在 “结束并保存” 按钮功能里实现。

其余函数功能的实现,参见完整代码:

<template>
  <div>
    <div id="container"></div>
    <div class="input-card">
      <h4>电子围栏绘制</h4>
      <div class="input-item">
        <input type="button" class="btn" value="开始绘制" id="start" @click="startDrawPolygon()" />
        <input type="button" class="btn" value="清空" id="pause" @click="clearPolygon()" />
      </div>
      <div class="input-item">
        <input type="button" class="btn" value="结束并保存" id="resume" @click="stopAndSave()" />
        <input type="button" class="btn" value="重新绘制" id="stop" @click="redrawPolygon()" />
      </div>
    </div>
  </div>
</template>

<script>
export default {
  mounted() {
    this.$nextTick(() => {
      this.initMap();
    });
  },
  data() {
    return {
      map: null,
      mouseTool: null,
      polyType: {
        strokeColor: "#FF33FF",
        strokeOpacity: 1,
        strokeWeight: 4,
        strokeOpacity: 0.2,
        fillColor: "#1791fc",
        fillOpacity: 0.4,
        // 线样式还支持 'dashed'
        strokeStyle: "solid"
        // strokeStyle是dashed时有效
        // strokeDasharray: [30,10],
      },
      polygonList: [],
      savedPolygon: []
    };
  },
  methods: {
    initMap() {
      this.map = new AMap.Map("container", {
        resizeEnable: true,
        center: [114.459779, 38.087936],
        zoom: 16
      });
    },
    startDrawPolygon() {
      this.clearPolygon();
      let __this = this;
      this.map.plugin("AMap.MouseTool", function() {
        __this.mouseTool = new AMap.MouseTool(__this.map);
      });
      this.mouseTool.polygon(this.polyType);
      //监听draw事件可获取画好的覆盖物
      this.polygonList = [];
      this.mouseTool.on("draw", function(e) {
        __this.polygonList.push(e.obj);
        console.log("绘制的多边形", __this.polygonList);
        __this.mouseTool.close();
      });
    },
    stopAndSave() {
      // this.mouseTool.close();
      let savedPolygon = [];
      for (let i = 0; i < this.polygonList.length; i++) {
        console.log(this.polygonList[i].getOptions());
        let op = this.polygonList[i].getOptions();
        let routePath = [];
        op.path.forEach(item => {
          routePath.push([item.lng, item.lat]);
        });
        let savearr = {
          path: routePath,
          strokeColor: op.strokeColor,
          strokeOpacity: op.strokeOpacity,
          fillOpacity: op.fillOpacity,
          fillColor: op.fillColor,
          zIndex: op.zIndex
        };
        this.savedPolygon.push(savearr);
      }
      let save = JSON.stringify(this.savedPolygon);
      console.log("savedPolygon", save);
      // 模拟数据库存取
      sessionStorage.setItem("savedPolygon", save);
    },
    clearPolygon() {
      // this.map.remove(this.polygonList);
      this.polygonList = [];
      this.map.clearMap(); // 清除地图上的所有覆盖物
    },
    // 用保存的数据重新绘制多边形并添加事件
    redrawPolygon() {
      let __this = this;
      // 用浏览器模拟数据库存取
      let savedPolygon = JSON.parse(sessionStorage.getItem("savedPolygon"));
      console.log("重绘多边形数据", savedPolygon);
      if (savedPolygon == null) return;
      for (let i = 0; i < savedPolygon.length; i++) {
        var polygon = new AMap.Polygon(savedPolygon[i]);
        this.map.add(polygon);
      }
    }
  }
};
</script>

<style lang="less" scoped>
@import url("https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css");
#container {
  width: 100%;
  height: 500px;
}

.input-card .btn {
  margin-right: 1.2rem;
  width: 9rem;
}

.input-card .btn:last-child {
  margin-right: 0;
}
</style>

完整代码可以直接复制使用,注意!!!!需要将高德地图key换成自己申请的key!!
最后,启动项目直接运行 ok了

<think>首先,用户在问如何在Vue2项目中集成高德地图并实现电子围栏功能。用户引用了两个站内引用,但系统提示说这些引用仅供参考,不是用户真正的需求。我需要基于用户的问题来回答。 用户的问题是:我想在Vue2项目中集成高德地图并实现电子围栏功能。请问vue2 高德地图 实现电子围栏。 所以,关键点是: - Vue2项目 - 集成高德地图 - 实现电子围栏功能(电子围栏通常指在地图上绘制多边形区域,并可能检测点是否在区域内) 从系统级指令: - 所有行内数学表达式用$...$,但这里可能没有数学内容,除非涉及公式。 - 独立公式用$$...$$,但可能不需要。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾添加引用标识,如[^1]。 - 回答结构清晰,逐步解决问题。 - 保证回答真实可靠。 参考站内引用: - 引用[1]: 关于VUE调用高德地图电子围栏,实现多边形覆盖物。 - 引用[2]: 关于在vue中使用高德地图电子围栏的代码片段。 我需要尽可能参考这些引用,但系统说“请尽可能多的参考用户上一次的问题和你的回答”,但在这个对话中,这是第一次交互,所以没有上一次的问题。因此,我直接基于用户的问题。 步骤: 1. **集成高德地图Vue2项目**:首先需要安装高德地图JavaScript API,并在Vue组件中初始化地图。 2. **实现电子围栏**:电子围栏通常涉及绘制多边形覆盖物,并可能添加事件监听器来处理交互。 从引用中: - 引用[1]提到“电子围栏最基础的做法就是在地图上实现多边形覆盖物”。 - 引用[2]提供了一段代码:`let end = i === POIArr.length-1 ? [POIArr[0].location.lng, POIArr[0].location.lat] : [POIArr[i+1].location.lng, POIArr[i+1].location.lat]`,这看起来是在处理多边形点的连接,用于绘制围栏。 所以,在回答中,我可以引用这些。 回答结构: - 介绍电子围栏的概念。 - 步骤1:在Vue2项目中集成高德地图。 - 步骤2:实现电子围栏(绘制多边形)。 - 步骤3:可选,添加功能如检测点是否在围栏内。 - 代码示例。 - 生成相关问题。 使用中文回答。 添加引用标识:在引用的段落末尾添加[^1]或[^2],但系统说“自然地添加”,所以我需要在提到引用内容时添加。 生成相关问题:在最后添加“§§相关问题§§”部分。 系统指令示例中有“快速排序”的示例,但我需要针对用户问题。 最终输出: - 回答部分。 - 相关问题部分。</think>### Vue2项目集成高德地图实现电子围栏功能 在Vue2项目中集成高德地图并实现电子围栏功能,是一种常见的需求,用于在地图上限定区域(如限行或限停区)。电子围栏的核心是绘制多边形覆盖物,并可能结合事件监听来实现区域检测[^1]。下面,我将基于高德地图JavaScript API,一步步指导您完成集成和实现过程。整个过程分为三个主要步骤:**集成高德地图SDK**、**绘制电子围栏(多边形)**和**添加基础交互功能**。代码示例基于Vue2语法,确保真实可靠。 #### 步骤1: 集成高德地图SDK到Vue2项目 首先,您需要在Vue2项目中安装和配置高德地图JavaScript API。高德地图提供了Vue-friendly的SDK,支持异步加载。 1. **安装依赖**:在项目根目录下,通过npm安装高德地图的Web SDK。 ```bash npm install @amap/amap-jsapi-loader --save ``` 2. **获取API Key**:访问[高德开放平台](https://lbs.amap.com/),注册账号并创建应用,获取Web端的API Key(替换下面代码中的`YOUR_API_KEY`)。 3. **在Vue组件中初始化地图**:创建一个Vue组件(如`AMap.vue`),使用`amap-jsapi-loader`异步加载地图。 ```vue <template> <div id="map-container" style="width: 100%; height: 500px;"></div> </template> <script> import AMapLoader from '@amap/amap-jsapi-loader'; export default { name: 'AMap', data() { return { map: null, polygon: null // 用于存储电子围栏多边形实例 }; }, mounted() { this.initMap(); }, methods: { async initMap() { try { const AMap = await AMapLoader.load({ key: 'YOUR_API_KEY', // 替换为您的API Key version: '2.0', // 指定API版本 plugins: ['AMap.Polygon'] // 加载多边形插件 }); this.map = new AMap.Map('map-container', { zoom: 13, // 初始缩放级别 center: [116.397428, 39.90923] // 初始中心点(北京) }); console.log('地图初始化成功'); } catch (error) { console.error('地图加载失败:', error); } } } }; </script> ``` 这段代码在组件挂载时加载地图,并指定了多边形插件(`AMap.Polygon`),为后续绘制电子围栏做准备[^1]。 #### 步骤2: 实现电子围栏(绘制多边形) 电子围栏的本质是绘制一个闭合的多边形区域。高德地图的`AMap.Polygon`类用于创建多边形覆盖物。您需要定义多边形的顶点数组(路径),并添加到地图上。 1. **定义多边形路径**:顶点数组应包含经纬度点,形成一个闭合图形。例如,定义一个矩形区域。 ```javascript // 在methods中添加绘制电子围栏的方法 methods: { async initMap() { // ...初始化地图代码(同上) }, drawElectronicFence() { if (!this.map) return; // 定义多边形的顶点数组(路径),每个点是一个[lng, lat]数组 const path = [ [116.368904, 39.913423], [116.382122, 39.901176], [116.387271, 39.922501], [116.368904, 39.913423] // 闭合点,与起点相同 ]; // 创建多边形实例 this.polygon = new AMap.Polygon({ path: path, strokeColor: "#FF33FF", // 边框颜色 strokeOpacity: 1, // 边框透明度 strokeWeight: 3, // 边框宽度 fillColor: "#1791fc", // 填充颜色 fillOpacity: 0.35 // 填充透明度 }); // 将多边形添加到地图 this.map.add(this.polygon); console.log('电子围栏绘制成功'); } } ``` 在`mounted`钩子中调用`this.drawElectronicFence()`,确保地图加载后立即绘制。顶点数组的闭合处理是关键:最后一个点应与第一个点相同,以形成闭合图形。引用[2]中的代码片段展示了如何动态处理点数组的连接(例如,在循环中判断是否为最后一个点)[^2]。 2. **动态生成围栏**:如果需要从用户输入生成围栏,可以绑定事件监听器。例如,点击地图添加点: ```javascript methods: { // ...其他方法 setupClickEvent() { this.map.on('click', (e) => { const point = [e.lnglat.getLng(), e.lnglat.getLat()]; // 添加到路径数组,并重绘多边形 this.path.push(point); this.redrawPolygon(); }); }, redrawPolygon() { if (this.polygon) this.map.remove(this.polygon); // 移除旧多边形 this.polygon = new AMap.Polygon({ path: this.path, // ...其他样式 }); this.map.add(this.polygon); } } ``` 在`data`中添加`path: []`数组存储点,并在`mounted`中调用`this.setupClickEvent()`启用点击事件。 #### 步骤3: 添加基础交互功能(可选) 电子围栏常需检测点是否在区域内。高德地图提供了`AMap.GeometryUtil`工具类,用于计算点与多边形的关系。 1. **检测点是否在围栏内**:在组件中添加一个方法。 ```javascript methods: { // ...其他方法 checkPointInFence(point) { if (!this.polygon) return false; const lnglat = new AMap.LngLat(point[0], point[1]); return AMap.GeometryUtil.isPointInPolygon(lnglat, this.polygon.getPath()); } } ``` 例如,调用`this.checkPointInFence([116.375, 39.91])`返回布尔值。 2. **完整示例组件**:整合以上代码。 ```vue <template> <div> <div id="map-container" style="width: 100%; height: 500px;"></div> <button @click="drawElectronicFence">绘制围栏</button> </div> </template> <script> import AMapLoader from '@amap/amap-jsapi-loader'; export default { data() { return { map: null, polygon: null, path: [] // 存储用户点击的点 }; }, mounted() { this.initMap(); }, methods: { async initMap() { // ...初始化地图代码 this.setupClickEvent(); }, drawElectronicFence() { // ...绘制多边形代码 }, setupClickEvent() { // ...点击事件代码 }, checkPointInFence(point) { // ...检测点代码 } } }; </script> ``` #### 注意事项 - **性能优化**:电子围栏的点数不宜过多(建议少于100个点),否则可能影响地图渲染性能。高德地图API支持大数据量优化,如使用`setPath()`动态更新路径[^1]。 - **错误处理**:添加try-catch块捕获API加载错误。 - **安全**:API Key不要暴露在客户端代码中,生产环境应通过后端代理加载(使用Vue的env变量)。 - **参考文档**:高德官方文档提供了详细指南,包括事件监听和高级功能:[高德地图API文档](https://lbs.amap.com/api/javascript-api/guide/abc/quickstart)。 通过以上步骤,您可以在Vue2项目中轻松实现电子围栏功能。电子围栏的基础是绘制多边形覆盖物,引用[1]强调了这一点,而引用[2]的代码片段展示了点数组的闭合处理逻辑[^1][^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值