| | |
| | | <template> |
| | | <div class="layer-tree"> |
| | | <!-- 添加按钮 |
| | | <el-button @click="printCurrentView" type="primary" style="margin-bottom: 10px;"> |
| | | 打印当前视图信息 |
| | | </el-button> --> |
| | | <!-- 图层树 --> |
| | | <el-tree |
| | | ref="treeRef" |
| | | style="max-width: 600px" |
| | |
| | | |
| | | <script setup> |
| | | import { ref, onMounted, watch, nextTick, onUnmounted, watchEffect } from "vue"; |
| | | import { createPoint, removeEntities, addTileset } from "@/utils/map"; |
| | | import { |
| | | createPoint, |
| | | removeEntities, |
| | | addTileset, |
| | | clearAllPoints, |
| | | } from "@/utils/map"; |
| | | import { deviceDictList, getDictName } from "@/constant/dict.js"; |
| | | import { useRoute } from "vue-router"; |
| | | import { |
| | |
| | | const route = useRoute(); |
| | | |
| | | /** |
| | | * 打印当前视图的相机状态 |
| | | */ |
| | | function printCurrentView() { |
| | | window.Viewer = earthCtrl.viewer;// 假设你已经在 data 或 setup 中定义了 viewer |
| | | const camera = earthCtrl.viewer.camera; |
| | | |
| | | const view = { |
| | | destination: { |
| | | x: camera.position.x, |
| | | y: camera.position.y, |
| | | z: camera.position.z, |
| | | }, |
| | | orientation: { |
| | | pitch: camera.pitch, |
| | | roll: camera.roll, |
| | | heading: camera.heading, |
| | | }, |
| | | }; |
| | | |
| | | console.log('当前视图参数:', view); |
| | | } |
| | | /** |
| | | * 图层树配置数据 |
| | | * 包含三维服务和图层数据两大分类 |
| | | */ |
| | | const treeData = ref([ |
| | | const treeData = ref([ |
| | | { |
| | | label: "三维服务", |
| | | children: [ |
| | |
| | | { label: "避险场所" }, |
| | | ], |
| | | }, |
| | | { |
| | | label: "南窖乡", |
| | | children: [ |
| | | { |
| | | label: "南窖乡影像", |
| | | type: "imagery", |
| | | url: "/imagery/tile/image/wmts/pTkjV3J9/{z}/{x}/{y}?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo" |
| | | }, |
| | | { |
| | | label: "南窖乡地形", |
| | | type: "terrain", |
| | | url: "/imagery/tile/terrain/TBKJCcqO?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo", |
| | | view: { |
| | | destination: { x: -2148291.712223941, y: 4429896.46897996, z: 4055778.9577251095 }, |
| | | orientation: { pitch: -0.7094729926433327, roll: 6.2829983479026374, heading: 6.228640490951177 } |
| | | } |
| | | }, |
| | | { |
| | | label: "南窖乡地形模型1", |
| | | type: "model", |
| | | url: "/imagery/tile/model/service/LSR5ezfl/tileset.json?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo", |
| | | view: { |
| | | destination: { x: -2146689.939461115, y: 4426047.413821165, z: 4057984.6498454507 }, |
| | | orientation: { pitch: -0.9541138124492012, roll: 0.00031687828366511184, heading: 6.140422591164119 } |
| | | } |
| | | }, |
| | | { |
| | | label: "南窖乡地形模型2", |
| | | type: "model", |
| | | url: "/imagery/tile/model/service/uNsdeKPc/tileset.json?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo", |
| | | view: { |
| | | destination: { x: -2145340.8188580503, y: 4424796.321883301, z: 4059623.85371558 }, |
| | | orientation: { pitch: -0.9541017116169872, roll: 0.000313870753641865, heading: 6.140425044701509 } |
| | | } |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | label: "金鸡台村", |
| | | children: [ |
| | | { |
| | | label: "金鸡台村影像", |
| | | type: "imagery", |
| | | url: "/imagery/tile/image/wmts/qEToHR5Z/{z}/{x}/{y}?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo" |
| | | }, |
| | | { |
| | | label: "金鸡台村地形", |
| | | type: "terrain", |
| | | url: "/imagery/tile/terrain/aEIeI21o?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo", |
| | | view: { |
| | | destination: { x: -2130224.9623079575, y: 4426008.165349956, z: 4068795.580264238 }, |
| | | orientation: { pitch: -0.9127940858026111, roll: 6.282740114172059, heading: 0.08207325160381274 } |
| | | } |
| | | }, |
| | | { |
| | | label: "金鸡台村模型1", |
| | | type: "model", |
| | | url: "/imagery/tile/model/service/1J2wMbnU/tileset.json?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo", |
| | | view: { |
| | | destination: { x: -2133104.794919741, y: 4425812.523913443, z: 4069478.3137610652 }, |
| | | orientation: { pitch: -0.9541137913665527, roll: 0.00031687304371175173, heading: 6.140422595438931 } |
| | | } |
| | | }, |
| | | { |
| | | label: "金鸡台村模型2", |
| | | type: "model", |
| | | url: "/imagery/tile/model/service/gaeULxdB/tileset.json?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo", |
| | | view: { |
| | | destination: { x: -2130956.971562582, y: 4426818.080505688, z: 4069740.7525420994 }, |
| | | orientation: { pitch: -0.9541137309940142, roll: 0.0003168580385137787, heading: 6.140422607680212 } |
| | | } |
| | | }, |
| | | { |
| | | label: "金鸡台村模型3", |
| | | type: "model", |
| | | url: "/imagery/tile/model/service/haujMGBj/tileset.json?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo", |
| | | view: { |
| | | destination: { x: -2132142.087145638, y: 4425161.123976678, z: 4070278.934587119 }, |
| | | orientation: { pitch: -0.9541140402489301, roll: 0.0003169349017886347, heading: 6.140422544975061 } |
| | | } |
| | | }, |
| | | { |
| | | label: "金鸡台村模型4", |
| | | type: "model", |
| | | url: "/imagery/tile/model/service/qMRvXo9Q/tileset.json?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo", |
| | | view: { |
| | | destination: { x: -2127321.106886179, y: 4421820.211235223, z: 4068832.7651704233 }, |
| | | orientation: { pitch: -0.9541063907093843, roll: 0.00031503367875540533, heading: 6.140424095992006 } |
| | | } |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | label: "龙泉庄村", |
| | | children: [ |
| | | { |
| | | label: "龙泉庄村影像", |
| | | type: "imagery", |
| | | url: "/imagery/tile/image/wmts/Tdjg608Z/{z}/{x}/{y}?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo" |
| | | }, |
| | | { |
| | | label: "龙泉庄村地形", |
| | | type: "terrain", |
| | | url: "/imagery/tile/terrain/pLtaLGeZ?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo", |
| | | view: { |
| | | destination: { x: -2168757.031244387, y: 4352617.776664691, z: 4114967.541317504 }, |
| | | orientation: { pitch: -0.4435676845783054, roll: 6.283154708563269, heading: 5.537612876549447 } |
| | | } |
| | | }, |
| | | { |
| | | label: "龙泉庄村模型", |
| | | type: "model", |
| | | url: "/imagery/tile/model/service/vv0P5FuH/tileset.json?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo", |
| | | view: { |
| | | destination: { x: -2168663.968240228, y: 4355261.718587015, z: 4115712.067191204 }, |
| | | orientation: { pitch: -0.9540906570127872, roll: 0.00031112334289318255, heading: 6.140427286015401 } |
| | | } |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | label: "峪沟村", |
| | | children: [ |
| | | { |
| | | label: "峪沟村影像", |
| | | type: "imagery", |
| | | url: "/imagery/tile/image/wmts/okRsdbWk/{z}/{x}/{y}?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo" |
| | | }, |
| | | { |
| | | label: "峪沟村地形", |
| | | type: "terrain", |
| | | url: "/imagery/tile/terrain/2LBx9e7E?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo", |
| | | view: { |
| | | destination: { x: -2170854.0167420367, y: 4358200.634596329, z: 4110425.3427262204 }, |
| | | orientation: { pitch: -0.847848874762068, roll: 0.00008577448108137986, heading: 0.4679505123692884 } |
| | | } |
| | | }, |
| | | { |
| | | label: "峪沟村模型", |
| | | type: "model", |
| | | url: "/imagery/tile/model/service/4QnI3jUW/tileset.json?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo", |
| | | view: { |
| | | destination: { x: -2173100.959020146, y: 4359294.155857249, z: 4110691.2853415837 }, |
| | | orientation: { pitch: -0.9540973990229973, roll: 0.00031279893049074303, heading: 6.140425919087564 } |
| | | } |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | label: "灵水村", |
| | | children: [ |
| | | { |
| | | label: "灵水村影像", |
| | | type: "imagery", |
| | | url: "/imagery/tile/image/wmts/sxVRibjH/{z}/{x}/{y}?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo" |
| | | }, |
| | | { |
| | | label: "灵水村地形", |
| | | type: "terrain", |
| | | url: "/imagery/tile/terrain/N0INPZIN?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo", |
| | | view: { |
| | | destination: { x: -2127000.0250662216, y: 4408369.621939603, z: 4078610.664222384 }, |
| | | orientation: { pitch: -0.4326441481504202, roll: 0.000025937982368162693, heading: 4.9973143963984015 } |
| | | } |
| | | }, |
| | | { |
| | | label: "灵水村模型", |
| | | type: "model", |
| | | url: "/imagery/tile/model/service/hj3Ipgwk/tileset.json?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo", |
| | | view: { |
| | | destination: { x: -2128232.405466075, y: 4415420.0330180405, z: 4079261.2309530703 }, |
| | | orientation: { pitch: -0.9541075114138131, roll: 0.00031531221697900236, heading: 6.140423868761242 } |
| | | } |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | label: "田庄村", |
| | | children: [ |
| | | { |
| | | label: "田庄村影像", |
| | | type: "imagery", |
| | | url: "/imagery/tile/image/wmts/EDtElo3U/{z}/{x}/{y}?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo" |
| | | }, |
| | | { |
| | | label: "田庄村地形", |
| | | type: "terrain", |
| | | url: "/imagery/tile/terrain/sDpC3pM8?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo", |
| | | view: { |
| | | destination: { x: -2136032.9273641515, y: 4399423.940210319, z: 4084681.6412534667 }, |
| | | orientation: { pitch: -0.6380935762087248, roll: 6.283155058648237, heading: 6.117892190518964 } |
| | | } |
| | | }, |
| | | { |
| | | label: "田庄村模型", |
| | | type: "model", |
| | | url: "/imagery/tile/model/service/Iakp0nhx/tileset.json?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo", |
| | | view: { |
| | | destination: { x: -2138006.584911224, y: 4402665.343671573, z: 4086466.2821442005 }, |
| | | orientation: { pitch: -0.9541030942818041, roll: 0.0003142143946410769, heading: 6.140424764361058 } |
| | | } |
| | | } |
| | | ] |
| | | } |
| | | ]); |
| | | |
| | | // 默认选中的节点(地形数据默认开启) |
| | |
| | | async function initImageryLayer() { |
| | | try { |
| | | ImageryLayer = await earthCtrl.factory.createImageryLayer({ |
| | | sourceType: "tms", |
| | | sourceType: "wmts", |
| | | url: "http://106.120.22.26:9103/gisserver/tmsserver/sunhugoudom", |
| | | // url: "/imagery/tile/image/wmts/pTkjV3J9/{z}/{x}/{y}?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo", |
| | | }); |
| | | treeMap.set("影像数据", ImageryLayer); |
| | | } catch (error) { |
| | | console.error("影像数据初始化失败:", error); |
| | | } |
| | | } |
| | | // async function initImageryLayerByName(name, url) { |
| | | // try { |
| | | // // 创建影像图层 |
| | | // const imageryLayer = await earthCtrl.factory.createImageryLayer({ |
| | | // sourceType: "wmts", // 根据实际情况调整sourceType |
| | | // url: url, |
| | | // }); |
| | | |
| | | // // 将创建的影像图层添加到Cesium Viewer中 |
| | | // // if (imageryLayer) { |
| | | // // viewer.imageryLayers.add(imageryLayer); |
| | | // // } |
| | | |
| | | // // 将图层实例保存到treeMap中 |
| | | // treeMap.set(name, imageryLayer); |
| | | |
| | | // console.log(`${name} 影像数据初始化成功`); |
| | | // } catch (error) { |
| | | // console.error(`${name} 影像数据初始化失败:`, error); |
| | | // } |
| | | // } |
| | | /** |
| | | * 处理树节点勾选变化 |
| | | * @param {Object} data - 节点数据 |
| | | * @param {Boolean} checked - 是否选中 |
| | | * @param {Boolean} indeterminate - 不确定状态 |
| | | */ |
| | | function handleCheckChange(data, checked) { |
| | | function handleCheckChange(data, checked) { |
| | | const label = data.label; |
| | | |
| | | // 地形数据处理 |
| | |
| | | return; |
| | | } |
| | | |
| | | // 村庄图层处理 |
| | | // if (data.type === "imagery") { |
| | | // if (checked) { |
| | | // initImageryLayerByName(label, data.url); |
| | | // } else { |
| | | // const layer = treeMap.get(label); |
| | | // if (layer) { |
| | | // viewer.imageryLayers.remove(layer); |
| | | // treeMap.delete(label); |
| | | // } |
| | | // } |
| | | // return; |
| | | // } |
| | | if (data.type === "terrain") { |
| | | handleTerrainLayerByName(label, data.url, checked, data.view); |
| | | return; |
| | | } |
| | | |
| | | if (data.type === "model") { |
| | | handleModelLayerByUrl(label, data.url, checked, data.view); |
| | | return; |
| | | } |
| | | |
| | | // 其他图层的处理 |
| | | const layer = treeMap.get(label); |
| | | if (layer) { |
| | | toggleLayerVisible(label, checked); |
| | | } |
| | | } |
| | | async function handleTerrainLayerByName(name, url, checked, view) { |
| | | if (checked) { |
| | | try { |
| | | const layer = await earthCtrl.factory.createTerrainLayer({ |
| | | sourceType: "ctb", |
| | | url, |
| | | requestVertexNormals: true, |
| | | }); |
| | | treeMap.set(name, layer); |
| | | viewer.terrain = layer; |
| | | |
| | | console.log(view, 'zhelishi shuju'); // 现在应该有数据了 |
| | | |
| | | if (view && view.destination && view.orientation) { |
| | | viewer.scene.camera.flyTo({ |
| | | destination: new Cesium.Cartesian3( |
| | | view.destination.x, |
| | | view.destination.y, |
| | | view.destination.z |
| | | ), |
| | | orientation: { |
| | | heading: view.orientation.heading, |
| | | pitch: view.orientation.pitch, |
| | | roll: view.orientation.roll |
| | | } |
| | | }); |
| | | } |
| | | |
| | | } catch (error) { |
| | | console.error(`地形图层 ${name} 加载失败:`, error); |
| | | } |
| | | } else { |
| | | const layer = treeMap.get(name); |
| | | if (layer) { |
| | | toggleLayerVisible(name, false); |
| | | layer.removeFromMap(); |
| | | treeMap.delete(name); |
| | | } |
| | | } |
| | | } |
| | | |
| | | async function handleModelLayerByUrl(name, url, checked, view) { |
| | | if (checked) { |
| | | try { |
| | | const model = await addTileset(url); |
| | | treeMap.set(name, model); |
| | | viewer.scene.primitives.add(model); |
| | | |
| | | if (view && view.destination && view.orientation) { |
| | | viewer.scene.camera.flyTo({ |
| | | destination: new Cesium.Cartesian3( |
| | | view.destination.x, |
| | | view.destination.y, |
| | | view.destination.z |
| | | ), |
| | | orientation: { |
| | | heading: view.orientation.heading, |
| | | pitch: view.orientation.pitch, |
| | | roll: view.orientation.roll |
| | | } |
| | | }); |
| | | } |
| | | |
| | | } catch (error) { |
| | | console.error(`模型图层 ${name} 加载失败:`, error); |
| | | } |
| | | } else { |
| | | const model = treeMap.get(name); |
| | | if (model) { |
| | | viewer.scene.primitives.remove(model); |
| | | treeMap.delete(name); |
| | | } |
| | | } |
| | | } |
| | | /** |
| | | * 处理地形图层 |
| | | */ |
| | |
| | | function handleModelLayer(checked) { |
| | | if (checked) { |
| | | addTileset( |
| | | "http://106.120.22.26:9103/gisserver/c3dserver/sunhugou3d/tileset.json" |
| | | // "http://106.120.22.26:9103/gisserver/c3dserver/sunhugou3d/tileset.json" |
| | | "/imagery/tile/model/service/Iakp0nhx/tileset.json?labtoken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiItMSxUaHUgQXByIDE4IDE1OjMwOjU3IENTVCAyMDI0In0.j_YKsCRsIQtpgOWfFvMwAP65Rlx9uXyVte_xkE95Vdo" |
| | | ) |
| | | .then((model) => { |
| | | treeMap.set("模型数据", model); |
| | |
| | | * 清除图层实体 |
| | | * @param {String} layerName - 图层名称 |
| | | */ |
| | | function clearLayerEntities(layerName) { |
| | | // 暂且保留 |
| | | // async function clearLayerEntities(layerName) { |
| | | // const list = treeMap.get(layerName); |
| | | // if (list && Array.isArray(list)) { |
| | | // for (const item of list) { |
| | | // const entity = await item; |
| | | // if (layerName == "综合监测设备信息") { |
| | | // removeEntities(entity.deviceId); |
| | | // } else if (layerName == "孙胡沟隐患点") { |
| | | // removeEntities(entity.hdId); |
| | | // } |
| | | // } |
| | | // } |
| | | // treeMap.delete(layerName); |
| | | // } |
| | | |
| | | /** |
| | | * 清除图层实体 |
| | | * @param {String} layerName - 图层名称 |
| | | */ |
| | | // 此函数优化了在模拟仿真页面,如果点击目录树选中取消,泥位计仍显示 |
| | | async function clearLayerEntities(layerName) { |
| | | const isMnfzPage = route.path === "/mnfz"; // 判断是否为 /mnfz 页面 |
| | | |
| | | const list = treeMap.get(layerName); |
| | | if (list && Array.isArray(list)) { |
| | | list.forEach((entity) => { |
| | | if (viewer.entities.contains(entity)) { |
| | | viewer.entities.remove(entity); |
| | | for (const item of list) { |
| | | const entity = await item; |
| | | |
| | | let shouldRemove = true; // 默认要删除 |
| | | |
| | | // 如果是 /mnfz 页面,并且是“泥位计”,则不删除 |
| | | if (isMnfzPage && entity.type === "泥位计") { |
| | | shouldRemove = false; |
| | | } |
| | | }); |
| | | |
| | | if (shouldRemove) { |
| | | if (layerName === "综合监测设备信息") { |
| | | removeEntities(entity.deviceId); |
| | | } else if (layerName === "孙胡沟隐患点") { |
| | | removeEntities(entity.hdId); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | treeMap.delete(layerName); |
| | | } |
| | | |
| | | // 监控设备开关变化 |
| | | watchEffect(() => { |
| | | watchEffect(async () => { |
| | | clearLayerEntities("综合监测设备信息"); |
| | | |
| | | if (simStore.DeviceShowSwitch) { |
| | | const deviceList = simStore.devices |
| | | // 使用 Promise.all 等待所有异步操作完成 |
| | | const deviceListPromises = simStore.devices |
| | | .filter((item) => item.deviceName?.includes("孙胡沟")) |
| | | .map((item) => { |
| | | const entity = createPoint({ |
| | | ...item, |
| | | type: getDictName(deviceDictList, item.dictDeviceType), |
| | | name: item.deviceName.split("孙胡沟")[1], |
| | | id: item.deviceId, |
| | | className: "device", |
| | | showLabel: true, |
| | | }); |
| | | entity.show = true; |
| | | return entity; |
| | | .map(async (item) => { |
| | | const entity = viewer.entities.getById(item.deviceId); |
| | | item.type = getDictName(deviceDictList, item.dictDeviceType); |
| | | item.name = item.deviceName.split("孙胡沟")[1]; |
| | | item.id = item.deviceId; |
| | | item.className = "device"; |
| | | item.showLabel = true; |
| | | await createPoint(item); // 确保 createPoint 返回一个 Promise 或者本身就是异步函数 |
| | | return item; // 返回处理后的 item |
| | | }); |
| | | |
| | | // 等待所有异步操作完成 |
| | | const deviceList = await Promise.all(deviceListPromises); |
| | | |
| | | if (deviceList.length) { |
| | | treeMap.set("综合监测设备信息", deviceList); |
| | |
| | | }); |
| | | |
| | | // 监控隐患点开关变化 |
| | | watchEffect(() => { |
| | | watchEffect(async () => { |
| | | clearLayerEntities("孙胡沟隐患点"); |
| | | |
| | | if (simStore.DangerShowSwitch) { |
| | | const dangerPoints = simStore.DangerPoint.filter((item) => |
| | | const filteredPoints = simStore.DangerPoint.filter((item) => |
| | | item.position?.includes("孙胡沟") |
| | | ).map((item) => { |
| | | const entity = createPoint({ |
| | | id: item.hdId, |
| | | name: item.hdName, |
| | | latitude: item.lat, |
| | | longitude: item.lon, |
| | | showBillboard: true, |
| | | type: item.disasterType, |
| | | className: "district", |
| | | }); |
| | | entity.show = true; |
| | | return entity; |
| | | ); |
| | | |
| | | const dangerPointPromises = filteredPoints.map(async (item) => { |
| | | const entity = viewer.entities.getById(item.hdId); |
| | | item.id = item.hdId; |
| | | item.name = item.hdName; |
| | | item.latitude = item.lat; |
| | | item.longitude = item.lon; |
| | | item.showBillboard = true; |
| | | item.type = item.disasterType; |
| | | item.className = "district"; |
| | | await createPoint(item); // 确保 createPoint 是异步函数 |
| | | return item; // 返回处理好的 item |
| | | }); |
| | | |
| | | if (dangerPoints.length) { |
| | | treeMap.set("孙胡沟隐患点", dangerPoints); |
| | | try { |
| | | const resolvedPoints = await Promise.all(dangerPointPromises); |
| | | |
| | | if (resolvedPoints.length) { |
| | | treeMap.set("孙胡沟隐患点", resolvedPoints); |
| | | } |
| | | } catch (error) { |
| | | console.error("创建隐患点时发生错误:", error); |
| | | } |
| | | } |
| | | }); |
| | |
| | | * 添加避险场所数据 |
| | | */ |
| | | function addTetrahedron() { |
| | | getSafePoint().then((res) => { |
| | | getSafePoint(110116110218).then((res) => { |
| | | const geoJsonData = convertToGeoJson(res.data); // 转换为 GeoJSON |
| | | // 加载 GeoJSON 数据到地图 |
| | | loadAreaPolygon(geoJsonData, true).then((entities) => { |