forked from drone/command-center-dashboard

chenyao
2025-04-19 bdbc09270be8590d9b5a4837501074dfc338d34b
src/components/CurrentTaskDetails/RealTimeMap.vue
@@ -5,15 +5,10 @@
import * as Cesium from 'cesium'
import AmapMercatorTilingScheme from '@/utils/cesium/AmapMercatorTilingScheme'
import { Cartesian3, Terrain, Viewer } from 'cesium'
import endPointImg from '@/assets/images/EndPointicon.png'
import { addBlueFilter } from '@/utils/cesium/common'
import { analyzeKmzFile, removeTextKey, XMLToJSON } from '@/utils/cesium/kmz'
import rwqfdImg from '@/assets/images/signMachineNest/rwqfd.png'
import ImageTrailMaterial from '@/utils/cesium/ImageTrailMaterial'
import lineImg from '@/assets/images/arrow-right-blue.png'
import { flyVisual } from '@/utils/cesium/mapUtil'
import CreateFrustum from '@/utils/cesium/frustum/CreateFrustum'
import aircraftGltf from '@/assets/gltf/aircraft.gltf'
import { useTaskWayline } from '@/hooks/useTaskWayline/useTaskWayline'
const imageryProvider_ammapSL = new Cesium.UrlTemplateImageryProvider({
   url: 'https://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',
@@ -61,59 +56,6 @@
      destination: Cartesian3.fromDegrees(115.763819, 28.787374, 5000),
   })
}
const drawWayline = lineObj => {
   const positions = lineObj.Placemark.map(item => {
      const [lon, lat] = item.Point.coordinates.split(',')
      return Cartesian3.fromDegrees(Number(lon), Number(lat))
   })
   // 起点
   taskDetailsViewer?.value.entities.add({
      position: positions[0],
      billboard: {
         image: new Cesium.ConstantProperty(rwqfdImg),
         width: 70,
         height: 70,
      },
   })
   // 终点
   taskDetailsViewer?.value.entities.add({
      position: positions[positions.length - 1],
      billboard: {
         image: new Cesium.ConstantProperty(endPointImg),
         width: 30,
         height: 30,
         verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // 底部对齐
      },
   })
   // 路径线
   taskDetailsViewer?.value.entities.add({
      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,
      },
   })
}
// 解析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, taskDetailsViewer?.value)
   drawWayline(waylinesXMLObj)
}
let viewInfoFrustum
// 设置视椎
@@ -165,11 +107,8 @@
   setCreateFrustum()
   setAircraftGltf()
})
watch(taskDetails, () => {
   if (taskDetails.value.way_lines.length) {
      parsingFiles(taskDetails.value.way_lines[0].url)
   }
})
useTaskWayline(taskDetailsViewer, taskDetails)
const removeMap = () => {
   taskDetailsViewer?.value.entities.removeAll()