From 9825e6086a58c3ff9a9c68a07afffb22a3c31f6d Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Mon, 07 Apr 2025 16:29:40 +0800
Subject: [PATCH] feat: 解析kmz文件逻辑

---
 src/assets/images/arrow-right-blue.png                                                                        |    0 
 src/utils/cesium/kmz.js                                                                                       |   29 ++++++++++++++
 src/utils/cesium/ImageTrailMaterial.js                                                                        |    2 
 src/views/SignMachineNest/MachineRight/MachineTableDetails/DeviceJob/DeviceJobDetails/DeviceJobDetailsMap.vue |   43 ++++++++++++++++++---
 4 files changed, 66 insertions(+), 8 deletions(-)

diff --git a/src/assets/images/arrow-right-blue.png b/src/assets/images/arrow-right-blue.png
new file mode 100644
index 0000000..f5d9962
--- /dev/null
+++ b/src/assets/images/arrow-right-blue.png
Binary files differ
diff --git a/src/utils/cesium/ImageTrailMaterial.js b/src/utils/cesium/ImageTrailMaterial.js
index 272ed12..ce96d8a 100644
--- a/src/utils/cesium/ImageTrailMaterial.js
+++ b/src/utils/cesium/ImageTrailMaterial.js
@@ -84,7 +84,7 @@
                         czm_material material=czm_getDefaultMaterial(materialInput);
                         vec2 st=repeat * materialInput.st;
                         float time=fract(czm_frameNumber*speed/1000.);
-                        vec4 colorImage=texture2D(image,vec2(fract(st.s-time),st.t));
+                        vec4 colorImage=texture(image,vec2(fract(st.s-time),st.t)); // 修改 texture2D 为 texture
                         material.alpha = colorImage.a * color.a;
                         material.diffuse = (colorImage.rgb+color.rgb)/2.0;
                         return material;
diff --git a/src/utils/cesium/kmz.js b/src/utils/cesium/kmz.js
index 4ef1af9..a6cf77f 100644
--- a/src/utils/cesium/kmz.js
+++ b/src/utils/cesium/kmz.js
@@ -207,3 +207,32 @@
 		}
 	}
 }
+
+
+export function removeTextKey(obj) {
+	if (typeof obj !== 'object' || obj === null) {
+		// 如果是数值字符串,转换为数值
+		if (typeof obj === 'string' && /^-?\d+(\.\d+)?$/.test(obj)) {
+			return Number(obj);
+		}
+		return obj;
+	}
+
+	if (Array.isArray(obj)) {
+		return obj.map(item => removeTextKey(item));
+	}
+
+	if (Object.prototype.hasOwnProperty.call(obj, '#text')) {
+		// 如果 #text 的值是数值字符串,转换为数值
+		const textValue = obj['#text'];
+		return typeof textValue === 'string' && /^-?\d+(\.\d+)?$/.test(textValue) ? Number(textValue) : textValue;
+	}
+
+	const newObj = {};
+	for (const key in obj) {
+		if (Object.prototype.hasOwnProperty.call(obj, key)) {
+			newObj[key] = Object.keys(obj[key]).length === 0 ? '' : removeTextKey(obj[key]);
+		}
+	}
+	return newObj;
+}
diff --git a/src/views/SignMachineNest/MachineRight/MachineTableDetails/DeviceJob/DeviceJobDetails/DeviceJobDetailsMap.vue b/src/views/SignMachineNest/MachineRight/MachineTableDetails/DeviceJob/DeviceJobDetails/DeviceJobDetailsMap.vue
index 02079ac..c09e9cc 100644
--- a/src/views/SignMachineNest/MachineRight/MachineTableDetails/DeviceJob/DeviceJobDetails/DeviceJobDetailsMap.vue
+++ b/src/views/SignMachineNest/MachineRight/MachineTableDetails/DeviceJob/DeviceJobDetails/DeviceJobDetailsMap.vue
@@ -2,10 +2,11 @@
 	<div id="deviceJobDetailsMap" />
 </template>
 <script setup>
-import { Terrain, Viewer } from 'cesium'
+import { Cartesian3, Terrain, Viewer } from 'cesium'
 import * as Cesium 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'
 
 const props = defineProps(['detailsData'])
 
@@ -21,9 +22,9 @@
 	tilingScheme: new AmapMercatorTilingScheme(),
 	credit: 'amap_SL',
 })
-
+let viewer = null
 const init = () => {
-	const viewer = new Viewer('deviceJobDetailsMap', {
+	viewer = new Viewer('deviceJobDetailsMap', {
 		terrain: Terrain.fromWorldTerrain(),
 		infoBox: false, // 禁用沙箱,解决控制台报错
 		animation: false, // 左下角的动画仪表盘
@@ -36,10 +37,37 @@
 		selectionIndicator: false, // 是否显示选择指示器
 		baseLayer: false,
 		fullscreenButton: false,
-		sceneMode: Cesium.SceneMode.COLUMBUS_VIEW,
 	})
 	viewer.imageryLayers.addImageryProvider(imageryProvider_ammapSL)
-	// viewer.scene.morphTo2D(0)
+	viewer.scene.morphTo2D(0)
+}
+import  imgtst from '@/assets/images/arrow-right-blue.png'
+const renderingLine = (lineObj) =>{
+	console.log(lineObj)
+	const positions = lineObj.Placemark.map(item => {
+		const [lon,lat] = item.Point.coordinates.split(',')
+		return Cartesian3.fromDegrees(Number(lon), Number(lat) )
+	})
+	viewer.entities.add({
+		name: 'ls_wayline',
+		id: 'ls_wayline',
+		polyline: {
+			width: 4,
+			positions: positions,
+			material: new ImageTrailMaterial({
+				color: {
+					alpha: 1,
+					blue: 1,
+					green: 1,
+					red: 1
+				},
+				speed: 20,
+				image: imgtst,
+				repeat: { x: Math.floor(40), y: 1 }
+			}),
+			clampToGround: false
+		}
+	})
 }
 
 const drawLine = () => {
@@ -47,7 +75,8 @@
 		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)
+			const templateXMLObj = removeTextKey(templateXMLJSON.Folder)
+			renderingLine(templateXMLObj)
 		})
 	})
 }

--
Gitblit v1.9.3