/* * @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 } }