当前位置: 首页 > java >正文

Vue3 + 高德地图实现车辆电子围栏监控与报警

在车辆管理系统中,电子围栏(GeoFence) 是一个非常常见的功能:

  • 当车辆进入或离开指定区域时触发告警。

  • 应用场景包括车队管理、共享出行、物流监控等。

本文将基于 Vue3 + 高德地图 (AMap),实现一个支持 圆形、矩形、多边形围栏 的车辆进出检测,并触发报警。


📌 功能需求

  1. 支持 多种围栏类型:圆形、矩形、多边形。

  2. 判断车辆是否进入/离开围栏。

  3. 记录车辆上一次状态,避免重复报警。

  4. 支持 进入报警 / 离开报警 / 双向报警 三种模式。


🛠 实现思路

  1. store 获取全局的 AMap 实例。

  2. 遍历车辆绑定的围栏,判断当前车辆位置是否在围栏内。

  3. 结合 上一次缓存的状态,判断是否发生“进入”或“离开”事件。

  4. 调用 triggerAlarm 方法,执行告警逻辑(比如消息提醒、声音提示、后台记录)。


💻 核心代码实现

import { useGlobalStore } from '../stores/globalInfo'
import { triggerAlarm } from './notify'// 缓存车辆上一次是否在围栏内
const vehicleFenceState = new Map<string, boolean>()export function checkVehicleFence(vehicle: any,fences: any[],store: ReturnType<typeof useGlobalStore>
) {const AMap = store.AMapif (!AMap) return  // AMap 还没准备好if (!vehicle.latitude || !vehicle.longitude) returnconst point = [vehicle.longitude, vehicle.latitude]// 只筛选绑定了当前车辆的围栏const relatedFences = fences.filter(fence =>fence.monitorVehicles?.includes(vehicle.cdtId))relatedFences.forEach(fence => {if (!fence.enabled) return;//该围栏是否处于暂停状态let inside = false// 判断车辆是否在围栏内if (fence.fenceType === 'circle' && fence.center && fence.fenceRadius) {const distance = AMap.GeometryUtil.distance(point, fence.center)inside = distance <= fence.fenceRadius} else if (fence.fenceType === 'polygon' && fence.coordinates) {// 多边形围栏inside = AMap.GeometryUtil.isPointInRing(point, fence.coordinates)} else if (fence.fenceType === 'rectangle' && fence.coordinates?.length === 2) {// 矩形围栏:coordinates = [左上角坐标, 右下角坐标]const [sw, ne] = fence.coordinatesconst bounds = new AMap.Bounds(sw, ne)inside = bounds.contains(point)}// 取上一次缓存的状态const lastInside = vehicleFenceState.get(`${vehicle.cdtId}-${fence.fenceId}`) ?? false// 进入围栏触发if (!lastInside && inside && (fence.alarmMode === 'enter' || fence.alarmMode === 'both')) {triggerAlarm(vehicle, fence, 'enter', store)}// 离开围栏触发if (lastInside && !inside && (fence.alarmMode === 'leave' || fence.alarmMode === 'both')) {triggerAlarm(vehicle, fence, 'leave', store)}// 更新缓存vehicleFenceState.set(`${vehicle.cdtId}-${fence.fenceId}`, inside)})
}

📚 关键点解析

  1. 缓存机制

    • 使用 Map 记录车辆在某个围栏中的上一次状态,避免重复触发告警。

  2. 多种围栏类型支持

    • 圆形:通过 AMap.GeometryUtil.distance 判断距离是否小于半径。

    • 多边形:通过 AMap.GeometryUtil.isPointInRing 判断是否在多边形范围内。

    • 矩形:利用 AMap.Bounds.contains 判断坐标是否在矩形范围。

  3. 报警模式

    • enter → 仅进入触发

    • leave → 仅离开触发

    • both → 进出均触发

  4. 灵活扩展

    • triggerAlarm 可根据业务需求扩展,比如发送 WebSocket 消息、推送通知、写入数据库。


🎨 效果展示

  • 当车辆进入某个围栏时,立即触发 进入报警

  • 当车辆离开围栏时,立即触发 离开报警

  • 围栏被禁用(enabled = false)时不会触发任何报警。


✅ 总结

通过本文的实现,我们完成了一个通用的 车辆电子围栏监控 功能:

  • 支持多种围栏类型。

  • 支持进入/离开/双向报警。

  • 使用缓存机制避免重复告警。

  • 可与 Vue3 + 高德地图 无缝集成。

在实际项目中,可以结合 WebSocket 实时定位,实现车辆的 实时监控 + 围栏告警系统 🚀。

http://www.xdnf.cn/news/18964.html

相关文章:

  • banner这个文件是怎么请求到后端数据的
  • codeforces(1045)(div2)D. Sliding Tree
  • zookeeper-集群扩缩容
  • 二次校验请求源 IP 是否在 WAF 官方 IP 段内” + “校验是否携带 WAF 专属 HTTP 头
  • 全域管控,一触可达:复合机器人远程监控方案重塑智能制造
  • volitale伪共享问题及解决方案
  • 高效管理远程连接!Remote Desktop Manager 全方位使用指南
  • 对接连连支付(四)-- 收款查询
  • 数据结构:单链表的应用(力扣算法题)第一章
  • 迅睿CMS自定义网站表单:HTML方式调用Select下拉选项数据指南
  • Winsock 操作指南
  • 宝塔面板零基础搭建 WordPress 个人博客与外贸网站 | 新手10分钟上手指南
  • vscode 调试 指定 python文件 运行路径
  • 嵌入式Linux自学不走弯路!670+讲课程!系统学习路线:入门+应用+ARM+驱动+移植+项目 (STM32MP157开发板)
  • Libvio访问异常排查指南
  • 《从有限元到深度学习:我的金属疲劳研究进阶之路》
  • Paimon——官网阅读:主键表
  • 【Kafka】项目整合使用案例
  • 解开 Ansible 任务复用谜题:过滤器用法、Include/Import 本质差异与任务文件价值详解
  • CPU 虚拟化之Cpu Models
  • 微算法科技(NASDAQ:MLGO)突破性FPGA仿真算法技术助力Grover搜索,显著提升量子计算仿真效率
  • 【LwIP源码学习7】ICMP部分源码分析
  • 【工具篇2】Gitee导入github repo作为持续的镜像站,自建 GitHub 镜像仓库详细步骤
  • Web转uni-app
  • 如何使用 Xshell 8 连接到一台 CentOS 7 电脑(服务器)
  • CellCharter | 入门了解
  • Linux 服务器故障全解析:常见问题及处理方法大全
  • imx6ull-驱动开发篇44——Linux I2C 驱动实验
  • PP工单状态JEST表
  • 浅聊达梦数据库物理热备的概念及原理