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