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