Vue3 + 高德地图JS API 2.0:手把手教你实现养老院人员轨迹监控与电子围栏预警系统
·
Vue3 + 高德地图JS API 2.0:构建智慧养老监护系统的实战指南
在人口老龄化加速的背景下,智慧养老监护系统正成为养老机构提升服务质量和安全保障的关键工具。本文将带您从零开始,基于Vue3框架和高德地图JS API 2.0,构建一个功能完善的养老院人员轨迹监控与电子围栏预警系统。
1. 系统架构设计与环境准备
1.1 技术选型与项目初始化
现代WebGIS应用开发需要综合考虑性能、可维护性和扩展性。我们选择以下技术栈:
- 前端框架 :Vue3 + Composition API + TypeScript
- 地图引擎 :高德地图JS API 2.0
- 状态管理 :Pinia(轻量级替代Vuex)
- UI组件库 :Element Plus(适配Vue3版本)
项目初始化步骤:
# 创建Vue3项目
npm init vue@latest vue3-amap-monitor
# 安装核心依赖
npm install @amap/amap-jsapi-loader @vueuse/core pinia element-plus
1.2 高德地图API配置
在高德开放平台申请开发者密钥时,需要注意:
- 选择"Web端(JS API)"应用类型
- 启用"轨迹纠偏"和"地理围栏"服务
- 设置安全密钥白名单
配置示例:
// src/utils/amap-config.ts
export const AMAP_CONFIG = {
key: '您的高德地图Key',
securityJsCode: '您的安全密钥',
version: '2.0',
plugins: [
'AMap.Marker',
'AMap.Polyline',
'AMap.Circle',
'AMap.Polygon',
'AMap.GraspRoad',
'AMap.MoveAnimation'
]
}
2. 核心功能模块实现
2.1 地图初始化与3D视图配置
现代养老监护系统需要直观的3D视图展示:
// src/components/AmapContainer.vue
import { onMounted } from 'vue'
import { loadAMap } from '@/utils/amap-loader'
const initMap = async () => {
const AMap = await loadAMap()
const map = new AMap.Map('map-container', {
viewMode: '3D',
zoom: 17,
pitch: 50,
rotation: -15,
mapStyle: 'amap://styles/blue',
features: ['bg', 'road', 'building']
})
// 添加控制条
map.addControl(new AMap.ControlBar({
showZoomBar: true,
showControlButton: true,
position: { right: '10px', top: '10px' }
}))
}
2.2 实时定位与人员标记
养老院人员定位需要特殊图标设计:
const createElderlyMarker = (position, info) => {
return new AMap.Marker({
position,
icon: new AMap.Icon({
image: '/icons/elderly.png',
imageSize: new AMap.Size(32, 32)
}),
label: {
content: `<div class="marker-label">${info.name}<br>${info.status}</div>`,
direction: 'bottom'
},
extData: info
})
}
实时定位数据更新策略 :
| 更新频率 | 适用场景 | 性能影响 | 精度 |
|---|---|---|---|
| 30秒 | 普通监护 | 低 | 中 |
| 10秒 | 特殊看护 | 中 | 高 |
| 即时 | 紧急情况 | 高 | 最高 |
2.3 轨迹回放与速度控制
高德地图JS API 2.0的轨迹回放功能需要特别注意:
const playTrajectory = (path) => {
const marker = new AMap.Marker({
map,
icon: new AMap.Icon({
image: '/icons/walker.png',
size: new AMap.Size(32, 32)
}),
autoRotation: true
})
// 关键参数:duration控制速度
marker.moveAlong(path, {
duration: path.length * 50, // 每点50ms
autoRotation: true,
callback: () => console.log('轨迹播放完成')
})
return {
pause: () => marker.pauseMove(),
resume: () => marker.resumeMove(),
stop: () => marker.stopMove()
}
}
注意:不要指定高德地图JS API的版本号,使用默认版本可确保轨迹速度控制功能正常
2.4 电子围栏与越界预警
电子围栏是养老监护系统的核心安全功能:
const createFence = (type, points, options) => {
let fence
if (type === 'circle') {
fence = new AMap.Circle({
center: points[0],
radius: options.radius,
strokeColor: options.active ? '#FF0000' : '#00FF00',
fillColor: options.active ? 'rgba(255,0,0,0.3)' : 'rgba(0,255,0,0.3)',
strokeWeight: 2
})
} else {
fence = new AMap.Polygon({
path: points,
strokeColor: options.active ? '#FF0000' : '#00FF00',
fillColor: options.active ? 'rgba(255,0,0,0.3)' : 'rgba(0,255,0,0.3)',
strokeWeight: 2
})
}
fence.on('click', () => {
console.log('围栏被点击', options)
})
return fence
}
围栏状态检测逻辑 :
watchEffect(() => {
if (currentPosition.value && fences.value.length) {
fences.value.forEach(fence => {
const isInside = AMap.GeometryUtil.isPointOnRing(
[currentPosition.value.lng, currentPosition.value.lat],
fence.getPath()
)
if (!isInside && fence.getExtData().active) {
triggerAlarm(fence.getExtData())
}
})
}
})
3. 性能优化与用户体验
3.1 地图渲染性能优化
大型养老院可能有数百个监控点,需要优化:
- 点聚合技术 :
const markerCluster = new AMap.MarkerCluster(map, markers, {
gridSize: 80,
renderClusterMarker: (context) => {
// 自定义聚合点样式
}
})
- 视图区域过滤 :
map.on('viewchange', debounce(() => {
const bounds = map.getBounds()
updateVisibleMarkers(bounds)
}, 300))
3.2 移动端适配与触摸交互
养老院护工常使用平板设备操作:
/* 触摸友好的控制按钮 */
.map-control {
touch-action: manipulation;
padding: 12px;
background: rgba(255,255,255,0.8);
border-radius: 50%;
box-shadow: 0 2px 6px rgba(0,0,0,0.3);
}
3.3 告警系统集成
多级告警处理流程:
- 初级告警:地图视觉提示
- 中级告警:声音提醒+推送通知
- 紧急告警:自动呼叫值班人员
const triggerAlarm = (alarm) => {
// 地图显示
showAlarmMarker(alarm)
// 声音提醒
playAlarmSound(alarm.level)
// 推送通知
if (Notification.permission === 'granted') {
new Notification(`老人越界告警: ${alarm.elderlyName}`, {
body: `位置: ${alarm.location}`
})
}
}
4. 业务系统深度集成
4.1 老人信息管理系统对接
与养老院CRM系统对接的关键字段:
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| elderlyId | string | 是 | 老人唯一ID |
| name | string | 是 | 老人姓名 |
| room | string | 是 | 房间号 |
| healthStatus | number | 是 | 健康等级 |
| guardianContact | string | 否 | 紧急联系人 |
4.2 历史数据分析报表
使用高德地图+ECharts实现轨迹分析:
const renderTrajectoryHeatmap = (tracks) => {
const heatmapData = tracks.map(t => ({
lng: t.longitude,
lat: t.latitude,
count: 1
}))
const heatmap = new AMap.Heatmap(map, {
radius: 25,
opacity: [0, 0.8]
})
heatmap.setDataSet({
data: heatmapData,
max: 100
})
}
4.3 多端协同工作
系统架构支持以下终端:
- 护工平板端 :实时监控+告警处理
- 护士站大屏 :全局视图+数据分析
- 家属微信小程序 :受限的位置查询
权限控制矩阵 :
| 功能 | 护工 | 护士长 | 家属 |
|---|---|---|---|
| 实时定位 | ✓ | ✓ | ✓ |
| 历史轨迹 | ✓ | ✓ | △ |
| 围栏设置 | ✓ | ✓ | × |
| 告警处理 | ✓ | ✓ | × |
5. 实战经验与避坑指南
在开发养老监护系统过程中,我们积累了一些关键经验:
- 地图样式覆盖问题 :
/* 修复Element UI下拉框与地图控件���突 */
.el-select-dropdown {
z-index: 2000 !important;
}
.amap-logo, .amap-copyright {
z-index: 100 !important;
}
- 轨迹数据优化处理 :
// 轨迹数据压缩算法
const simplifyTrajectory = (points, tolerance = 0.0001) => {
return AMap.GraspRoad.simplify(points, tolerance)
}
- 跨天轨迹回放处理 :
// 处理超过24小时的轨迹数据
const playLongTrajectory = (tracks) => {
const daySegments = splitByDay(tracks)
daySegments.forEach((segment, index) => {
setTimeout(() => playSegment(segment), index * 1000)
})
}
- 电子围栏状态同步 :
// 使用WebSocket实时更新围栏状态
socket.on('fence-update', (data) => {
const fence = findFence(data.id)
if (fence) {
fence.setOptions({
strokeColor: data.active ? '#FF0000' : '#00FF00',
fillColor: data.active ? 'rgba(255,0,0,0.3)' : 'rgba(0,255,0,0.3)'
})
fence.setExtData({ ...fence.getExtData(), active: data.active })
}
})
养老监护系统的开发不仅仅是技术实现,更需要考虑实际使用场景。我们在某养老院部署后发现,护工更倾向于简洁的大按钮界面,而非复杂的地图控件。因此后期我们增加了"一键定位所有异常"功能,大幅提升了系统的实用性。
更多推荐
所有评论(0)