From abd285e6d013128aa57c9e30e851b2aa76d60ec5 Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Tue, 10 Feb 2026 16:45:17 +0800
Subject: [PATCH] feat:独栋显示调整
---
src/views/activity/components/videoControlBox.vue | 1017 ++++++++++++++++++++++++++++-------------------------------
1 files changed, 481 insertions(+), 536 deletions(-)
diff --git a/src/views/activity/components/videoControlBox.vue b/src/views/activity/components/videoControlBox.vue
index fd9638e..be3cd51 100644
--- a/src/views/activity/components/videoControlBox.vue
+++ b/src/views/activity/components/videoControlBox.vue
@@ -1,117 +1,113 @@
<template>
- <div>
- <div class="btn-box" v-show="videoShow">
- <ul>
- <li>
- <button @click="play()">播放</button>
- </li>
- <li>
- <button @click="pause()">暂停</button>
- </li>
- <li>
- <button @click="restore()">恢复</button>
- </li>
- <li>
- <button @click="view('1', -20, 100)">第一视角</button>
- </li>
- <li>
- <button @click="view('2')">上帝视角</button>
- </li>
- <li>
- <button @click="view('tracked')">跟随视角</button>
- </li>
- <li>
- <button @click="view('free')">自由视角</button>
- </li>
- </ul>
- </div>
-
- <div class="item video1" v-show="videoShow">
- <video-loading v-show="isShowVideoLoading.video1"></video-loading>
- <div class="select" v-show="isShowSelect.video1">
- <el-select size="small" v-model="monitor.type1" @change="((val) => { navClick(val, 1) })" placeholder="请选择"
- ref="videoSelect1">
- <el-option v-for="item in monitorOption" :key="item.value" :label="item.label" :value="item.value"
- class="activity-video-option-css">
- <div class="video-status" :style="{ background: (item.status == 0 ? '#adadad' : '#4ccc7d') }">
- </div>
- {{ item.label }}
- </el-option>
- </el-select>
- </div>
- <div class="video" v-show="isHaveMonitor.video1">
- <video id="videoElement1" autoplay controls width="100%" height="100%" style="object-fit: fill"></video>
- </div>
- <div class="no-video" v-show="!isHaveMonitor.video1">
- {{ playVideoHolders.text1 }}
- </div>
- </div>
-
- <div class="item video2" v-show="videoShow">
- <video-loading v-show="isShowVideoLoading.video2"></video-loading>
- <div class="select" v-show="isShowSelect.video2">
- <el-select size="small" v-model="monitor.type2" @change="((val) => { navClick(val, 2) })" placeholder="请选择"
- ref="videoSelect2">
- <el-option v-for="item in monitorOption" :key="item.value" :label="item.label" :value="item.value"
- class="activity-video-option-css">
- <div class="video-status" :style="{ background: (item.status == 0 ? '#adadad' : '#4ccc7d') }">
- </div>
- {{ item.label }}
- </el-option>
- </el-select>
- </div>
- <div class="video" v-show="isHaveMonitor.video2">
- <video id="videoElement2" autoplay controls width="100%" height="100%" style="object-fit: fill"></video>
- </div>
- <div class="no-video" v-show="!isHaveMonitor.video2">
- {{ playVideoHolders.text2 }}
- </div>
- </div>
-
- <div class="item video3" v-show="videoShow">
- <video-loading v-show="isShowVideoLoading.video3"></video-loading>
- <div class="select" v-show="isShowSelect.video3">
- <el-select size="small" v-model="monitor.type3" v-show="isShowSelect.video3"
- @change="((val) => { navClick(val, 3) })" placeholder="请选择" ref="videoSelect3">
- <el-option v-show="isShowSelect.video3" v-for="item in monitorOption" :key="item.value"
- :label="item.label" :value="item.value" class="activity-video-option-css">
- <div class="video-status" :style="{ background: (item.status == 0 ? '#adadad' : '#4ccc7d') }">
- </div>
- {{ item.label }}
- </el-option>
- </el-select>
- </div>
- <div class="video" v-show="isHaveMonitor.video3">
- <video id="videoElement3" autoplay controls width="100%" height="100%" style="object-fit: fill"></video>
- </div>
- <div class="no-video" v-show="!isHaveMonitor.video3">
- {{ playVideoHolders.text3 }}
- </div>
- </div>
-
- <div class="item video4" v-show="videoShow">
- <video-loading v-show="isShowVideoLoading.video4"></video-loading>
- <div class="select" v-show="isShowSelect.video4">
- <el-select size="small" v-model="monitor.type4" @change="((val) => { navClick(val, 4) })" placeholder="请选择"
- ref="videoSelect4">
- <el-option v-for="item in monitorOption" :key="item.value" :label="item.label" :value="item.value"
- class="activity-video-option-css">
- <div class="video-status" :style="{ background: (item.status == 0 ? '#adadad' : '#4ccc7d') }">
- </div>
- {{ item.label }}
- </el-option>
- </el-select>
- </div>
- <div class="video" v-show="isHaveMonitor.video4">
- <video id="videoElement4" autoplay controls width="100%" height="100%" style="object-fit: fill"></video>
- </div>
- <div class="no-video" v-show="!isHaveMonitor.video4">
- {{ playVideoHolders.text4 }}
- </div>
- </div>
-
- <div class="deleteVideo" v-show="videoShow" @click="closeVideo">关闭</div>
+ <div>
+ <div class="btn-box" v-show="videoShow">
+ <ul>
+ <li>
+ <button @click="play()">播放</button>
+ </li>
+ <li>
+ <button @click="pause()">暂停</button>
+ </li>
+ <li>
+ <button @click="restore()">恢复</button>
+ </li>
+ <li>
+ <button @click="view('1', -20, 100)">第一视角</button>
+ </li>
+ <li>
+ <button @click="view('2')">上帝视角</button>
+ </li>
+ <li>
+ <button @click="view('tracked')">跟随视角</button>
+ </li>
+ <li>
+ <button @click="view('free')">自由视角</button>
+ </li>
+ </ul>
</div>
+
+ <div class="item video1" v-show="videoShow">
+ <div class="select" v-show="isShowSelect.video1">
+ <el-select size="small" v-model="monitor.type1" @change="((val) => { navClick(val, 1) })" placeholder="请选择"
+ ref="videoSelect1">
+ <el-option v-for="item in monitorOption" :key="item.value" :label="item.label" :value="item.value"
+ class="activity-video-option-css">
+ <div class="video-status" :style="{ background: (item.status == 0 ? '#adadad' : '#4ccc7d') }">
+ </div>
+ {{ item.label }}
+ </el-option>
+ </el-select>
+ </div>
+ <div class="video" v-show="isHaveMonitor.video1">
+ <hk-video class="video" ref="videoElement1" />
+ </div>
+ <div class="no-video" v-show="!isHaveMonitor.video1">
+ {{ playVideoHolders.text1 }}
+ </div>
+ </div>
+
+ <div class="item video2" v-show="videoShow">
+ <div class="select" v-show="isShowSelect.video2">
+ <el-select size="small" v-model="monitor.type2" @change="((val) => { navClick(val, 2) })" placeholder="请选择"
+ ref="videoSelect2">
+ <el-option v-for="item in monitorOption" :key="item.value" :label="item.label" :value="item.value"
+ class="activity-video-option-css">
+ <div class="video-status" :style="{ background: (item.status == 0 ? '#adadad' : '#4ccc7d') }">
+ </div>
+ {{ item.label }}
+ </el-option>
+ </el-select>
+ </div>
+ <div class="video" v-show="isHaveMonitor.video2">
+ <hk-video class="video" ref="videoElement2" />
+ </div>
+ <div class="no-video" v-show="!isHaveMonitor.video2">
+ {{ playVideoHolders.text2 }}
+ </div>
+ </div>
+
+ <div class="item video3" v-show="videoShow">
+ <div class="select" v-show="isShowSelect.video3">
+ <el-select size="small" v-model="monitor.type3" v-show="isShowSelect.video3"
+ @change="((val) => { navClick(val, 3) })" placeholder="请选择" ref="videoSelect3">
+ <el-option v-show="isShowSelect.video3" v-for="item in monitorOption" :key="item.value" :label="item.label"
+ :value="item.value" class="activity-video-option-css">
+ <div class="video-status" :style="{ background: (item.status == 0 ? '#adadad' : '#4ccc7d') }">
+ </div>
+ {{ item.label }}
+ </el-option>
+ </el-select>
+ </div>
+ <div class="video" v-show="isHaveMonitor.video3">
+ <hk-video class="video" ref="videoElement3" />
+ </div>
+ <div class="no-video" v-show="!isHaveMonitor.video3">
+ {{ playVideoHolders.text3 }}
+ </div>
+ </div>
+
+ <div class="item video4" v-show="videoShow">
+ <div class="select" v-show="isShowSelect.video4">
+ <el-select size="small" v-model="monitor.type4" @change="((val) => { navClick(val, 4) })" placeholder="请选择"
+ ref="videoSelect4">
+ <el-option v-for="item in monitorOption" :key="item.value" :label="item.label" :value="item.value"
+ class="activity-video-option-css">
+ <div class="video-status" :style="{ background: (item.status == 0 ? '#adadad' : '#4ccc7d') }">
+ </div>
+ {{ item.label }}
+ </el-option>
+ </el-select>
+ </div>
+ <div class="video" v-show="isHaveMonitor.video4">
+ <hk-video class="video" ref="videoElement4" />
+ </div>
+ <div class="no-video" v-show="!isHaveMonitor.video4">
+ {{ playVideoHolders.text4 }}
+ </div>
+ </div>
+
+ <div class="deleteVideo" v-show="videoShow" @click="closeVideo">关闭</div>
+ </div>
</template>
<script>
@@ -119,507 +115,456 @@
let track = null
let flvListPlayer = {
- flvPlayer1: null,
- flvPlayer2: null,
- flvPlayer3: null,
- flvPlayer4: null,
+ flvPlayer1: null,
+ flvPlayer2: null,
+ flvPlayer3: null,
+ flvPlayer4: null,
}
import flvjs from 'flv.js'
-import { getRegionList, getDevices } from '@/api/video/index.js'
+import { getRegionList } from '@/api/video/index.js'
export default {
- data () {
- return {
- valChoosed: '',
- argsChoosed: '',
+ data () {
+ return {
+ valChoosed: '',
+ argsChoosed: '',
- monitorOption: [],
+ monitorOption: [],
- isHaveMonitor: {
- video1: false,
- video2: false,
- video3: false,
- video4: false,
- },
+ isHaveMonitor: {
+ video1: false,
+ video2: false,
+ video3: false,
+ video4: false,
+ },
- monitor: {
- type1: '',
- type2: '',
- type3: '',
- type4: '',
- },
+ monitor: {
+ type1: '',
+ type2: '',
+ type3: '',
+ type4: '',
+ },
- isShowSelect: {
- video1: true,
- video2: true,
- video3: true,
- video4: true,
- },
+ isShowSelect: {
+ video1: true,
+ video2: true,
+ video3: true,
+ video4: true,
+ },
- playVideoHolders: {
- text1: '',
- text2: '',
- text3: '',
- text4: '',
- },
+ playVideoHolders: {
+ text1: '',
+ text2: '',
+ text3: '',
+ text4: '',
+ },
- isShowVideoLoading: {
- video1: false,
- video2: false,
- video3: false,
- video4: false,
- },
+ videoShow: false
+ }
+ },
- videoShow: false
- }
- },
+ mounted () {
+ this.$nextTick(() => {
+ tc = new global.DC.TrackController(global.viewer)
- mounted () {
- this.$nextTick(() => {
- tc = new global.DC.TrackController(global.viewer)
+ })
+ },
+
+ methods: {
+ /**
+ * @description: 轨迹点击弹窗中,查看视频
+ * @return {*}
+ */
+ watchVideo (linePosition, polygonPosition) {
+
+ const that = this
+
+ const line = this.$turf.lineString(linePosition.split(';').filter(item => item != '').map(item => item.split(',').map(i => Number(i))))
+ // const lineLength = this.$turf.length(line) * 1000
+ const chunkLine = this.$turf.lineChunk(line, 0.1)
+ console.log('chunkLine', chunkLine)
+ let arr = chunkLine.features.reduce((pre, cur) =>
+ pre.concat(cur.geometry.coordinates)
+ , []).map(item => item.join(','))
+ const time = arr.filter(item => arr.indexOf(item) == arr.lastIndexOf(item)).length * 16
+ const newPostion = arr.filter((item, index) => index == arr.lastIndexOf(item)).join(';')
+ console.log('arr', arr, 'time', time, 'newPostion', newPostion)
+
+ this.getRegionList(polygonPosition)
+ this.videoShow = true
+
+ if (tc) {
+ tc.clear()
+ }
+
+ /**
+ * @description:
+ * @param {*} position 当前行驶位置信息
+ * @param {*} isLast 是否为最后一个点位
+ * @return {*}
+ */
+ track = new global.DC.Track(newPostion, time, (position, isLast) => {
+
+ const carPosition = [position.lat, position.lng]
+
+ let distanceArr = []
+
+ that.monitorOption.forEach((item, index) => {
+ const itemPosition = [item.item.latitude, item.item.longitude]
+
+ var from = that.$turf.point(itemPosition)
+ var to = that.$turf.point(carPosition)
+
+ var distance = that.$turf.distance(from, to) * 1000
+
+ if (distance > that.lineWidth) {
+ distanceArr.push({
+ ...item,
+ trackDistanceStatus: 0,
+ distance
+ })
+ } else {
+
+ distanceArr.push({
+ ...item,
+ trackDistanceStatus: 1,
+ distance
+ })
+ }
})
- },
- methods: {
- /**
- * @description: 轨迹点击弹窗中,查看视频
- * @return {*}
- */
- watchVideo (linePosition, polygonPosition) {
+ distanceArr.sort((a, b) => a.distance < b.distance ? -1 : a.distance > b.distance ? 1 : 0)
- const that = this
+ distanceArr.forEach((item, index) => {
+ const ind = index + 1
- const line = this.$turf.lineString(linePosition.split(';').filter(item => item != '').map(item => item.split(',').map(i => Number(i))))
- // const lineLength = this.$turf.length(line) * 1000
- const chunkLine = this.$turf.lineChunk(line, 0.1)
- console.log('chunkLine', chunkLine)
- let arr = chunkLine.features.reduce((pre, cur) =>
- pre.concat(cur.geometry.coordinates)
- , []).map(item => item.join(','))
- const time = arr.filter(item => arr.indexOf(item) == arr.lastIndexOf(item)).length * 16
- const newPostion = arr.filter((item, index) => index == arr.lastIndexOf(item)).join(';')
- console.log('arr', arr, 'time', time, 'newPostion', newPostion)
+ if (index < 4) {
- this.getRegionList(polygonPosition)
- this.videoShow = true
+ if (item.trackDistanceStatus == 1) {
+ this.monitor[`type${ind}`] = item.item.name
- if (tc) {
- tc.clear()
- }
-
- /**
- * @description:
- * @param {*} position 当前行驶位置信息
- * @param {*} isLast 是否为最后一个点位
- * @return {*}
- */
- track = new global.DC.Track(newPostion, time, (position, isLast) => {
-
- const carPosition = [position.lat, position.lng]
-
- let distanceArr = []
-
- that.monitorOption.forEach((item, index) => {
- const itemPosition = [item.item.latitude, item.item.longitude]
-
- var from = that.$turf.point(itemPosition)
- var to = that.$turf.point(carPosition)
-
- var distance = that.$turf.distance(from, to) * 1000
-
- if (distance > that.lineWidth) {
- distanceArr.push({
- ...item,
- trackDistanceStatus: 0,
- distance
- })
- } else {
-
- distanceArr.push({
- ...item,
- trackDistanceStatus: 1,
- distance
- })
- }
-
- })
-
- distanceArr.sort((a, b) => a.distance < b.distance ? -1 : a.distance > b.distance ? 1 : 0)
-
- distanceArr.forEach((item, index) => {
- const ind = index + 1
-
- if (index < 4) {
-
- if (item.trackDistanceStatus == 1) {
- this.monitor[`type${ind}`] = item.item.name
-
- if (item.item.status == 1) {
- this.isHaveMonitor[`video${ind}`] = true
-
- getDevices(item.item.channelId).then(res => {
- let flvAddress = ''
- if ('data' in res.data) {
- flvAddress = res.data.data.flv
- } else {
- flvAddress = 'nodata'
- }
-
- this.playVideoList(`flvPlayer${ind}`, `${flvAddress}`, `videoElement${ind}`, `${ind}`)
- })
- } else {
- this.isHaveMonitor[`video${ind}`] = false
- this.playVideoHolders[`text${ind}`] = '设备离线中……'
- }
-
- } else {
- this.monitor[`type${ind}`] = ''
- this.isHaveMonitor[`video${ind}`] = false
- this.playVideoHolders[`text${ind}`] = '警车周边暂无设备……'
- }
-
- }
- })
- }, {
- headingOffset: -90
- })
-
- track.setModel('/model/qiche.gltf', {
- scale: 1.2
- })
-
- tc.addTrack(track)
- },
-
- // 遍历监控图标
- initMonitoringIcon (monitoringList) {
- monitoringList.forEach(item => {
- this.$EventBus.$emit('layerPointAdd', {
- layerName: 'monitoringLayers',
- type: "billboard",
- params: {
- name: item.name,
- lng: item.longitude,
- lat: item.latitude,
- alt: 1,
- url: '/img/icon/video.png',
- },
- })
- })
- },
-
- /**
- * @description: 获取视频播放列表
- * @param {*} positionNewStr
- * @return {*}
- */
- getRegionList (positionNewStr) {
- getRegionList({ page: 1, count: 15, range: positionNewStr }).then(res => {
- let monitorData = res.data.data.list
- this.initMonitoringIcon(monitorData)
- this.monitorOption = []
- monitorData.forEach((item, index) => {
-
- this.monitorOption.push({ value: `${index}`, label: `${item.name}`, status: `${item.status}`, item })
-
- if (index < 4) {
- const ind = index + 1
-
- this.monitor[`type${ind}`] = item.name
-
- if (item.status == 1) {
- this.isHaveMonitor[`video${ind}`] = true
- this.isShowVideoLoading[`video${ind}`] = true
-
- getDevices(item.channelId).then(res => {
- let flvAddress = ''
- if ('data' in res.data) {
- flvAddress = res.data.data.flv
- } else {
- flvAddress = 'nodata'
- }
-
- this.playVideoList(`flvPlayer${ind}`, `${flvAddress}`, `videoElement${ind}`)
- })
- } else {
- this.isHaveMonitor[`video${ind}`] = false
- this.playVideoHolders[`text${ind}`] = '设备离线中……'
- }
-
- }
-
- })
- })
- },
-
- /**
- * @description: 轨迹开始
- * @return {*}
- */
- play () {
- // polylineAreaLayer.show = true
- tc.play()
- this.view('1', -20, 400)
- },
-
- playVideoList (flvItemPlayer, flvUrl, videoEleName, index) {
- if (flvListPlayer[flvItemPlayer] != null) {
- flvListPlayer[flvItemPlayer].pause()
- flvListPlayer[flvItemPlayer].unload()
- flvListPlayer[flvItemPlayer].detachMediaElement()
- flvListPlayer[flvItemPlayer].destroy()
- flvListPlayer[flvItemPlayer] = null
- }
-
- if (flvjs.isSupported() && flvUrl != 'nodata') {
- this.isShowVideoLoading[`video${index}`] = false
- let videoElement = document.getElementById(videoEleName)
- flvListPlayer[flvItemPlayer] = flvjs.createPlayer({
- type: 'flv',
- isLive: true,
- hasAudio: false,
- url: flvUrl
- })
- flvListPlayer[flvItemPlayer].attachMediaElement(videoElement)
- flvListPlayer[flvItemPlayer].load()
- flvListPlayer[flvItemPlayer].play()
- }
- },
-
- // 暂停播放轨迹
- pause () {
- tc.pause()
- },
-
- // 恢复播放轨迹
- restore () {
- tc.restore()
- },
-
- // 轨迹视角切换
- view (mode, pitch, range) {
- tc.viewTrack(track, {
- mode: mode,
- pitch: pitch,
- range: range
- })
- },
-
- // 关闭视频展示
- closeVideo () {
- if (this.videoShow == false) return
- this.videoShow = false
-
- for (let i = 1; i < 5; i++) {
- if (flvListPlayer[i] != null) {
- flvListPlayer[i].pause()
- flvListPlayer[i].unload()
- flvListPlayer[i].detachMediaElement()
- flvListPlayer[i].destroy()
- flvListPlayer[i] = null
- }
- }
-
- this.$EventBus.$emit('mapClearLayer', {
- layerName: 'monitoringLayers',
- type: 'VectorLayer'
- })
-
- if (tc) {
- tc.clear()
- }
- },
-
- navClick (val, args) {
- if (this.valChoosed == val && this.argsChoosed == args) return
- this.valChoosed = val
- this.argsChoosed = args
-
- this.monitor[`type${args}`] = this.monitorOption[val].item.name
-
- if (this.monitorOption[val].item.status == 1) {
- this.isHaveMonitor[`video${args}`] = true
- this.isShowVideoLoading[`video${args}`] = true
-
- getDevices(this.monitorOption[val].item.channelId).then(res => {
- let flvAddress = ''
- if ('data' in res.data) {
- flvAddress = res.data.data.flv
- } else {
- flvAddress = 'nodata'
- }
-
- this.playVideoList(`flvPlayer${args}`, `${flvAddress}`, `videoElement${args}`, `${args}`)
- })
+ if (item.item.status == 1) {
+ this.isHaveMonitor[`video${ind}`] = true
+ this.playVideoList(item.item.name, item.item.channelId, `videoElement${ind}`)
+ } else {
+ this.isHaveMonitor[`video${ind}`] = false
+ this.playVideoHolders[`text${ind}`] = '设备离线中……'
+ }
} else {
- this.isHaveMonitor[`video${args}`] = false
- this.playVideoHolders[`text${args}`] = '设备离线中…'
+ this.monitor[`type${ind}`] = ''
+ this.isHaveMonitor[`video${ind}`] = false
+ this.playVideoHolders[`text${ind}`] = '警车周边暂无设备……'
}
- },
+
+ }
+ })
+ }, {
+ headingOffset: -90
+ })
+
+ track.setModel('/model/qiche.gltf', {
+ scale: 1.2
+ })
+
+ tc.addTrack(track)
},
- destroyed () {
- this.closeVideo()
+ // 遍历监控图标
+ initMonitoringIcon (monitoringList) {
+ monitoringList.forEach(item => {
+ this.$EventBus.$emit('layerPointAdd', {
+ layerName: 'monitoringLayers',
+ type: "billboard",
+ params: {
+ name: item.name,
+ lng: item.longitude,
+ lat: item.latitude,
+ alt: 1,
+ url: '/img/icon/video.png',
+ },
+ })
+ })
+ },
- this.$EventBus.$emit('mapRemoveLayer', {
- layerName: 'monitoringLayers',
- type: 'VectorLayer'
+ /**
+ * @description: 获取视频播放列表
+ * @param {*} positionNewStr
+ * @return {*}
+ */
+ getRegionList (positionNewStr) {
+ getRegionList({ page: 1, count: 15, range: positionNewStr }).then(res => {
+ let monitorData = res.data.data.list
+ this.initMonitoringIcon(monitorData)
+ this.monitorOption = []
+ monitorData.forEach((item, index) => {
+
+ this.monitorOption.push({ value: `${index}`, label: `${item.name}`, status: `${item.status}`, item })
+
+ if (index < 4) {
+ const ind = index + 1
+
+ this.monitor[`type${ind}`] = item.name
+
+ if (item.status == 1) {
+ this.isHaveMonitor[`video${ind}`] = true
+ this.playVideoList(item.name, item.channelId, `videoElement${ind}`)
+ } else {
+ this.isHaveMonitor[`video${ind}`] = false
+ this.playVideoHolders[`text${ind}`] = '设备离线中……'
+ }
+
+ }
+
+ })
+ })
+ },
+
+ /**
+ * @description: 轨迹开始
+ * @return {*}
+ */
+ play () {
+ // polylineAreaLayer.show = true
+ tc.play()
+ this.view('1', -20, 400)
+ },
+
+ playVideoList (name, channelId, videoEleName) {
+ this.$nextTick(() => {
+
+ this.$refs[videoEleName].initData({
+ cameraIndexCode: channelId,
+ video_name: name,
+ sysResource: 2,
+ streamType: 0
})
- tc = null
+ })
},
+
+ // 暂停播放轨迹
+ pause () {
+ tc.pause()
+ },
+
+ // 恢复播放轨迹
+ restore () {
+ tc.restore()
+ },
+
+ // 轨迹视角切换
+ view (mode, pitch, range) {
+ tc.viewTrack(track, {
+ mode: mode,
+ pitch: pitch,
+ range: range
+ })
+ },
+
+ // 关闭视频展示
+ closeVideo () {
+ if (this.videoShow == false) return
+ this.videoShow = false
+
+ for (let i = 1; i < 5; i++) {
+ if (flvListPlayer[i] != null) {
+ flvListPlayer[i].pause()
+ flvListPlayer[i].unload()
+ flvListPlayer[i].detachMediaElement()
+ flvListPlayer[i].destroy()
+ flvListPlayer[i] = null
+ }
+ }
+
+ this.$EventBus.$emit('mapClearLayer', {
+ layerName: 'monitoringLayers',
+ type: 'VectorLayer'
+ })
+
+ if (tc) {
+ tc.clear()
+ }
+ },
+
+ navClick (val, args) {
+ if (this.valChoosed == val && this.argsChoosed == args) return
+ this.valChoosed = val
+ this.argsChoosed = args
+
+ this.monitor[`type${args}`] = this.monitorOption[val].item.name
+
+ if (this.monitorOption[val].item.status == 1) {
+ this.isHaveMonitor[`video${args}`] = true
+ this.playVideoList(this.monitorOption[val].item.name, this.monitorOption[val].item.channelId, `videoElement${args}`)
+ } else {
+ this.isHaveMonitor[`video${args}`] = false
+ this.playVideoHolders[`text${args}`] = '设备离线中…'
+ }
+ },
+ },
+
+ destroyed () {
+ this.closeVideo()
+
+ this.$EventBus.$emit('mapRemoveLayer', {
+ layerName: 'monitoringLayers',
+ type: 'VectorLayer'
+ })
+
+ tc = null
+ },
}
</script>
<style lang="scss" scoped>
.btn-box {
- position: fixed;
- // bottom: calc(360 / 1080 * 100vh);
- // position: absolute;
- top: calc(680 / 1080 * 100vh);
- // left: 50%;
- left: calc(780 / 1920 * 100vw);
- // transform: translate(-40%, 0);
- z-index: 100;
- min-height: 40px;
- padding: 10px 10px 0 10px;
- white-space: nowrap;
- border-radius: 10px;
- color: #fff;
- user-select: none;
+ position: fixed;
+ // bottom: calc(360 / 1080 * 100vh);
+ // position: absolute;
+ top: calc(680 / 1080 * 100vh);
+ // left: 50%;
+ left: calc(780 / 1920 * 100vw);
+ // transform: translate(-40%, 0);
+ z-index: 100;
+ min-height: 40px;
+ padding: 10px 10px 0 10px;
+ white-space: nowrap;
+ border-radius: 10px;
+ color: #fff;
+ user-select: none;
- ul {
- display: flex;
+ ul {
+ display: flex;
- li {
- button {
- height: 30px;
- margin: 0 5px;
- background-color: $bg-color;
- border: 1px solid #cecece;
- border-radius: 4px;
- color: #fff;
- cursor: pointer;
- outline: none;
- }
- }
+ li {
+ button {
+ height: 30px;
+ margin: 0 5px;
+ background-color: $bg-color;
+ border: 1px solid #cecece;
+ border-radius: 4px;
+ color: #fff;
+ cursor: pointer;
+ outline: none;
+ }
}
+ }
}
.item {
- background-color: $bg-color;
- // position: absolute;
- position: fixed;
- z-index: 100;
- width: calc((1920 - 400) / 4 / 1920 * 100vw);
- height: calc((1080 - 60) / 3 / 1080 * 100vh);
- top: calc(740 / 1080 * 100vh);
+ background-color: $bg-color;
+ // position: absolute;
+ position: fixed;
+ z-index: 100;
+ width: calc((1920 - 400) / 4 / 1920 * 100vw);
+ height: calc((1080 - 60) / 3 / 1080 * 100vh);
+ top: calc(740 / 1080 * 100vh);
- .select {
- position: absolute;
- top: 6%;
- width: 100%;
- z-index: 999;
- }
+ .select {
+ position: absolute;
+ top: 6%;
+ width: 100%;
+ z-index: 999;
+ }
- .video {
- height: 100%;
- padding: 1%;
- }
+ .video {
+ height: 100%;
+ padding: 1%;
+ }
- .no-video {
- // color: #fff;
- // font-size: 32px;
- // letter-spacing: 4px;
- // width: 98%;
- // height: 98%;
- // background-color: rgba(0, 0, 0, 0.7);
- // margin: 1%;
- // display: flex;
- // align-items: center;
- // justify-content: center;
- position: absolute;
- color: #eee;
- letter-spacing: 2px;
- font-size: 24px;
- width: 100%;
- text-align: center;
- top: 40%;
- }
+ .no-video {
+ // color: #fff;
+ // font-size: 32px;
+ // letter-spacing: 4px;
+ // width: 98%;
+ // height: 98%;
+ // background-color: rgba(0, 0, 0, 0.7);
+ // margin: 1%;
+ // display: flex;
+ // align-items: center;
+ // justify-content: center;
+ position: absolute;
+ color: #eee;
+ letter-spacing: 2px;
+ font-size: 24px;
+ width: 100%;
+ text-align: center;
+ top: 40%;
+ }
}
.video1 {
- left: calc(400 / 1920 * 100vw);
+ left: calc(400 / 1920 * 100vw);
- .video {
- padding: 1% 0 1% 1%;
- }
+ .video {
+ padding: 1% 0 1% 1%;
+ }
- .no-video {
- margin: 1% 0 1% 1%;
- }
+ .no-video {
+ margin: 1% 0 1% 1%;
+ }
}
.video2 {
- left: calc(780 / 1920 * 100vw);
+ left: calc(780 / 1920 * 100vw);
- .video {
- padding: 1% 0 1% 1%;
- }
+ .video {
+ padding: 1% 0 1% 1%;
+ }
- .no-video {
- margin: 1% 0 1% 1%;
- }
+ .no-video {
+ margin: 1% 0 1% 1%;
+ }
}
.video3 {
- left: calc(1160 / 1920 * 100vw);
+ left: calc(1160 / 1920 * 100vw);
- .video {
- padding: 1% 0 1% 1%;
- }
+ .video {
+ padding: 1% 0 1% 1%;
+ }
- .no-video {
- margin: 1% 0 1% 1%;
- }
+ .no-video {
+ margin: 1% 0 1% 1%;
+ }
}
.video4 {
- left: calc(1540 / 1920 * 100vw);
+ left: calc(1540 / 1920 * 100vw);
}
.video1-new-left {
- left: 0;
+ left: 0;
}
.video2-new-left {
- left: 25vw;
+ left: 25vw;
}
.video3-new-left {
- left: 50vw;
+ left: 50vw;
}
.video4-new-left {
- left: 75vw;
+ left: 75vw;
}
.deleteVideo {
- // position: absolute;
- position: fixed;
- width: 60px;
- height: 26px;
- line-height: 26px;
- color: #fff;
- background-color: $bg-color;
- left: calc(1860 / 1920 * 100vw);
- top: calc(710 / 1080 * 100vh);
- cursor: pointer;
- z-index: 100;
+ // position: absolute;
+ position: fixed;
+ width: 60px;
+ height: 26px;
+ line-height: 26px;
+ color: #fff;
+ background-color: $bg-color;
+ left: calc(1860 / 1920 * 100vw);
+ top: calc(710 / 1080 * 100vh);
+ cursor: pointer;
+ z-index: 100;
}
</style>
\ No newline at end of file
--
Gitblit v1.9.3