From 2800fa4f32f3900509cb4d6eefaf2bfaf54efdd7 Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Mon, 21 Apr 2025 18:29:09 +0800
Subject: [PATCH] fix: 天气显示
---
src/hooks/useTaskWayline/useTaskWayline.js | 161 +++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 124 insertions(+), 37 deletions(-)
diff --git a/src/hooks/useTaskWayline/useTaskWayline.js b/src/hooks/useTaskWayline/useTaskWayline.js
index df11f81..bd9214d 100644
--- a/src/hooks/useTaskWayline/useTaskWayline.js
+++ b/src/hooks/useTaskWayline/useTaskWayline.js
@@ -2,7 +2,7 @@
* @Author: shuishen 1109946754@qq.com
* @Date: 2025-04-19 14:24:34
* @LastEditors: shuishen 1109946754@qq.com
- * @LastEditTime: 2025-04-19 19:00:36
+ * @LastEditTime: 2025-04-20 17:53:08
* @FilePath: \command-center-dashboard\src\hooks\useTaskWayline\useTaskWayline.js
* @Description:
*
@@ -24,6 +24,18 @@
export function useTaskWayline () {
let viewer = null
let deviceOsdInfo = null
+ let flighttaskProgressInfo = null
+
+ // watch
+ let taskWatch = null
+ let flighttaskWatch = null
+ let deviceWatch = null
+
+ // 航线位置
+ let currentWaylinePostions = []
+ // 当前航点 下标
+ let currentWaypointIndex = null
+ let droneSpeedArr = []
// 解析kmz文件
const parsingFiles = async url => {
@@ -32,13 +44,13 @@
const waylinesXMLJSON = XMLToJSON(waylinesXML)?.['Document']
const waylinesXMLObj = removeTextKey(waylinesXMLJSON.Folder)
if (!waylinesXMLObj.Placemark.length) return
- const allPoint = waylinesXMLObj.Placemark.map(item => item.Point.coordinates.split(','))
- flyVisual(allPoint, viewer)
+ // const allPoint = waylinesXMLObj.Placemark.map(item => item.Point.coordinates.split(','))
+ // flyVisual(allPoint, viewer)
drawWayline(waylinesXMLObj)
}
const drawWayline = lineObj => {
- const positions = lineObj.Placemark.map(item => {
+ currentWaylinePostions = lineObj.Placemark.map(item => {
const [lon, lat] = item.Point.coordinates.split(',')
return Cartesian3.fromDegrees(Number(lon), Number(lat))
})
@@ -48,7 +60,7 @@
// 起点
viewer.entities.add({
id: 'drone-job-wayline-start',
- position: positions[0],
+ position: currentWaylinePostions[0],
billboard: {
image: new Cesium.ConstantProperty(rwqfdImg),
width: 70,
@@ -59,7 +71,7 @@
// 终点
viewer.entities.add({
id: 'drone-job-wayline-end',
- position: positions[positions.length - 1],
+ position: currentWaylinePostions[currentWaylinePostions.length - 1],
billboard: {
image: new Cesium.ConstantProperty(endPointImg),
width: 30,
@@ -69,11 +81,11 @@
})
// 路径线
- viewer.entities.add({
+ let polylineEntity = viewer.entities.add({
id: 'drone-job-wayline-polyline',
polyline: {
width: 4,
- positions: positions,
+ positions: currentWaylinePostions,
material: new ImageTrailMaterial({
color: { alpha: 1, blue: 1, green: 1, red: 1 },
speed: 20,
@@ -83,10 +95,12 @@
clampToGround: false,
},
})
+
+ viewer.flyTo(polylineEntity, {
+ offset: new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-60), 0),
+ duration: 0.5,
+ })
}
-
-
-
let viewInfoFrustum
// 设置视椎
@@ -119,12 +133,91 @@
const aircraftEntity = viewer?.entities.getById('aircraftGltf')
const position = Cesium.Cartesian3.fromDegrees(host?.longitude, host?.latitude, host?.height)
+
if (aircraftEntity) {
aircraftEntity.position = new Cesium.ConstantPositionProperty(position)
+
+ const homeDistance = Math.floor(host?.home_distance) || 0
+
+ // 距离下一个航点
+ const nextPoint = currentWaylinePostions[currentWaypointIndex]
+
+ if (!nextPoint) {
+ aircraftEntity.label = {}
+ return
+ }
+
+ const devicePosition = Cesium.Cartesian3.fromDegrees(
+ Number(host.longitude),
+ Number(host.latitude),
+ 0,
+ )
+
+ // 距离下个点位的距离
+ let distance = Cesium.Cartesian3.distance(
+ devicePosition,
+ nextPoint,
+ )
+
+ // 本次航线平面里程
+ let totalDistance = 0
+ currentWaylinePostions.map((cartesian3, index) => {
+ // 两点之间的距离
+ let deviceCurPosition = null
+ if (index === 0) {
+ deviceCurPosition = devicePosition
+ } else {
+ deviceCurPosition = currentWaylinePostions[index - 1]
+ }
+
+ let distance = Cesium.Cartesian3.distance(
+ deviceCurPosition,
+ cartesian3,
+ )
+ totalDistance += distance
+ return Math.round(distance)
+ })
+
+ // 速度
+ let horizontalSpeed = host.horizontal_speed || 0
+ if (
+ !droneSpeedArr.includes(horizontalSpeed) &&
+ horizontalSpeed > 1
+ ) {
+ droneSpeedArr.push(horizontalSpeed)
+ }
+ if (horizontalSpeed < 5) {
+ horizontalSpeed = 10
+ }
+
+ // 预计到达下一个航点时间
+ let arrivalTime = distance / horizontalSpeed
+ if (arrivalTime === Infinity || isNaN(arrivalTime)) {
+ arrivalTime = 0
+ }
+ if (arrivalTime > 60) {
+ const minute = Math.floor(arrivalTime / 60)
+ const second = Math.round(arrivalTime % 60)
+ arrivalTime = `${minute}m${second}s`
+ } else {
+ arrivalTime = Math.round(arrivalTime) + 's'
+ }
+
+ aircraftEntity.label = new Cesium.LabelGraphics({
+ text: `距离机场水平距离:${homeDistance}m\n距离下一个航点:${Math.round(distance)}m\n预计到达下一航点时间:${arrivalTime}\n本次航线平面里程:${Math.round(totalDistance)}m`,
+ font: '13px monospace',
+ showBackground: true,
+ horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
+ verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
+ disableDepthTestDistance: Number.POSITIVE_INFINITY,
+ pixelOffset: new Cesium.Cartesian2(0, -40),
+ show: true,
+ })
+
return
}
- let entity = viewer?.entities.add({
+ viewer?.entities.add({
id: 'aircraftGltf',
position,
label: {},
@@ -134,27 +227,6 @@
minimumPixelSize: 64, // 最小像素尺寸(保证模型远处可见)
maximumScale: 128, // 最大缩放(可选)
},
- })
-
- const homeDistance = Math.floor(host?.home_distance) || 0
- const distance = 1
- const arrivalTime = 1
- const totalDistance = 1
- const usedTime = 1
-
- entity.label = new Cesium.LabelGraphics({
- text: `距离机场水平距离:${homeDistance}m\n距离下一个航点:${Math.round(
- distance,
- )}m\n预计到达下一航点时间:${arrivalTime}\n本次飞行时间:${usedTime}\n本次航线平面里程:${Math.round(
- totalDistance,
- )}m`,
- font: '13px monospace',
- showBackground: true,
- horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
- verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
- disableDepthTestDistance: Number.POSITIVE_INFINITY,
- pixelOffset: new Cesium.Cartesian2(0, -40),
- show: true,
})
}
@@ -172,13 +244,20 @@
})
}
- const init = (v, wsInfo, taskDetails) => {
- console.log(v, wsInfo, taskDetails)
+ const removeWatchs = () => {
+ taskWatch?.()
+ flighttaskWatch?.()
+ deviceWatch?.()
+ }
+ const init = (v, wsInfo, taskDetails) => {
viewer = v
deviceOsdInfo = computed(() => wsInfo.value?.device_osd)
+ flighttaskProgressInfo = computed(() => wsInfo.value?.flighttask_progress)
- watch(taskDetails,
+ removeWatchs()
+
+ taskWatch = watch(taskDetails,
() => {
if (taskDetails.value?.way_lines?.length) {
parsingFiles(taskDetails.value.way_lines[0].url)
@@ -187,7 +266,13 @@
{ immediate: true }
)
- watch(deviceOsdInfo, () => {
+ flighttaskWatch = watch(flighttaskProgressInfo, async () => {
+ const output = flighttaskProgressInfo.value?.data?.output
+
+ currentWaypointIndex = output.ext['current_waypoint_index']
+ })
+
+ deviceWatch = watch(deviceOsdInfo, () => {
const host = deviceOsdInfo.value?.data?.host
if (!host) return
@@ -206,6 +291,8 @@
onBeforeUnmount(() => {
mapEntityRemove()
removeEntitys()
+
+ removeWatchs()
})
return {
--
Gitblit v1.9.3