当前 TerrainViewer.vue 中的标记点是简单的球体 + 光晕,点击后仅显示文本弹窗。产品希望:
type 字段区分不同类型,例如 video、html、device。addMarker / removeMarker / clearMarkers / flyTo)向后兼容。| 图片 | 风格关键词 |
|---|---|
5efce9079b9f35554d30a513537fa8c4.png |
彩色长方形标签牌、细垂线连接到地面、工业区域名称 |
8bf719d7d65f9d1c54a2d9e53bf98c95.png |
绿色圆形定位图标、黄色人员图标、数据大屏深色背景 |
4622db6e4a309eca72d06c7e8bbddc91.png |
六边形设备图标、深色信息卡片、字段化展示 |
| 组件 | 职责 |
|---|---|
TerrainViewer.vue |
Three.js 场景、地形、相机、CSS2DRenderer、标记点 Mesh/标签/垂线、弹窗状态管理、事件转发 |
MarkerPopup.vue |
根据 marker.type 渲染 video / html / device 三种内容 |
App.vue |
传入 markers 数据,接收 markerClick 事件 |
每个标记点由三部分组成:
CylinderGeometry(6 segments),薄盘,贴于地形表面,按类型着色。Line 从地面中心向上延伸至标签底部,半透明,长度约 50 地形单位。| type | 主色 | 用途 |
|---|---|---|
video |
#22c55e 青绿 |
视频监控 |
device |
#38bdf8 冰蓝 |
设备数据 |
html |
#f59e0b 琥珀黄 |
HTML 内容/报表 |
颜色可通过 marker.color 覆盖。
markerClick 事件,并向父页面 postMessage。{
lon: 113.722,
lat: 24.575,
alt: 0, // 可选,海拔偏移
title: '监控 01', // 标签牌与弹窗标题
type: 'video', // 'video' | 'html' | 'device'
color: 0x22c55e, // 可选,覆盖默认类型色
// video 类型(二选一)
videoUrl: 'https://.../stream.m3u8',
iframeUrl: '',
// html 类型(二选一)
htmlContent: '<div>...</div>',
htmlUrl: '',
// device 类型
status: '正常',
metrics: [
{ label: '温度', value: 24, unit: '°C' },
{ label: '湿度', value: 62, unit: '%' }
]
}
弹窗为深色半透明卡片,宽度 320px,最大高度限制,超出滚动。
type: 'video'按优先级:
videoUrl → <video controls autoplay muted :src="videoUrl" />iframeUrl → <iframe :src="iframeUrl" />type: 'html'按优先级:
htmlContent → v-html 渲染htmlUrl → <iframe :src="htmlUrl" />type: 'device'渲染设备卡片:
titlestatus(带颜色小圆点)
#22c55e#f59e0b#ef4444#9ca3afmetrics: [{ label, value, unit }]App.vue 传入 markers。TerrainViewer 监听 markers 变化,重建 Mesh 底座、垂线、CSS2D 标签。activeMarkeremit('markerClick', marker)postMessage({ type: 'markerClick', ... }) 给父页面activeMarker = null。type 缺失或非法 → 退化为文本渲染 title / content。video 无有效源 → 显示占位提示。html 无内容 → 显示占位提示。device 无 metrics → 仅显示 title 和 status。addMarker、removeMarker、clearMarkers、flyTo。addMarker 支持传入新字段(type、videoUrl、metrics 等)。type)仍可显示,退化为简单文本弹窗。CSS2DRenderer。CSS2DRenderer 并集成到渲染循环。MarkerPopup.vue 支持 video / html / device。App.vue 示例数据,覆盖三种类型。