From cf95f7829bc0026b931f233f32358f156cde4313 Mon Sep 17 00:00:00 2001
From: 张含笑 <zhx18749296735@163.com>
Date: Sat, 19 Apr 2025 15:39:22 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/hooks/useTaskWayline/useTaskWayline.js |  103 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 103 insertions(+), 0 deletions(-)

diff --git a/src/hooks/useTaskWayline/useTaskWayline.js b/src/hooks/useTaskWayline/useTaskWayline.js
new file mode 100644
index 0000000..200de38
--- /dev/null
+++ b/src/hooks/useTaskWayline/useTaskWayline.js
@@ -0,0 +1,103 @@
+/*
+ * @Author: shuishen 1109946754@qq.com
+ * @Date: 2025-04-19 14:24:34
+ * @LastEditors: shuishen 1109946754@qq.com
+ * @LastEditTime: 2025-04-19 15:23:57
+ * @FilePath: \command-center-dashboard\src\hooks\useTaskWayline\useTaskWayline.js
+ * @Description: 
+ * 
+ * Copyright (c) 2025 by shuishen, All Rights Reserved. 
+ */
+import lineImg from '@/assets/images/arrow-right-blue.png'
+import rwqfdImg from '@/assets/images/signMachineNest/rwqfd.png'
+import endPointImg from '@/assets/images/EndPointicon.png'
+
+import { analyzeKmzFile, removeTextKey, XMLToJSON } from '@/utils/cesium/kmz'
+import { flyVisual } from '@/utils/cesium/mapUtil'
+import ImageTrailMaterial from '@/utils/cesium/ImageTrailMaterial'
+
+import * as Cesium from 'cesium'
+import { Cartesian3 } from 'cesium'
+
+export function useTaskWayline (viewer, taskDetails) {
+  const newViewer = unref(viewer)
+
+  // 解析kmz文件
+  const parsingFiles = async url => {
+    const res = await analyzeKmzFile(`${url}?_t=${new Date().getTime()}`)
+    const waylinesXML = await res.fileInfoObj['wpmz/waylines.wpml']
+    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, newViewer)
+    drawWayline(waylinesXMLObj)
+  }
+
+  const drawWayline = lineObj => {
+    const positions = lineObj.Placemark.map(item => {
+      const [lon, lat] = item.Point.coordinates.split(',')
+      return Cartesian3.fromDegrees(Number(lon), Number(lat))
+    })
+    // 起点
+    newViewer.entities.add({
+      id: 'drone-job-wayline-start',
+      position: positions[0],
+      billboard: {
+        image: new Cesium.ConstantProperty(rwqfdImg),
+        width: 70,
+        height: 70,
+      },
+    })
+
+    // 终点
+    newViewer.entities.add({
+      id: 'drone-job-wayline-end',
+      position: positions[positions.length - 1],
+      billboard: {
+        image: new Cesium.ConstantProperty(endPointImg),
+        width: 30,
+        height: 30,
+        verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // 底部对齐
+      },
+    })
+
+    // 路径线
+    newViewer.entities.add({
+      id: 'drone-job-wayline-polyline',
+      polyline: {
+        width: 4,
+        positions: positions,
+        material: new ImageTrailMaterial({
+          color: { alpha: 1, blue: 1, green: 1, red: 1 },
+          speed: 20,
+          image: lineImg,
+          repeat: { x: Math.floor(40), y: 1 },
+        }),
+        clampToGround: false,
+      },
+    })
+  }
+
+  watch(taskDetails, () => {
+    if (taskDetails.value?.way_lines?.length) {
+      parsingFiles(taskDetails.value.way_lines[0].url)
+    }
+  }, { immediate: true })
+
+  const removeEntitys = () => {
+    const entitiesIDs = newViewer?.entities.values.map(i => i.id)
+
+    entitiesIDs.forEach(item => {
+      item.includes('drone-job-wayline-') && newViewer?.entities.removeById(item)
+    })
+  }
+
+  onBeforeUnmount(() => {
+    removeEntitys()
+  })
+
+  return {
+    removeEntitys
+  }
+}
\ No newline at end of file

--
Gitblit v1.9.3