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