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