步骤十二、设备管理-监控视频
先决条件
授权
您需要先拥有一个授权码,授权码获取请参考授权申请。
资源获取
注意
场景中涉及到的图片、模型、第三方库、源码等资源,点击下载获取。
步骤
- 设备管理中的监控视频模块可以接入监控数据,随时调取查看监控画面。
1、添加地理围栏
用三维地理围栏将监控覆盖的区域围起来。
addFence() {
// 飞行定位
let locations = [
{
center: [120.72926045543136, 31.28868731509428],
zoom: 17.587162625340376,
bearing: -37.87271910936988,
pitch: 64.42598133276567,
speed: 0.3,
curve: 1,
},
];
this.changeViewers(locations);
// 地理围栏数据
let fenceData = [
[120.72841909978374, 31.287745591127717, 1],
[120.72850753347531, 31.287652507096332, 1],
[120.72946780543789, 31.28764973659848, 1],
// ...剩余数据省略,可以从源码中复制
];
// 将地理围栏添加到场景中
this.Fence = this._layer.addGeoFencing({
type: 'fade', // 设置地理围栏的类型
color: '#2647d4', // 地理围栏的颜色
speed: 2, // 地理围栏的变化速度
opacity: 0.8, // 地理围栏不透明度
height: 30, // 地理围栏高度
data: { // 地理围栏数据
name: 'name',
coordinate: fenceData // 组成围栏的点位坐标,形如[[经度,纬度,高度],[经度,纬度,高度]...]
},
});
}笔记有关三维地理围栏的更多信息,请访问addGeoFencing。
2、添加监控图标与视频
首先,定义一个变量,用于存放监控标签数据。
constructor(map, layer, group) {
// ...省略相关已有代码
this.videoMarkers = []; // 存放监控标签的数组
}添加监控图标与视频,注意这里为了示意,用的都是同样的视频,大家可以换成动态的。
addMonitorMarker(monitorDatas) {
let self = this;
// 获取三维图层
let modelLayer = this._layer;
// 创建一个新数组,长度与传入的数据相同
let datas = new Array(monitorDatas.length);
// 遍历数组
for (let i = 0; i < monitorDatas.length; i++) {
// 为每个数据项创建一个新的对象
datas[i] = {
id: `monitor${i}`,
// 创建作为标记的DOM元素
element: self.createDeviceDom( 'cameraInfo', './assets/images/camera4.png', '35px', '50px', 'cameraClass' ),
position: monitorDatas[i], // 标签位置
};
}
// 将监控标签添加到场景中
let monitorMarker = modelLayer.addMarker({
id: 'marker_monitor',
data: datas,
});
self.markerData.push(monitorMarker);
// 遍历监控标签
monitorMarker.element.children.forEach((dom, index) => {
// 为每个标签添加点击事件
dom.element.addEventListener('click', (e) => {
// 如果已存在监控视频弹框,则删除
if (self.videoMarkers.length > 0) {
self.videoMarkers.forEach((m) => {
if (m.remove) m.remove();
m = null;
});
self.videoMarkers = [];
}
// 创建视频弹窗标签并设置样式
let dom = self.createDeviceDom( 'videopop', './assets/images/ui/video.png', '320px', '160px' );
dom.style.paddingTop = '40px';
dom.style.paddingBottom = '15px';
dom.style.backgroundColor = 'rgba(0,0,0,0.5)';
// 创建弹窗关闭元素
let closeIcon = document.createElement('div');
closeIcon.className = 'closeVideo';
// 创建视频元素并设置样式
const video = document.createElement('video');
video.src = './assets/images/ui/videoexample.mp4';
video.controls = false;
video.autoplay = true;
video.muted = true;
video.loop = true;
video.height = 160;
video.width = 320;
dom.appendChild(video);
dom.appendChild(closeIcon);
video.style.opacity = 1.0;
// 将视频弹框添加到场景中
let cameraMarker = modelLayer.addMarker({
id: 'marker_video',
data: [
{
name: 'video',
element: dom,
position: datas[index].position,
},
],
});
self.videoMarkers.push(cameraMarker);
// 为视频弹框的关闭按钮添加点击事件
cameraMarker.element.children[0].element.addEventListener(
'click',
(e) => {
// 获取当前点击的目标子元素
let target = e.target;
// 如果点击的是关闭图标,则删除视频弹框
if (target.className == 'closeVideo') {
if (self.videoMarkers.length > 0) {
self.videoMarkers.forEach((m) => {
if (m.remove) m.remove();
m = null;
});
// 清空视频标签数组
self.videoMarkers = [];
}
}
}
);
});
});
}笔记有关三维标签的更多信息,请访问addMarker。
3、移除三维地理围栏
关于移除三维地理围栏的代码如下。
removeFence() {
this._layer.removeModel(this.fence);
}
4、调用方法
在 LyBottom.vue 中定义监控标签数据。
var monitorData = [
[120.72859280417336, 31.287819536766325, 16.61136703401467],
[120.72903709929072, 31.287816041953096, 17.753007312637767],
[120.72996483598551, 31.287815367533703, 21.220148879042075],
[120.73057112450243, 31.288328793535406, 22.856333422502818],
[120.73030159329818, 31.288916335578875, 21.168314064335178],
[120.72855965306707, 31.288364164704344, 25.369974683089666],
[120.72894653602232, 31.288950980748243, 12.14282479806209],
[120.72934200510562, 31.287979641573436, 9.59280601642283],
];将 LyBottom.vue 中关于
addMonitorMarker
和removeFence
方法的注释去掉。
5、查看效果
运行,查看效果。
npm run dev