From 5fdaf3cff8add48bb5c1f0da74378b271f3cdbdf Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Mon, 07 Apr 2025 21:41:03 +0800
Subject: [PATCH] feat: 选择性清除实体
---
src/views/SignMachineNest/MachineRight/MachineTableDetails/DeviceJob/DeviceJobDetails/DeviceJobDetailsMap.vue | 115 +++++++++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 94 insertions(+), 21 deletions(-)
diff --git a/src/views/SignMachineNest/MachineRight/MachineTableDetails/DeviceJob/DeviceJobDetails/DeviceJobDetailsMap.vue b/src/views/SignMachineNest/MachineRight/MachineTableDetails/DeviceJob/DeviceJobDetails/DeviceJobDetailsMap.vue
index 02079ac..cef055c 100644
--- a/src/views/SignMachineNest/MachineRight/MachineTableDetails/DeviceJob/DeviceJobDetails/DeviceJobDetailsMap.vue
+++ b/src/views/SignMachineNest/MachineRight/MachineTableDetails/DeviceJob/DeviceJobDetails/DeviceJobDetailsMap.vue
@@ -2,13 +2,16 @@
<div id="deviceJobDetailsMap" />
</template>
<script setup>
-import { Terrain, Viewer } from 'cesium'
import * as Cesium from 'cesium'
+import { Cartesian3, Math as CesiumMath, Terrain, Viewer } from 'cesium'
import AmapMercatorTilingScheme from '@/utils/cesium/AmapMercatorTilingScheme'
-import { analyzeKmzFile, XMLToJSON } from '@/utils/cesium/kmz'
+import { analyzeKmzFile, removeTextKey, XMLToJSON } from '@/utils/cesium/kmz'
+import ImageTrailMaterial from '@/utils/cesium/ImageTrailMaterial'
+import lineImg from '@/assets/images/arrow-right-blue.png'
+import uavImg from '@/assets/images/home/useUavHome/uavImg.png'
+import { getCenterPoint } from '@/utils/cesium/mapUtil'
const props = defineProps(['detailsData'])
-
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}',
@@ -21,9 +24,9 @@
tilingScheme: new AmapMercatorTilingScheme(),
credit: 'amap_SL',
})
-
-const init = () => {
- const viewer = new Viewer('deviceJobDetailsMap', {
+let viewer = null
+const initMap = () => {
+ viewer = new Viewer('deviceJobDetailsMap', {
terrain: Terrain.fromWorldTerrain(),
infoBox: false, // 禁用沙箱,解决控制台报错
animation: false, // 左下角的动画仪表盘
@@ -36,31 +39,101 @@
selectionIndicator: false, // 是否显示选择指示器
baseLayer: false,
fullscreenButton: false,
- sceneMode: Cesium.SceneMode.COLUMBUS_VIEW,
})
viewer.imageryLayers.addImageryProvider(imageryProvider_ammapSL)
- // viewer.scene.morphTo2D(0)
-}
-
-const drawLine = () => {
- props.detailsData.way_lines.forEach(item => {
- analyzeKmzFile(`${item.url}?_t=${new Date().getTime()}`).then(async res => {
- const templateXML = await res.fileInfoObj['wpmz/template.kml']
- const templateXMLJSON = XMLToJSON(templateXML)?.['Document']
- console.log(templateXMLJSON,66969969)
- })
+ viewer.scene.morphTo2D(0)
+ //设置默认点
+ viewer.camera.setView({
+ destination: Cartesian3.fromDegrees(115.763819, 28.787374),
})
}
-watch(() => props.detailsData, (newValue, oldValue) => {
- if(newValue){
- drawLine()
+// 渲染线和点
+const renderingLine = lineObj => {
+ const positions = lineObj.Placemark.map(item => {
+ const [lon, lat] = item.Point.coordinates.split(',')
+ return Cartesian3.fromDegrees(Number(lon), Number(lat))
+ })
+ viewer.entities.add({
+ position: positions[0],
+ billboard: {
+ image: new Cesium.ConstantProperty(uavImg),
+ width: 24,
+ height: 24,
+ },
+ })
+ viewer.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,
+ },
+ })
+}
+
+// 飞到中心点
+function flyToPoints(lngLatArr) {
+ if (!Array.isArray(lngLatArr) || lngLatArr.length === 0) return
+ const positions = lngLatArr.map(([lon, lat]) =>
+ Cesium.Cartesian3.fromDegrees(Number(lon), Number(lat))
+ )
+ // 计算包围盒 BoundingSphere(所有点的外接球)
+ const boundingSphere = Cesium.BoundingSphere.fromPoints(positions)
+ viewer.camera.flyToBoundingSphere(boundingSphere, {
+ duration: 0,
+ offset: new Cesium.HeadingPitchRange(0, 0, boundingSphere.radius * 2),
+ })
+}
+
+// 异步解析kmz文件
+const analysis = async url => {
+ return new Promise(async resolve => {
+ const res = await analyzeKmzFile(`${url}?_t=${new Date().getTime()}`)
+ const waylinesXML = await res.fileInfoObj['wpmz/waylines.wpml']
+ const waylinesXMLJSON = XMLToJSON(waylinesXML)?.['Document']
+ const templateXMLObj = removeTextKey(waylinesXMLJSON.Folder)
+ resolve(templateXMLObj)
+ })
+}
+
+// 绘制线和飞行
+const drawLine = async () => {
+ const res = await Promise.all(props.detailsData.way_lines.map(item => analysis(item.url)))
+ res.map(item => renderingLine(item))
+ console.log(res,'jiexi')
+ const allPoint = res
+ .flatMap(item => item.Placemark)
+ .map(item => item.Point.coordinates.split(','))
+ flyToPoints(allPoint)
+}
+
+const removeMap = () => {
+ viewer.entities.removeAll()
+ viewer.destroy()
+}
+
+watch(
+ () => props.detailsData,
+ (newValue, oldValue) => {
+ if (newValue) {
+ drawLine()
+ }
}
+)
+
+onBeforeUnmount(() => {
+ removeMap()
})
onMounted(() => {
nextTick(() => {
- init()
+ initMap()
})
})
</script>
--
Gitblit v1.9.3