From 58aeb1b4b7fef38bfbba99231c46d1c6572e8712 Mon Sep 17 00:00:00 2001
From: chenyao <1219716595@qq.com>
Date: Fri, 14 Feb 2025 17:32:28 +0800
Subject: [PATCH] 修改一版
---
src/views/components/ptzControl.vue | 20
src/utils/cesium-tsa.js | 2
src/views/hooks/initPointWayline.ts | 2
index.html | 2
src/api/manage.ts | 7
src/assets/images/me_zx.png | 0
src/views/DronePilotDetails.vue | 424 +++++++++++-----------------------
src/views/hooks/droneFly.ts | 172 +++++++++++--
src/views/DronePilotList.vue | 5
src/views/components/controlConsole.vue | 80 ------
10 files changed, 308 insertions(+), 406 deletions(-)
diff --git a/index.html b/index.html
index 7580a0b..acc49b3 100644
--- a/index.html
+++ b/index.html
@@ -5,7 +5,7 @@
<link rel="icon" href="/favicon.ico">
<!-- <meta name="viewport" content="width=device-width, initial-scale=1.0"> -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
- <title>低空无人机监测app</title>
+ <title>低空无人机监测网移动应用</title>
</head>
<body>
<div id="app"></div>
diff --git a/src/api/manage.ts b/src/api/manage.ts
index dac8251..08ffc1e 100644
--- a/src/api/manage.ts
+++ b/src/api/manage.ts
@@ -118,6 +118,13 @@
return result.data
}
+// 获取两点之间的高度和距离
+export const getTwoPointInfo = async function (workspace_id: String,personLat:Number,personLng:Number,pointLat:Number,pointLng:Number): Promise<IWorkspaceResponse<any>> {
+ const url = `${HTTP_PREFIX_H5}/getPointInfo/${workspace_id}/?personLat=${personLat}&personLng=${personLng}&pointLat=${pointLat}&pointLng=${pointLng}`
+ const result = await request.get(url)
+ return result.data
+}
+
// Get User Info
export const getUserInfo = async function (): Promise<IWorkspaceResponse<any>> {
const url = `${HTTP_PREFIX}/users/current`
diff --git a/src/assets/images/me_zx.png b/src/assets/images/me_zx.png
new file mode 100644
index 0000000..2b2a8eb
--- /dev/null
+++ b/src/assets/images/me_zx.png
Binary files differ
diff --git a/src/utils/cesium-tsa.js b/src/utils/cesium-tsa.js
index dfbae21..98157c1 100644
--- a/src/utils/cesium-tsa.js
+++ b/src/utils/cesium-tsa.js
@@ -178,7 +178,7 @@
navigationHelpButton: false, // 右上角的帮助按钮,
selectionIndicator: false, // 是否显示选择指示器
baseLayer: false,
- fullscreenButton: true,
+ fullscreenButton: false,
})
diff --git a/src/views/DronePilotDetails.vue b/src/views/DronePilotDetails.vue
index 8df2a83..61c0e6f 100644
--- a/src/views/DronePilotDetails.vue
+++ b/src/views/DronePilotDetails.vue
@@ -1,6 +1,5 @@
<template>
<div class="drone-pilot-details" :style="{ width: screenWidth,height: screenHeight}">
- <!-- 横屏模式 -->
<div id="landscapeBox" class="landscape-box" :style="{ width: screenWidth + 'px', height: (screenHeight) + 'px'}">
<div id="videoModule" class="l-video" :style="{ width: screenWidthVideo + 'px', height: (screenHeightVideo) + 'px'}">
<video v-show="videoUrl" ref="videoPlayerBig" :style="{ width: screenWidthVideo + 'px', height: screenHeightVideo + 'px'}" controls autoplay muted playsinline style="text-align: left; object-fit: fill">
@@ -8,12 +7,19 @@
</video>
<el-empty v-show="videoUrl == ''" description="当前设备已关机,无法进行直播" :image="imageUrl"></el-empty>
</div>
- <div class="l-map" :style="{ width: screenWidthMap + 'px', height: (screenHeightMap) + 'px'}">
+ <div class="l-map" :style="{ width: screenWidthVideo + 'px', height: (screenHeightVideo) + 'px'}">
<div id="cesiumContainerBigMap"></div>
<div class="l-zp" id="lZp">
<comPass :cesiumViewe="globalViewer"/>
</div>
<div class="l-zoom" id="lZoom">
+ <div class="zoom">
+ <img src="@/assets/images/me.png" @touchstart="getPhoneLocation(true)" />
+ </div>
+ <div class="zoom" @touchstart="onChangeD">
+ <img v-if="is2d" src="@/assets/images/stand.png" />
+ <img v-else src="@/assets/images/satellite.png" />
+ </div>
<div class="zoom">
<img v-if="!isBigMap" src="@/assets/images/fang.png" @touchstart="changeModelMap" />
<img v-else src="@/assets/images/suo.png" @touchstart="changeModelMap" />
@@ -25,25 +31,6 @@
<controlConsole :sn="sn" :osdVisible="sbInfo" :cesiumViewe="globalViewer" />
</div>
</div>
- <!-- 竖屏 -->
- <!-- <div class="portrait-screen" v-else>
- <div class="l-video" :style="{ width: screenWidth + 'px', height: (screenHeight/2)+40 + 'px'}">
- <video v-show="videoUrl" ref="videoPlayerBig" :style="{ width: screenWidth + 'px', height: (screenHeight/2)+40 + 'px'}" controls autoplay muted playsinline style="text-align: left; object-fit: fill">
- Your browser is too old which doesn't support HTML5 video.
- </video>
- <el-empty v-show="videoUrl == ''" description="当前设备已关机,无法进行直播" :image="imageUrl"></el-empty>
- </div>
- <div class="l-map" :style="{ width: screenWidth + 'px', height: (screenHeight/2)-40 + 'px'}">
- <div id="cesiumContainerMap"></div>
- <div class="l-zp" id="lZp">
- <comPass :cesiumViewe="globalViewer"/>
- </div>
- </div>
- <div class="right-box">
- <ptzControl :sn="sn" :osdVisible="sbInfo" />
- <controlConsole :sn="sn" :osdVisible="sbInfo" />
- </div>
- </div> -->
</div>
</template>
@@ -51,7 +38,7 @@
import { ref, onMounted, onBeforeUnmount, nextTick, reactive, computed, watch } from 'vue';
import { EDeviceTypeName, EHmsLevel } from '@/types/enums'
import { getRoot } from '../../root'
-import { startLivestream, getLiveVideoUrl } from '@/api/manage'
+import { getWaylineFile, getLiveVideoUrl } from '@/api/manage'
import { CURRENT_CONFIG as config } from '@/api/http/config'
// import videojs from 'video.js'
// import 'video.js/dist/video-js.css';
@@ -63,7 +50,6 @@
// import { cesiumOperation } from '@/hooks/use-cesium-tsa'
// const { _init } = cesiumOperation();
import { useMyStore } from '@/store'
-import { getWaylineFile } from '@/api/manage'
import comPass from './components/comPass.vue'
import ptzControl from './components/ptzControl.vue'
import controlConsole from './components/controlConsole.vue'
@@ -79,7 +65,7 @@
import flvjs from 'flv.js';
const { pointWayline } = initPointWayLine()
const { planarWayline } = initPlanarWayline()
-const { initDock } = droneFly()
+const { initDock, getPhoneLocation } = droneFly()
const {
removeAllPoint,
@@ -98,29 +84,21 @@
const screenWidth = ref(window.innerWidth);
const screenHeight = ref(window.innerHeight);
// 地图切换
-const screenWidthMap = ref(window.innerWidth);
-const screenHeightMap = ref((window.innerHeight/2)+40);
+const screenWidthMap = ref((window.innerHeight/2)*2)// ref(window.innerWidth);
+const screenHeightMap = ref((window.innerHeight/2));
// 视频切换
const screenWidthVideo = ref(window.innerWidth);
const screenHeightVideo = ref(window.innerHeight/2);
const isBigMap = ref(false)
-// 更新屏幕尺寸的函数
-const updateScreenSize = () => {
- screenWidth.value = window.innerWidth;
- screenHeight.value = window.innerHeight;
- if (isLandscape.value) { //横屏
- screenWidthMap.value = window.innerWidth/2
- screenHeightMap.value = window.innerHeight
- screenWidthVideo.value = window.innerWidth/2
- screenHeightVideo.value = window.innerHeight
- } else {//竖屏
- screenWidthMap.value = window.innerWidth
- screenHeightMap.value = (window.innerHeight/2)-40
- screenWidthVideo.value = window.innerWidth
- screenHeightVideo.value = (window.innerHeight/2)+40
- }
-};
+// 显示高德地图矢量还是影像(2D/3D)
+let is2d = ref(true)
+
+const onChangeD = () => {
+ is2d.value = !is2d.value
+ store.commit('SET_MAP_SETTING_MODE', is2d.value?2:3);
+ loadLAYER();
+}
const store = useMyStore()
// 获取路由
@@ -140,7 +118,7 @@
// 获取机场/遥控器sn
let localData = ref<any>(window.localStorage.getItem('sbInfo'))
const sbInfo: deviceInfo = JSON.parse(localData.value) as deviceInfo;
-// console.log('哒哒哒', sbInfo)
+
// 无人机sn
const sn = ref<String>(sbInfo.sn)
// 机场sn
@@ -156,8 +134,6 @@
const imageUrl = new URL('@/assets/images/norecord.png', import.meta.url).href
const imageMapSrc = new URL('@/assets/images/mapdock.png', import.meta.url).href
-
-const meMapSrc = new URL('@/assets/images/me.png', import.meta.url).href
const jgbMapSrc = new URL('@/assets/images/jgb.png', import.meta.url).href
@@ -195,6 +171,10 @@
let workspaceId = ref<String>(sbInfo.workspaceId)
localStorage.setItem('bs_workspace_id', workspaceId.value)
// store.commit('SET_SELECTED_WORKSPACE_ID', workspaceId.value);
+
+// 自身定位
+let me_latitude = 0;
+let me_longitude = 0;
// RTCWEB 加载视频
const playBig = () => {
@@ -253,59 +233,8 @@
},
)
}
-// const play = () => {
-// webrtcPlayer = new window.ZLMRTCClient.Endpoint({
-// element: videoPlayer.value, // video 标签
-// debug: true, // 是否打印日志
-// zlmsdpUrl: videoUrl.value, //Rtc地址
-// simulecast: false,
-// useCamera: false,
-// audioEnable: true,
-// videoEnable: true,
-// recvOnly: true,
-// usedatachannel: false,
-// })
-// webrtcPlayer.on(
-// window.ZLMRTCClient.Events.WEBRTC_ICE_CANDIDATE_ERROR,
-// (e) => {
-// // ICE 协商出错
-// console.error('ICE 协商出错')
-// // this.eventcallbacK('ICE ERROR', 'ICE 协商出错')
-// },
-// )
-// webrtcPlayer.on(
-// window.ZLMRTCClient.Events.WEBRTC_ON_REMOTE_STREAMS,
-// (e) => {
-// //获取到了远端流,可以播放
-// console.log('播放成功', e.streams)
-// // this.eventcallbacK('playing', '播放成功')
-// },
-// )
-// webrtcPlayer.on(
-// window.ZLMRTCClient.Events.WEBRTC_OFFER_ANWSER_EXCHANGE_FAILED,
-// (e) => {
-// // offer anwser 交换失败
-// console.error('offer anwser 交换失败', e)
-// // this.eventcallbacK('OFFER ANSWER ERROR ', 'offer anwser 交换失败')
-// if (e.code == -400 && e.msg == '流不存在') {
-// console.log('流不存在')
-// timer = setTimeout(() => {
-// webrtcPlayer.close()
-// play()
-// }, 100)
-// }
-// },
-// )
-
-// webrtcPlayer.on(
-// window.ZLMRTCClient.Events.WEBRTC_ON_LOCAL_STREAM,
-// (s) => {
-// },
-// )
-// }
-const videoUrlFlv = ref<String>('')
// 加载该设备的视频信息
const loadVideo = async () => {
await getLiveVideoUrl(sn.value).then((res) => {
@@ -316,34 +245,10 @@
drawCanvasHeight.value = videoWH.value.offsetHeight;
}
videoUrl.value = res.data.data.rtcs_url
- videoUrlFlv.value = res.data.data.url
// 播放
- // play()
playBig()
- // flv
- // initFlvPlayer()
})
}
-
-// flv
-const videoPlayerFlv = ref(null); // 引用 video 元素
-let flvPlayer = null; // 用于存储 flv.js 播放器实例
- // 初始化 flv.js 播放器
-
-const initFlvPlayer = () => {
- if (flvjs.isSupported()) {
- const videoElement = videoPlayerFlv.value; // 获取 video 元素
- flvPlayer = flvjs.createPlayer({
- type: 'flv', // 视频格式
- url: videoUrlFlv.value, // FLV 视频地址
- });
- flvPlayer.attachMediaElement(videoElement); // 绑定 video 元素
- flvPlayer.load(); // 加载视频
- flvPlayer.play(); // 播放视频
- } else {
- console.error('Your browser does not support flv.js.');
- }
-};
//===============================
@@ -391,69 +296,116 @@
isBigMap.value = !isBigMap.value
const cesiumContainer = document.getElementById('cesiumContainerBigMap');
const lZp = document.getElementById('lZp');
- const lZoom = document.getElementById('lZoom');
-
- if (isBigMap.value) { // 全屏
- cesiumContainer.style.position = 'fixed';
- cesiumContainer.style.top = '0';
- cesiumContainer.style.left = '0';
- cesiumContainer.style.width = '100%';
- cesiumContainer.style.height = '100%';
- lZp.style.right = '40%';
- lZoom.style.left = '0';
- } else { // 缩放
- cesiumContainer.style.position = 'static';
- cesiumContainer.style.width = `${screenWidthMap.value}`
- cesiumContainer.style.height = `${screenHeight.value}`
- lZp.style.right = '16%';
- lZoom.style.left = 'auto';
-
+ // const lZoom = document.getElementById('lZoom');
+ if (isLandscape.value) { // 横屏
+ if (isBigMap.value) { // 全屏
+ cesiumContainer.style.position = 'fixed';
+ cesiumContainer.style.top = '0';
+ cesiumContainer.style.left = '0';
+ cesiumContainer.style.width = `${screenWidthMap.value * 2}px`
+ cesiumContainer.style.height = `${screenHeightMap.value}px`
+ lZp.style.right = '40%';
+ // lZoom.style.left = '0';
+ } else { // 缩放
+ cesiumContainer.style.width = `${screenWidthMap.value}px`
+ cesiumContainer.style.height = `${screenHeightMap.value}px`
+ cesiumContainer.style.position = 'static';
+ lZp.style.right = '16%';
+ // lZoom.style.left = '50%';
+
+ }
+ } else {
+ if (isBigMap.value) { // 全屏
+ cesiumContainer.style.position = 'fixed';
+ cesiumContainer.style.top = '0';
+ cesiumContainer.style.left = '0';
+ cesiumContainer.style.width = `${screenWidthMap.value}px`
+ cesiumContainer.style.height = `${screenHeightMap.value * 2}px`
+ lZp.style.right = '30%';
+ // lZoom.style.right = '0';
+ } else { // 缩放
+ console.log('竖屏宽度',screenWidthMap.value)
+ console.log('竖屏高度度',screenHeightMap.value)
+ cesiumContainer.style.width = `${screenWidthMap.value}px`
+ cesiumContainer.style.height = `${screenHeightMap.value}px`
+ cesiumContainer.style.position = 'static';
+ lZp.style.right = '30%';
+ // lZoom.style.right = '0';
+
+ }
}
}
+// 更新屏幕尺寸的函数
+// const updateScreenSize = () => {
+// const cesiumContainer = document.getElementById('cesiumContainerBigMap');
+// screenWidth.value = window.innerWidth;
+// screenHeight.value = window.innerHeight;
+// console.log('屏幕自身宽度',window.innerWidth)
+// console.log('屏幕自身高度',window.innerHeight)
+// if (isLandscape.value) { //横屏
+// screenWidthMap.value = window.innerWidth/2
+// screenHeightMap.value = window.innerHeight
+// screenWidthVideo.value = window.innerWidth/2
+// screenHeightVideo.value = window.innerHeight
+// cesiumContainer.style.width = `${screenWidthMap.value}px`
+// cesiumContainer.style.height = `${screenHeightMap.value}px`
+// } else {//竖屏
+// screenWidthMap.value = window.innerHeight
+// screenHeightMap.value = (window.innerHeight/2)
+// screenWidthVideo.value = window.innerWidth
+// screenHeightVideo.value = (window.innerHeight/2)
+// // 重新给赋值宽高
+// cesiumContainer.style.width = `${screenWidthMap.value}px`
+// cesiumContainer.style.height = `${screenHeightMap.value}px`
+// console.log('切换竖屏宽度',screenWidthMap.value)
+// console.log('切换竖屏高度度',screenHeightMap.value)
+// }
+
+// };
+
const checkOrientation = async () => {
+ screenWidth.value = window.innerWidth;
+ screenHeight.value = window.innerHeight;
+ console.log('屏幕宽度', screenWidth.value)
+ console.log('屏幕高度', screenHeight.value)
const landscapeBox = document.getElementById('landscapeBox');
- const cesiumContainer = document.getElementById('cesiumContainerBigMap');
+ let cesiumContainer = document.getElementById('cesiumContainerBigMap');
const videoModule = document.getElementById('videoModule');
const lZp = document.getElementById('lZp');
const lZoom = document.getElementById('lZoom');
- // 横屏再加载视频请求
- // destroyViewer()
-
- // loadVideo()
- if (window.innerWidth > window.innerHeight) {
+
+ if (window.innerWidth > window.innerHeight) {//横屏
+ screenWidthVideo.value = window.innerWidth/2
+ screenHeightVideo.value = window.innerHeight
isLandscape.value = true;
- updateScreenSize()
+ // updateScreenSize()
landscapeBox.style.display = 'flex';
lZp.style.right = '16%';
- lZoom.style.display = 'block';
lZoom.style.position = 'fixed';
- // await nextTick();
- // await _init('cesiumContainerBigMap');
- // await getWrjSsLx();
- } else {
+ cesiumContainer.style.width = `${screenWidth.value/2}px`
+ cesiumContainer.style.height = `${screenHeight.value}px`
+ } else { //竖屏
isLandscape.value = false;
- updateScreenSize()
+ screenWidthVideo.value = window.innerWidth
+ screenHeightVideo.value = (window.innerHeight/2)
+ // updateScreenSize()
landscapeBox.style.display = 'inherit';
- lZp.style.right = '28%';
- lZoom.style.display = 'none';
- // landscapeBox.style.width = `${screenWidth}`
- // landscapeBox.style.height = `${screenHeight}`
- // videoModule.style.width = `${screenWidth}`
- // videoModule.style.height = `${screenHeight}`
- // await nextTick();
- // await _init('cesiumContainerMap');
- // await getWrjSsLx();
+ landscapeBox.style.overflow = 'hidden';
+ lZp.style.right = '32%';
+ cesiumContainer.style.width = `${screenHeight.value}px`
+ cesiumContainer.style.height = `${screenHeight.value/2}px`
}
};
// 获取实时航线
const getWrjSsLx = () => {
+ if (window.cesiumViewer== null) return
+ globalViewer = window.cesiumViewer;
getWaylineFile(sbInfo.sn).then((res:any) => {
if (res.code != 200) return
- console.log('草草草草', res.data)
ssLinePath.value = res.data
- globalViewer = window.cesiumViewer
+ // globalViewer = window.cesiumViewer
// 先有航线,再飞行
generateCourse()
})
@@ -485,7 +437,7 @@
scale: 1.0,
}
})
- window.cesiumViewer.scene.camera.setView({
+ window.cesiumViewer.scene.camera.setView({
destination: globalCesium.Cartesian3.fromDegrees(
Number(longitude),
Number(latitude),
@@ -522,21 +474,24 @@
watch(() => store.state.wsMessage, (newValue, oldValue) => {
// 控制台报 Expected longitude to be typeof number, actual typeof was undefined 是因为这里没有及时拿到longitude数据
- viewDroneInfo.longitude = newValue?.longitude
- viewDroneInfo.latitude = newValue?.latitude
- viewDroneInfo.elevation = Number(newValue?.elevation.toFixed(2)) + droneHeight.value
+ if (newValue) {
+ viewDroneInfo.longitude = newValue?.longitude
+ viewDroneInfo.latitude = newValue?.latitude
+ viewDroneInfo.elevation = Number(newValue?.elevation.toFixed(2)) + droneHeight.value
+ }
}, {deep: true})
// 生成航线轨迹
const generateCourse = async () => {
+ // ssLinePath.value = 'https://wrj.shuixiongit.com/minio/cloud-bucket/wayline/20250211/wayline_1739254562374.kmz'
if (!ssLinePath.value) return
const { fileInfoObj } = await analyzeKmzFile(`${ssLinePath.value}?_t=${new Date().getTime()}`)
const xmlStr = await fileInfoObj['wpmz/template.kml']
const xmlJson = XMLToJSON(xmlStr)?.['Document']
const placemark = xmlJson.Folder.Placemark
- console.log('看看航线值', placemark.Polygon)
+ console.log('看看航线值', sbInfo)
if (placemark?.Polygon) {
// return 'planar'
planarWayline(ssLinePath.value, sbInfo.longitude, sbInfo.latitude)
@@ -546,57 +501,7 @@
}
}
-const me_latitude = ref(0);
-const me_longitude = ref(0);
-// const loading = ref(true);
-// const error = ref(null);
-// 获取自身定位
-const getLocation = () => {
- if (window.cesiumViewer == null) return
- if (navigator.geolocation) {
- navigator.geolocation.getCurrentPosition(
- (position) => {
- console.log('333',position.coords.latitude)
- console.log('333',position.coords.longitude)
- me_latitude.value = position.coords.latitude;
- me_longitude.value = position.coords.longitude;
- // loading.value = false;
- // 开始给自己定位
- getLnglatAltitude(me_longitude.value, me_latitude.value, window.cesiumViewer).then(res => {
- removeById('me_coordinate')
- window.cesiumViewer.entities.add({
- position: globalCesium.Cartesian3.fromDegrees(
- me_longitude.value,
- me_latitude.value,
- res.height,
- ),
- id: 'me_coordinate',
- billboard: {
- image: meMapSrc,
- outlineWidth: 0,
- width: 36,
- height: 36,
- scale: 1.0,
- }
- })
- // window.cesiumViewer.scene.camera.setView({
- // destination: globalCesium.Cartesian3.fromDegrees(
- // Number(me_longitude),
- // Number(me_latitude),
- // 10000.0,
- // ),
- // })
- // droneHeight.value = res.height
- })
- },
- (err) => {
- console.log('定位有误')
- }
- );
- } else {
- console.log('您的浏览器不支持地理定位')
- }
-};
+let intervalId = null;
onMounted(async () => {
window.addEventListener('orientationchange', checkOrientation);
@@ -606,9 +511,13 @@
await nextTick();
await _init('cesiumContainerBigMap');
await getWrjSsLx();
-
- await getLocation()
-
+ // 判断是遥控器还是机场
+ let domain = sessionStorage.getItem('domain')
+ if (domain !== '0') {
+ await getPhoneLocation(false,workspaceId.value)
+ // // // 设置定时器,每隔 5 秒刷新一次数据
+ intervalId = setInterval(getPhoneLocation, 5000);
+ }
});
onBeforeUnmount(() => {
@@ -617,12 +526,9 @@
if (player) {
player.dispose();
}
- if (flvPlayer) {
- flvPlayer.pause(); // 暂停播放
- flvPlayer.unload(); // 卸载视频
- flvPlayer.detachMediaElement(); // 解绑 video 元素
- flvPlayer.destroy(); // 销毁播放器
- flvPlayer = null;
+ // 组件卸载时清除定时器
+ if (intervalId) {
+ clearInterval(intervalId);
}
});
@@ -633,8 +539,9 @@
<style lang="scss" scoped>
.drone-pilot-details {
.landscape-box {
- position: relative;
- display: flex;
+ overflow: hidden;
+ // position: relative;
+ // display: flex;
.l-map {
.l-zp {
position: fixed;
@@ -644,9 +551,11 @@
.l-zoom {
position: fixed;
bottom: 0;
+ right: 0;
.zoom {
width: 2rem;
height: 2rem;
+ margin: 0.2rem 0.4rem;
border-radius: 3px;
background-color: rgba(0, 0, 0, 0.8);
display: flex;
@@ -680,6 +589,8 @@
#cesiumContainerBigMap {
width: 100%;
height: 100%;
+ margin: 0;
+ padding: 0;
overflow: hidden;
:deep() {
@@ -704,61 +615,6 @@
}
}
}
- #cesiumContainerMap {
- width: 100%;
- height: 100%;
- overflow: hidden;
-
- :deep() {
- .cesium-viewer {
- width: 100%;
- height: 100%;
-
- .cesium-viewer-cesiumWidgetContainer {
- width: 100%;
- height: 100%;
-
- .cesium-widget {
- width: 100%;
- height: 100%;
-
- canvas {
- width: 100%;
- height: 100%;
- }
- }
- }
- }
- }
- }
- .portrait-screen {
- .l-map {
- .l-zp {
- position: fixed;
- right: 28%;
- bottom: 0;
- }
- .l-zoom {
- position: fixed;
- bottom: 0;
- .zoom {
- width: 2rem;
- height: 2rem;
- border-radius: 3px;
- background-color: rgba(0, 0, 0, 0.8);
- display: flex;
- align-items: center;
- justify-content: center;
- overflow: hidden;
- cursor: pointer;
- pointer-events: all;
- img {
- width: 1.6rem;
- height: 1.6rem;
- }
- }
- }
- }
- }
+ .right-box {}
}
</style>
\ No newline at end of file
diff --git a/src/views/DronePilotList.vue b/src/views/DronePilotList.vue
index b1f0a92..f677d5a 100644
--- a/src/views/DronePilotList.vue
+++ b/src/views/DronePilotList.vue
@@ -57,7 +57,7 @@
// 存储设备值
let osdVisible = reactive<any>({})
-const vConsole = new VConsole();
+// const vConsole = new VConsole();
// 点击信息详情
const infoClick = (data:any) => {
@@ -75,6 +75,9 @@
osdVisible.device_domain = data.children.domain || 0
osdVisible.device_sub_type = data.children.sub_type || 1
osdVisible.device_type = data.children.type || 0
+ // osdVisible.domain = data.children.domain || 0
+ // 前端自己加的判断
+ window.sessionStorage.setItem('domain', JSON.stringify(droneOrPilotTxt.value == 'drone'? 0 : 2));
store.commit('SET_OSD_VISIBLE_INFO', osdVisible)
// 跳转操作屏幕
root.$router.push({ path:ERouterName.DRONEPILOTDETAILS })
diff --git a/src/views/components/controlConsole.vue b/src/views/components/controlConsole.vue
index 7dbf1a0..ca5f142 100644
--- a/src/views/components/controlConsole.vue
+++ b/src/views/components/controlConsole.vue
@@ -29,84 +29,6 @@
</div>
</template>
</el-dialog>
- <!-- <div class="DroneOperation">
- <div class="center">
- <div class="center_left">
- <div class="tubiaoshow">
- <el-tooltip effect="dark" content="控制开关" placement="top">
- <img ref="controllerRef" v-show="!isShowKzBtn" src="@/assets/images/notTurnoffcontrol.png" @click="authenticationPwd(1, '开')" />
- <img ref="controllerRef" v-show="isShowKzBtn" src="@/assets/images/Turnoffcontrol.png" @click="authenticationPwd(1, '关')" />
- </el-tooltip>
- </div>
- <p class="Airplanemode">
- <span>飞行模式:</span>
- <span ref="flightModeRef">{{ flightMode }}</span>
- </p>
- <p class="operatingjixufanhang">
- <el-button size="mini" @click="!nowInReturnStatus ? onBackDock() : notonBackDock()">
- {{ !nowInReturnStatus ? '返航' : '取消返航' }}
- </el-button>
- <el-button size="mini" @click="authenticationPwd(2, '关')">继续任务</el-button>
- </p>
- </div>
- <div class="center_center">
- <div class="top">
- <div class="Q">
- <img src="/public/images/turnleft-drone.png" class="img" />
- <el-button type="info" size="mini" @click="handlePublish({ w: -W_SPEED })">Q</el-button>
- </div>
- <div class="W">
- <img src="/public/images/up-drone.png" class="img" />
- <el-button type="info" size="mini" @click="handlePublish({ x: SPEED })">W</el-button>
- </div>
- <div class="E">
- <img src="/public/images/turnright-drone.png" class="img"/>
- <el-button type="info" size="mini" @click="handlePublish({ w: W_SPEED })">E</el-button>
- </div>
- </div>
- <div class="bottom">
- <div class="A">
- <el-button type="info" size="mini" @click="handlePublish({ y: -SPEED })">A</el-button>
- <img src="/public/images/left-drone.png"/>
- </div>
- <div class="S">
- <el-button type="info" size="mini" @click="handlePublish({ x: -SPEED })">S</el-button>
- <img src="/public/images/down-drone.png"/>
- </div>
- <div class="D">
- <el-button type="info" size="mini" @click="handlePublish({ y: SPEED })">D</el-button>
- <img src="/public/images/right-drone.png"/>
- </div>
- </div>
- </div>
- <div class="speed">
- <div class="speed-content">
- <div class="add-speed--button" @click="onControlsDroneSpeed(true)">
- <i class="el-icon-plus"></i>
- </div>
- <div class="speed-text">
- <div>{{ droneSeepd }}</div>
- <div>m/s</div>
- </div>
- <div class="sub-speed--button" @click="onControlsDroneSpeed(false)">
- <i class="el-icon-minus"></i>
- </div>
- </div>
- </div>
- </div>
- <div class="right">
- <div class="rightbutton">
- <div class="top">
- <img src="/public/images/zbottom-drone.png"/>
- <el-button size="mini" @click="handlePublish({ h: HEIGHT })">C</el-button>
- </div>
- <div class="bottom">
- <el-button size="mini" @click="handlePublish({ h: -HEIGHT })">Z</el-button>
- <img src="/public/images/ctop-drone.png"/>
- </div>
- </div>
- </div>
- </div> -->
</div>
</template>
@@ -285,7 +207,7 @@
.control {
position: fixed;
top: 0.2rem;
- right: 0.2rem;
+ left: 0.2rem;
width: 2rem;
height: 2rem;
border-radius: 3px;
diff --git a/src/views/components/ptzControl.vue b/src/views/components/ptzControl.vue
index 460f3f8..68f83ae 100644
--- a/src/views/components/ptzControl.vue
+++ b/src/views/components/ptzControl.vue
@@ -19,10 +19,10 @@
<div class="btn-item" @touchstart="onZoom(false)">
<img src="@/assets/images/suoxiao.png" />
</div>
- <div class="btn-item" @touchstart="onChangeD">
+ <!-- <div class="btn-item" @touchstart="onChangeD">
<img v-if="is2d" src="@/assets/images/stand.png" />
<img v-else src="@/assets/images/satellite.png" />
- </div>
+ </div> -->
</div>
<div class="circle-box" v-show="isPtz">
<div class="top" @click="ytClick('up')" @mousedown="onMouseDown(KeyCode.ARROW_UP)" @mouseup="onMouseUp"
@@ -102,7 +102,7 @@
let isPtz = ref(false)
// 显示高德地图矢量还是影像(2D/3D)
-let is2d = ref(true)
+// let is2d = ref(true)
let yaw_speed = ref((payloadCameraMode.value == 'wide'? 1 : Math.ceil(zoom_factor.value))*10) // 云台横向角度
let pitch_speed = ref((payloadCameraMode.value == 'wide'? 1 : Math.ceil(zoom_factor.value))*10) // 云台纵向角度
@@ -346,11 +346,11 @@
})
}
-const onChangeD = () => {
- is2d.value = !is2d.value
- store.commit('SET_MAP_SETTING_MODE', is2d.value?2:3);
- loadLAYER();
-}
+// const onChangeD = () => {
+// is2d.value = !is2d.value
+// store.commit('SET_MAP_SETTING_MODE', is2d.value?2:3);
+// loadLAYER();
+// }
// 重置云台角度
const onResetGimbal = async (resetMode:any) => {
@@ -401,7 +401,7 @@
.ptz {
position: fixed;
top: 3rem;
- right: 0.2rem;
+ left: 0.2rem;
width: 2rem;
height: 2rem;
border-radius: 3px;
@@ -425,7 +425,7 @@
.btn-group {
position: fixed;
top: 5.8rem;
- right: 4px;
+ left: 0.2rem;
// padding: 4px;
.btn-item {
width: 2rem;
diff --git a/src/views/hooks/droneFly.ts b/src/views/hooks/droneFly.ts
index d0391ab..e862907 100644
--- a/src/views/hooks/droneFly.ts
+++ b/src/views/hooks/droneFly.ts
@@ -5,6 +5,7 @@
import IndexedDBService from '@/utils/indexDB'
import CreateFrustum from '@/utils/cesium/frustum/CreateFrustum'
import { useMyStore } from '@/store'
+import { getTwoPointInfo } from '@/api/manage'
const { getEntityById, removeById, globalCesium, addLeftClickEvent, removeLeftClickEvent, flyTo } = cesiumOperation()
// 无人机实体
@@ -12,6 +13,10 @@
// 激光实体
let laserEntity = null
+
+// 两点之间线实体
+let twoLineEntity = null
+let myAppEntity = null;
export function droneFly () {
const store = useMyStore()
let deviceInfo = {} // 无人机信息
@@ -30,6 +35,16 @@
let lastTime = null
let viewInfoFrustum = null
+ // 手机设备定位
+ let me_latitude = 0;
+ let me_longitude = 0;
+ let me_altitude = 0;
+ // 扫射定位
+ let measure_target_longitude = 0;
+ let measure_target_latitude = 0;
+ let measure_target_altitude = 0;
+
+
async function initDock(data:any, sn:any, dockSn:any, workspaceId:any, ssLinePath:any, viewDroneInfo:any) {
// 获取workspaceId
wId = workspaceId
@@ -38,7 +53,7 @@
// 机场信息
dockInfo = data.dockInfo[`${dockSn}`]
viewDroneInfo = viewDroneInfo
- console.log('打印我想看的',viewDroneInfo.longitude)
+ console.log('导致地图不显示原因1',viewDroneInfo.longitude)
// 当前飞行任务创建时间
if (data.currentType === EDeviceTypeName.Aircraft && deviceInfo) {
const droneLngLat = {
@@ -64,16 +79,12 @@
dockInfo,
ssLinePath
)
- addFlyLaser(
- viewDroneInfo.longitude,
- viewDroneInfo.latitude,
- deviceInfo.height,
- deviceInfo.payloads[0],
- deviceInfo.attitude_head,
- deviceInfo,
- dockInfo,
- ssLinePath
- )
+ let domain = sessionStorage.getItem('domain')
+ if (domain !== '0') {
+ addFlyLaser(
+ deviceInfo.payloads[0]
+ )
+ }
setelCamera(
viewDroneInfo.longitude,
viewDroneInfo.latitude,
@@ -95,7 +106,6 @@
} else {
if (deviceInfo.mode_code && [3, 4, 5, 9, 10].includes(deviceInfo.mode_code)) {
initCreateFrustum(deviceInfo, viewDroneInfo)
- console.log('4444', viewDroneInfo.longitude)
addFlyGltf(
viewDroneInfo.longitude,
viewDroneInfo.latitude,
@@ -106,16 +116,12 @@
dockInfo,
ssLinePath
)
- addFlyLaser(
- viewDroneInfo.longitude,
- viewDroneInfo.latitude,
- deviceInfo.height,
- deviceInfo.payloads[0],
- deviceInfo.attitude_head,
- deviceInfo,
- dockInfo,
- ssLinePath
- )
+ let domain = sessionStorage.getItem('domain')
+ if (domain !== '0') {
+ addFlyLaser(
+ deviceInfo.payloads[0]
+ )
+ }
}
}
const imgRightBlue = new URL('@/assets/images/arrow-right-pink.png', import.meta.url).href
@@ -188,18 +194,24 @@
const imgLaser = new URL('@/assets/images/laser.png', import.meta.url).href
// 增加激光扫射点
- function addFlyLaser(lng:any, lat:any, alt:any, payloads:any, attitude_head:any, deviceInfo:any, dockInfo:any, ssLinePath:any) {
- console.log('哒哒哒', payloads)
+ function addFlyLaser(payloads:any) {
+ const startPosition = globalCesium.Cartesian3.fromDegrees(
+ me_longitude, me_latitude, 0
+ )
const position = globalCesium.Cartesian3.fromDegrees(
payloads.measure_target_longitude, payloads.measure_target_latitude, payloads.measure_target_altitude
)
+ measure_target_longitude = payloads.measure_target_longitude;
+ measure_target_latitude = payloads.measure_target_latitude;
+ measure_target_altitude = payloads.measure_target_altitude;
+
if (laserEntity && laserEntity != null) {
laserEntity.position = new globalCesium.CallbackProperty(function () {
return position
}, false)
- laserEntity.orientation = new globalCesium.CallbackProperty(function () {
- return orientation
- }, false)
+ // laserEntity.orientation = new globalCesium.CallbackProperty(function () {
+ // return orientation
+ // }, false)
laserEntity.show = true
@@ -217,6 +229,20 @@
}
})
}
+ removeById('route_two_line')
+ twoLineEntity = window.cesiumViewer.entities.add({
+ id: 'route_two_line',
+ polyline: {
+ positions: new globalCesium.CallbackProperty(() => [startPosition, position], false),
+ width: 5,
+ material: new globalCesium.PolylineDashMaterialProperty({
+ color: globalCesium.Color.YELLOW, // 虚线颜色
+ dashLength: 6.0, // 虚线段的长度
+ }),
+ zIndex: 1,
+ clampToGround: false,
+ }
+ })
// 增加激光扫射信息
laserEntity.label = new globalCesium.LabelGraphics({
text: `目标海拔:${Math.ceil(payloads.measure_target_altitude)}m\n测距距离:${Math.round(
@@ -286,7 +312,6 @@
async function createDroneEntityLabel (entity:any, deviceInfo:any, dockInfo:any, ssLinePath:any) {
deviceInfo = deviceInfo
if (currentTaskCreateTime === null) return
- console.log('77777', deviceInfo?.basic_osd?.longitude)
if (!deviceInfo?.longitude && !deviceInfo?.latitude) return
if (deviceInfo.mode_code !== 5) {
currentTaskCreateTime = null
@@ -538,7 +563,96 @@
heading: attitude_head,
})
}
+
+ // 获取手机定位和激光发射定位的高度和距离
+ function getTwoHeightWidth(workspaceId:String) {
+ getTwoPointInfo(workspaceId,me_latitude,me_longitude,measure_target_latitude,measure_target_longitude).then((res:any) => {
+ const heightDifference = res.data.heightDifference
+ const distance = res.data.distance
+ // 增加激光扫射信息
+ myAppEntity.label = new globalCesium.LabelGraphics({
+ text: `高度:${Math.ceil(heightDifference)}m\n距离:${Math.round(
+ Math.ceil(distance),
+ )}m`,
+ font: '13px monospace',
+ showBackground: true,
+ horizontalOrigin: globalCesium.HorizontalOrigin.CENTER,
+ verticalOrigin: globalCesium.VerticalOrigin.BOTTOM,
+ disableDepthTestDistance: Number.POSITIVE_INFINITY,
+ pixelOffset: new globalCesium.Cartesian2(0, -40),
+ show: true,
+ })
+ })
+ }
+
+ const meMapSrc = new URL('@/assets/images/me.png', import.meta.url).href
+ // 获取手机设备定位
+ function getPhoneLocation(value:Boolean, workspaceId:String) {
+ if (window.cesiumViewer == null) return
+ // 创建一个箭头实体
+ removeById('me_dw')
+ myAppEntity = window.cesiumViewer.entities.add({
+ id: 'me_dw',
+ position: globalCesium.Cartesian3.fromDegrees(0, 0, 0), // 初始位置
+ billboard: {
+ image: meMapSrc, // 箭头图片路径
+ width: 30,
+ height: 30,
+ alignedAxis: globalCesium.Cartesian3.UNIT_Z, // 对齐轴
+ },
+ // orientation: new globalCesium.CallbackProperty(() => {
+ // return globalCesium.Transforms.headingPitchRollQuaternion(
+ // myAppEntity.position.getValue(window.cesiumViewer.clock.currentTime),
+ // new globalCesium.HeadingPitchRoll(heading, 0, 0) // 设置朝向
+ // );
+ // }, false),
+ });
+
+ let heading = 0; // 初始朝向
+ // 获取设备朝向
+ // if (window.DeviceOrientationEvent) {
+ // window.addEventListener('deviceorientation', (event) => {
+ // if (event.alpha !== null) {
+ // heading = globalCesium.Math.toRadians(event.alpha); // 将 alpha 转换为弧度
+ // }
+ // });
+ // } else {
+ // console.log('手机不支持.');
+ // }
+
+ // 获取设备位置
+ if (navigator.geolocation) {
+ navigator.geolocation.watchPosition((position) => {
+ me_longitude = position.coords.longitude;
+ me_latitude = position.coords.latitude;
+ me_altitude = position.coords.altitude || 0;
+
+ // 更新箭头实体的位置
+ myAppEntity.position = globalCesium.Cartesian3.fromDegrees(me_longitude, me_latitude, me_altitude);
+ if (value) {
+ // 将相机定位到设备位置 只有点击图标才可以执行这里
+ window.cesiumViewer.camera.setView({
+ destination: globalCesium.Cartesian3.fromDegrees(me_longitude, me_latitude, me_altitude + 1000), // 相机高度
+ // orientation: {
+ // heading: heading, // 相机朝向
+ // pitch: globalCesium.Math.toRadians(-90), // 俯视角度
+ // roll: 0,
+ // },
+ });
+ }
+ // 查看两条线直接距离和高度
+ // getTwoHeightWidth(workspaceId)
+ }, (error) => {
+ console.error('定位有误:', error);
+ });
+ } else {
+ console.log('手机不支持.');
+ }
+ }
+
+
return {
- initDock
+ initDock,
+ getPhoneLocation,
}
}
\ No newline at end of file
diff --git a/src/views/hooks/initPointWayline.ts b/src/views/hooks/initPointWayline.ts
index 2773164..797ae9c 100644
--- a/src/views/hooks/initPointWayline.ts
+++ b/src/views/hooks/initPointWayline.ts
@@ -58,6 +58,7 @@
}
// 绘制航线到地图上
function drawWayline (xmlJson:any, route:any) {
+ console.log('航线绘制到地图上',xmlJson)
const points = xmlJson?.['Folder']?.['Placemark']
//每个点数据
let waylinePosition = reactive([])
@@ -102,7 +103,6 @@
dornePoint.longitude,
dornePoint.latitude,
)
- console.log('看看值', waylinePosition[index])
if (getLongOk < 20) {
setting = {
id: 'route_point_' + index,
--
Gitblit v1.9.3