From 687d15815ed738173c5a82495f0056fb2c9d7f25 Mon Sep 17 00:00:00 2001
From: guonan <guonan201020@163.com>
Date: 星期二, 08 七月 2025 15:56:20 +0800
Subject: [PATCH] 优化

---
 src/utils/map.js |  103 +++++++++++++++++++++++++++++----------------------
 1 files changed, 58 insertions(+), 45 deletions(-)

diff --git a/src/utils/map.js b/src/utils/map.js
index 06ec13e..b7939e0 100644
--- a/src/utils/map.js
+++ b/src/utils/map.js
@@ -1,4 +1,8 @@
 import { showDeviceDetail, deviceDetail, className, dialogPositon } from "@/store";
+
+import { useSimStore } from '@/store/simulation'
+
+
 export function addTerrain(url) {
   // console.log("鍔犺浇鍦板舰");
   var terrainProvider = new Cesium.CesiumTerrainProvider({
@@ -57,10 +61,13 @@
 }
 
 let entities = [];
+const pointEntityMap = new Map(); // key: id, value: entity
+
 export function createPoint(option) {
   const {
     id,
     type = "",
+    deviceTypeName = "",
     name = "榛樿鍚嶇О",
     view,
     latitude,
@@ -71,100 +78,95 @@
     imgHeight = 67,
     showBillboard = true,
     showLabel = true,
-    className = "device",
+    className = "device"
   } = option;
-  let position = Cesium.Cartesian3.fromDegrees(longitude, latitude, 50);
+
+
+  const realType = type || deviceTypeName;
+
+  // 濡傛灉宸茬粡瀛樺湪璇� id 鐨� entity锛屽垯璺宠繃鍒涘缓
+  if (pointEntityMap.has(id)) {
+    clearAllPoints()
+    console.log(`鐐� ${id} 宸插瓨鍦紝宸叉竻闄ら噸寤篳);
+  }
+
+  let position = Cesium.Cartesian3.fromDegrees(longitude, latitude, height || 50);
+
   let model = {
     id,
     name: name,
     position: position,
-    type: type,
+    type: realType,
     view: view,
     attrs: option,
     className: className,
     label: {
-      // 鏂囨湰銆傛敮鎸佹樉寮忔崲琛岀鈥� \ n鈥�
       text: name || "榛樿鏍囩",
-      // 瀛椾綋鏍峰紡锛屼互CSS璇硶鎸囧畾瀛椾綋
       font: "14pt Source Han Sans CN",
-      // 瀛椾綋棰滆壊
-
-      fillColor: type.includes("active") ? Cesium.Color.AQUA : Cesium.Color.WHITE,
-      // 鑳屾櫙棰滆壊
+      fillColor: (typeof realType === 'string' && realType.includes("active"))
+        ? Cesium.Color.AQUA
+        : Cesium.Color.WHITE,
+      // fillColor: Cesium.Color.WHITE,
       backgroundColor: showBillboard ? Cesium.Color.BLACK.withAlpha(0.5) : Cesium.Color.SKYBLUE,
-      // 鏄惁鏄剧ず鑳屾櫙棰滆壊
       showBackground: true,
-      // 瀛椾綋杈规
       outline: false,
-      // 瀛椾綋杈规棰滆壊
       outlineColor: Cesium.Color.WHITE,
-      // 瀛椾綋杈规灏哄
       outlineWidth: 0,
-      // 搴旂敤浜庡浘鍍忕殑缁熶竴姣斾緥銆傛瘮渚嬪ぇ浜庝細1.0鏀惧ぇ鏍囩锛岃�屾瘮渚嬪皬浜庝細1.0缂╁皬鏍囩銆�
       scale: 1.0,
       scaleByDistance: new Cesium.NearFarScalar(1.5e2, 1.0, 1.5e7, 0.5),
-      // 璁剧疆鏍峰紡锛欶ILL锛氬~鍐欐爣绛剧殑鏂囨湰锛屼絾涓嶈鍕惧嫆杞粨锛汷UTLINE锛氭杩版爣绛剧殑鏂囨湰锛屼絾涓嶈濉啓锛汧ILL_AND_OUTLINE锛氬~鍐欏苟姒傝堪鏍囩鏂囨湰銆�
       style: Cesium.LabelStyle.FILL_AND_OUTLINE,
-      // 鐩稿浜庡潗鏍囩殑姘村钩浣嶇疆
       verticalOrigin: Cesium.VerticalOrigin.CENTER,
-      // 鐩稿浜庡潗鏍囩殑姘村钩浣嶇疆
       horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
-      // 璇ュ睘鎬ф寚瀹氭爣绛惧湪灞忓箷绌洪棿涓窛姝ゆ爣绛惧師鐐圭殑鍍忕礌鍋忕Щ閲�
       pixelOffset: new Cesium.Cartesian2(0, -40),
-      // pixelOffset: new Cesium.Cartesian2(0, 0),
-      // 鏄剧ず鍦ㄨ窛鐩告満鐨勮窛绂诲鐨勫睘鎬э紝澶氬皯鍖洪棿鍐呮槸鍙互鏄剧ず鐨�
-      distanceDisplayCondition: type.includes("娌虫祦")
+      distanceDisplayCondition: (typeof realType === 'string' && realType.includes("娌虫祦"))
         ? new Cesium.DistanceDisplayCondition(0, 5000000)
         : new Cesium.DistanceDisplayCondition(0, 50000),
+      // distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 50000),
       heightReference: Cesium.HeightReference.RELATIVE_TO_GROUND,
-      // heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
-      // 鏄惁鏄剧ず
       show: showLabel,
     },
   };
+
   model.billboard = {
-    // 鍥惧儚鍦板潃锛孶RI鎴朇anvas鐨勫睘鎬�
     image: type ? `/images/poi/${type}.png` : `/images/poi/鏉戝簞.png`,
-    // 楂樺害锛堜互鍍忕礌涓哄崟浣嶏級
     height: imgHeight || 20,
-    // 瀹藉害锛堜互鍍忕礌涓哄崟浣嶏級
     width: imgWidth || 20,
-    // 閫嗘椂閽堟棆杞�
-    // 澶у皬鏄惁浠ョ背涓哄崟浣�
     sizeInMeters: false,
-    // 鐩稿浜庡潗鏍囩殑鍨傜洿浣嶇疆
     verticalOrigin: Cesium.VerticalOrigin.CENTER,
-    // 鐩稿浜庡潗鏍囩殑姘村钩浣嶇疆
     horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
-    // 璇ュ睘鎬ф寚瀹氭爣绛惧湪灞忓箷绌洪棿涓窛姝ゆ爣绛惧師鐐圭殑鍍忕礌鍋忕Щ閲�
     pixelOffset: new Cesium.Cartesian2(0, 3),
-    // 搴旂敤浜庡浘鍍忕殑缁熶竴姣斾緥銆傛瘮渚嬪ぇ浜庝細1.0鏀惧ぇ鏍囩锛岃�屾瘮渚嬪皬浜庝細1.0缂╁皬鏍囩銆�
     scale: 0.8,
     scaleByDistance: new Cesium.NearFarScalar(1.5e2, 1.0, 1.5e7, 0.5),
-    // 鏄剧ず鍦ㄨ窛鐩告満鐨勮窛绂诲鐨勫睘鎬э紝澶氬皯鍖洪棿鍐呮槸鍙互鏄剧ず鐨�
-    distanceDisplayCondition: type.includes("娌虫祦")
+    distanceDisplayCondition: (typeof realType === 'string' && realType.includes("娌虫祦"))
       ? new Cesium.DistanceDisplayCondition(0, 5000000)
       : new Cesium.DistanceDisplayCondition(0, 50000),
-    // 鏄惁鏄剧ず
+    distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 50000),
+
     show: showBillboard,
     heightReference: Cesium.HeightReference.RELATIVE_TO_GROUND,
     backgroundColor: showBillboard ? Cesium.Color.BLACK.withAlpha(0.8) : Cesium.Color.SKYBLUE,
   };
 
+  // 鍒涘缓鏂板疄浣撳苟娣诲姞鍒板湴鍥句腑
   const entity = viewer.entities.add(model);
-  entities.push(entity);
+  pointEntityMap.set(id, entity); // 瀛樺叆 map
 
   return entity;
 }
-// export function removeEntities() {
-//   entities.forEach(entity => {
-//     viewer.entities.remove(entity)
-//     entity.show = false;
-//   });
-//   // entities = []
-// }
+
+
+/**
+ * 鍒犻櫎鎵�鏈夊凡鍒涘缓鐨勭偣
+ */
+export function clearAllPoints() {
+  for (let [id, entity] of pointEntityMap.entries()) {
+    viewer.entities.remove(entity);
+  }
+  pointEntityMap.clear();
+}
+
 export function removeEntities(id) {
-  entities.forEach((entity, index) => {
+  pointEntityMap.forEach((entity, index) => {
     if (entity.id === id) {
       viewer.entities.remove(entity);
     }
@@ -197,7 +199,18 @@
 
     if (Cesium.defined(picked) && id) {
       const entity = picked?.id;
-      if (entity && entity.className) {
+      const simStore = useSimStore()
+      if (entity && !simStore.openDia && entity.attrs.type == '娉ヤ綅璁�') {
+        let obj = {
+          deviceName: entity.attrs.deviceName,
+          latitude: entity.attrs.latitude,
+          longitude: entity.attrs.longitude
+        }
+        simStore.selectNWJ = obj
+        showDeviceDetail.value = false;
+        console.log(simStore.selectNWJ, 'map.js鐐瑰嚮娉ヤ綅璁�')
+      }
+      if (entity && entity.className && simStore.openDia) {
         showDeviceDetail.value = true;
         deviceDetail.value = entity.attrs;
         className.value = entity.className;

--
Gitblit v1.9.3