| | |
| | | <template> |
| | | <div class="layer-tree"> |
| | | <el-tree ref="treeRef" style="max-width: 600px" show-checkbox |
| | | :default-checked-keys="defaultSelectedKeys" @check-change="handleCheckChange" :data="treeData" /> |
| | | <el-tree |
| | | ref="treeRef" |
| | | style="max-width: 600px" |
| | | show-checkbox |
| | | node-key="label" |
| | | :default-checked-keys="defaultSelectedKeys" |
| | | @check-change="handleCheckChange" |
| | | :data="treeData" |
| | | /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, onMounted, onBeforeUnmount, watch, onUnmounted } from "vue"; |
| | | import { ref, onMounted, watch, nextTick,onUnmounted } from "vue"; |
| | | import { createPoint, removeEntities, addTileset } from "@/utils/map"; |
| | | import { deviceDictList, getDictName } from "@/constant/dict.js"; |
| | | import { useRoute } from "vue-router"; |
| | | import { loadAreaPolygon, clearAreaPolygon } from "@/utils/area"; |
| | | import { checkedKeys } from "@/store/index"; |
| | | import { getDuanMainData, getDevicetListData, getDistrictListData } from "@/api/index.js"; |
| | | |
| | | const route = useRoute(); |
| | | |
| | | // 树形结构数据 |
| | | const treeData = ref([ |
| | | { |
| | | label: "三维服务", |
| | | children: [ |
| | | { label: "模型数据" }, |
| | | { label: "地形数据" }, |
| | | { label: "地形数据" }, // 确保这里的 label 是 "地形数据" |
| | | { label: "影像数据" }, |
| | | ], |
| | | }, |
| | | { |
| | | label: "图层数据", |
| | | children: [ |
| | | { |
| | | label: "北京市隐患点", |
| | | }, |
| | | { |
| | | label: "孙胡沟隐患点", |
| | | }, |
| | | // { |
| | | // label: "泥石流隐患点面数据", |
| | | // }, |
| | | { |
| | | label: "综合监测设备信息", |
| | | }, |
| | | { |
| | | label: "孙胡沟断面", |
| | | }, |
| | | { |
| | | label: "避险点", |
| | | }, |
| | | { label: "北京市隐患点" }, |
| | | { label: "孙胡沟隐患点" }, |
| | | { label: "综合监测设备信息" }, |
| | | { label: "孙胡沟断面" }, |
| | | { label: "避险点" }, |
| | | ], |
| | | }, |
| | | ]); |
| | | |
| | | // 默认选中的节点 |
| | | const defaultSelectedKeys = ref(["地形数据"]); // 确保与 treeData 的 label 完全匹配 |
| | | |
| | | // Tree 实例引用 |
| | | const treeRef = ref(null); |
| | | |
| | | // 存储图层实体的 Map |
| | | const treeMap = new Map(); |
| | | const defaultSelectedKeys = ref(["模型数据", "影像数据", "地形数据"]); |
| | | |
| | | /** |
| | | * 初始化地图 |
| | | */ |
| | | function initMap() { |
| | | // 初始化地形数据 |
| | | let TerrainLayer = earthCtrl.factory.createTerrainLayer({ |
| | | sourceType: "ctb", |
| | | url: "http://106.120.22.26:9103/gisserver/ctsserver/sungugoudem", |
| | | }); |
| | | treeMap.set("地形数据", TerrainLayer); |
| | | // 初始化模型数据 |
| | | // let modelPromise = addTileset( |
| | | // "http://106.120.22.26:9103/gisserver/c3dserver/sunhugou3d/tileset.json" |
| | | // ); |
| | | // modelPromise.then((model) => { |
| | | // treeMap.set("模型数据", model); |
| | | // }); |
| | | |
| | | // 初始化影像数据 |
| | | // let ImageryLayer = earthCtrl.factory.createImageryLayer({ |
| | | // sourceType: "tms", |
| | | // url: "http://106.120.22.26:9103/gisserver/tmsserver/sunhugoudom", |
| | | // }); |
| | | // treeMap.set("影像数据", ImageryLayer); |
| | | } |
| | | |
| | | /** |
| | | * 处理复选框状态变化 |
| | | */ |
| | | function handleCheckChange(data, checked, indeterminate) { |
| | | const label = data.label; |
| | | const list = treeMap.get(label); |
| | | if (label === "影像数据") { |
| | | if (checked) { |
| | | // 加载影像数据 |
| | | console.log("开始加载影像数据..."); |
| | | let ImageryLayer = earthCtrl.factory.createImageryLayer({ |
| | | sourceType: "tms", |
| | | url: "http://106.120.22.26:9103/gisserver/tmsserver/sunhugoudom", |
| | | }); |
| | | treeMap.set("影像数据", ImageryLayer); |
| | | toggleLayerVisible("影像数据", true); // 显示影像数据 |
| | | } else { |
| | | // 移除影像数据 |
| | | const layer = treeMap.get("影像数据"); |
| | | if (layer) { |
| | | toggleLayerVisible("影像数据", false); // 隐藏影像数据 |
| | | ImageryLayer.removeFromMap(); // 从 Map 中移除 |
| | | console.log("影像数据已移除"); |
| | | } |
| | | } |
| | | return; |
| | | } |
| | | if (label === "模型数据") { |
| | | if (checked) { |
| | | // 动态加载模型数据 |
| | | console.log("开始加载模型数据..."); |
| | | let modelPromise = addTileset( |
| | | "http://106.120.22.26:9103/gisserver/c3dserver/sunhugou3d/tileset.json" |
| | | ); |
| | | |
| | | modelPromise.then((model) => { |
| | | console.log("模型数据加载完成"); |
| | | treeMap.set("模型数据", model); // 将模型数据存储到 treeMap |
| | | toggleLayerVisible("模型数据", true); // 显示模型数据 |
| | | }).catch((error) => { |
| | | console.error("模型数据加载失败:", error); |
| | | }); |
| | | } else { |
| | | // 隐藏模型数据 |
| | | toggleLayerVisible("模型数据", false); |
| | | } |
| | | return; |
| | | } |
| | | |
| | | // 其他图层的处理逻辑 |
| | | const list = treeMap.get(label); |
| | | if (list) { |
| | | toggleLayerVisible(label, checked); |
| | | return; |
| | | } |
| | | |
| | | switch (label) { |
| | | case "模型数据": |
| | | case "影像数据": |
| | | case "地形数据": |
| | | console.warn(`未初始化 ${label} 的图层`); |
| | | break; |
| | | case "北京市隐患点": |
| | | case "孙胡沟隐患点": |
| | | case "泥石流隐患点面数据": |
| | |
| | | break; |
| | | } |
| | | } |
| | | function initMap() { |
| | | // 初始化模型数据 |
| | | let modelPromise = addTileset( |
| | | "http://106.120.22.26:9103/gisserver/c3dserver/sunhugou3d/tileset.json" |
| | | ); |
| | | modelPromise.then((model) => { |
| | | treeMap.set("模型数据", model); |
| | | }); |
| | | |
| | | // 初始化影像数据 |
| | | // let ImageryLayer = earthCtrl.factory.createImageryLayer({ |
| | | // sourceType: "tms", |
| | | // url: "http://106.120.22.26:9103/gisserver/tmsserver/sunhugoudom", |
| | | // }); |
| | | // treeMap.set("影像数据", ImageryLayer); |
| | | /** |
| | | * 切换图层可见性 |
| | | */ |
| | | function toggleLayerVisible(name, checked) { |
| | | const entityList = treeMap.get(name); |
| | | |
| | | // 初始化地形数据 |
| | | // let TerrainLayer = earthCtrl.factory.createTerrainLayer({ |
| | | // sourceType: "ctb", |
| | | // url: "http://106.120.22.26:9103/gisserver/ctsserver/sungugoudem", |
| | | // }); |
| | | // treeMap.set("地形数据", TerrainLayer); |
| | | console.log(`Toggling visibility for ${name}:`, checked); |
| | | |
| | | if (Array.isArray(entityList)) { |
| | | entityList.forEach((entity) => { |
| | | console.log(`Setting entity show to:`, checked); |
| | | entity.show = checked; |
| | | }); |
| | | } else if (entityList && typeof entityList.show !== 'undefined') { |
| | | console.log(`Setting layer show to:`, checked); |
| | | entityList.show = checked; |
| | | } else { |
| | | console.error(`无法设置图层 ${name} 的可见性`); |
| | | } |
| | | } |
| | | |
| | | // 设备列表 |
| | | const devicetList = ref([]); |
| | | |
| | | /** |
| | | * 获取设备列表并初始化设备点 |
| | | */ |
| | | const getDevicetList = async () => { |
| | | await getDevicetListData().then((res) => { |
| | | console.log(res.data, 'devicetList.value2'); |
| | | devicetList.value = res.data; |
| | | }) |
| | | }); |
| | | }; |
| | | |
| | | async function initDevicePoint() { |
| | |
| | | treeMap.set("综合监测设备信息", list); |
| | | } |
| | | |
| | | // 区域列表 |
| | | const districtList = ref([]); |
| | | |
| | | /** |
| | | * 获取区域列表并初始化区域点 |
| | | */ |
| | | const getDistrictList = async () => { |
| | | await getDistrictListData().then((res) => { |
| | | districtList.value = res.data; |
| | | }) |
| | | }); |
| | | }; |
| | | |
| | | async function initDistrictPoint() { |
| | | let list = []; |
| | | await getDistrictList() |
| | | await getDistrictList(); |
| | | districtList.value.forEach((item) => { |
| | | item.showBillboard = true; |
| | | item.className = "district"; |
| | |
| | | |
| | | let divPointList = []; |
| | | |
| | | /** |
| | | * 初始化断面点 |
| | | */ |
| | | function initDuanmianPoint() { |
| | | getDuanMainData().then((res) => { |
| | | const duanmianList = res.data; |
| | |
| | | const entity = createPoint(item); |
| | | entity.show = false; |
| | | list.push(entity); |
| | | return; |
| | | const divPoint = earthCtrl.factory.createDivPoint( |
| | | item.alias, |
| | | { lon: longitude, lat: latitude }, |
| | | { |
| | | type: "custom", |
| | | offset: ["c", 60], |
| | | description: ` |
| | | <div class="divPoint-custom"> |
| | | <p>${item.alias}</p> |
| | | </div> |
| | | `, |
| | | near: 0, |
| | | far: 500000, |
| | | } |
| | | ); |
| | | divPoint.item.show = false; |
| | | console.log(divPoint); |
| | | |
| | | divPointList.push(divPoint.item); |
| | | }); |
| | | treeMap.set("孙胡沟断面", list); |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * 添加避险点 |
| | | */ |
| | | function addTetrahedron(visible) { |
| | | const emergencyAreaList = []; |
| | | // 这里是添加避险点底层面片 |
| | | // 加载避险点底层面片 |
| | | loadAreaPolygon("/json/emergency_area.geojson", true).then((entities) => { |
| | | emergencyAreaList.push(...entities); |
| | | }); |
| | | // console.log('polygon', polygon); |
| | | |
| | | let list = [ |
| | | { |
| | | name: "尹建华家", |
| | | longitude: 116.593517, |
| | | latitude: 40.568391, |
| | | altitude: 528.45, |
| | | }, |
| | | // { |
| | | // name: "范振江家", |
| | | // longitude: 116.591059, |
| | | // latitude: 40.574068, |
| | | // altitude: 528, |
| | | // }, |
| | | // { |
| | | // name: "后坡", |
| | | // longitude: 116.597975, |
| | | // latitude: 40.558199, |
| | | // altitude: 528, |
| | | // }, |
| | | ]; |
| | | // 这里是添加避险点富文本高亮显示 |
| | | list.forEach((item) => { |
| | | let point = earthCtrl.factory.createRichTextPoint("避险点", [item.longitude, item.latitude, item.altitude - 10], { |
| | | distanceDisplayCondition: new SmartEarth.Cesium.DistanceDisplayCondition(0, 2000), |
| | | fontColor: "#ffffff", |
| | | fontSize: 20 |
| | | }, "0"); |
| | | console.log("point", point); |
| | | emergencyAreaList.push(point); |
| | | }); |
| | | treeMap.set("避险点", emergencyAreaList); |
| | | } |
| | | function toggleLayerVisible(name, checked) { |
| | | const entityList = treeMap.get(name); |
| | | |
| | | console.log(`Toggling visibility for ${name}:`, checked); |
| | | |
| | | if (Array.isArray(entityList)) { |
| | | entityList.forEach((entity) => { |
| | | console.log(`Setting entity show to:`, checked); |
| | | entity.show = checked; |
| | | // 默认隐藏避险点 |
| | | entities.forEach((entity) => { |
| | | entity.show = false; |
| | | }); |
| | | } else if (entityList && typeof entityList.show !== 'undefined') { |
| | | console.log(`Setting layer show to:`, checked); |
| | | entityList.show = checked; |
| | | } else { |
| | | console.error(`无法设置图层 ${name} 的可见性`); |
| | | } |
| | | |
| | | // 将避险点实体存储到 treeMap |
| | | treeMap.set("避险点", entities); |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * 初始化所有数据 |
| | | */ |
| | | function getData() { |
| | | initDevicePoint(); |
| | | initDistrictPoint(); |
| | | initDuanmianPoint(); |
| | | addTetrahedron(); |
| | | } |
| | | |
| | | // 通过 store 传递需要选中的key |
| | | // 监听 store 中的 checkedKeys 变化 |
| | | watch( |
| | | () => checkedKeys.value, |
| | | (keys) => { |
| | |
| | | } |
| | | ); |
| | | |
| | | // 监听路由变化 |
| | | watch( |
| | | () => route.fullPath, |
| | | (path) => { |
| | |
| | | } |
| | | } |
| | | ); |
| | | |
| | | // 组件挂载时初始化 |
| | | onMounted(() => { |
| | | initMap(); |
| | | getData(); |
| | | nextTick(() => { |
| | | // 确保树组件渲染完成后设置默认选中项 |
| | | treeRef.value.setCheckedKeys(defaultSelectedKeys.value, true); |
| | | }); |
| | | }); |
| | | |
| | | // 组件卸载时清理资源 |
| | | onUnmounted(() => { |
| | | viewer.entities.removeAll(); |
| | | }); |
| | |
| | | |
| | | <style lang="less" scoped> |
| | | .layer-tree { |
| | | // position: absolute; |
| | | // top: 11%; |
| | | // right: 25%; |
| | | background: url("@/assets/img/tools/plotting_new.png"); |
| | | width: 200px; |
| | | height: 200px; |
| | | z-index: 99; |
| | | } |
| | | </style> |
| | | </style> |