Files
WarehouseClient/src/views/Map.vue

96 lines
2.8 KiB
Vue
Raw Normal View History

2025-10-12 17:04:18 +08:00
<script setup>
/**
* 3D地图主组件
* 负责初始化VgoMap 3D地图引擎管理地图状态并为子组件提供共享数据
*/
// 导入Vue组合式API
2025-10-12 17:04:18 +08:00
import { onMounted, ref, computed, provide } from "vue"
// 导入子组件
import Fence from "../components/Fence.vue" // 3D地图围栏组件用于绘制区域边界
import Filter from "../components/Filter.vue" // 地图筛选组件,用于分类显示/隐藏标记点
/**
* 地图相关常量和状态定义
*/
const { VgoMap } = window // 从全局对象获取VgoMap 3D地图引擎实例
let mapId = '1958120048849719296' // 地图资源唯一标识ID
const isLoaded = ref(false) // 地图加载完成状态标记
const map = ref() // 地图实例引用用于操作地图API
2025-10-12 17:04:18 +08:00
/**
* 计算所有多边形数据
* 合并室外和室内的多边形数据为围栏和筛选组件提供完整的地图数据
* @returns {Array} - 合并后的多边形数据数组
*/
2025-10-12 17:04:18 +08:00
const polygonDataAll = computed(() => {
// 获取室外多边形数据
2025-10-12 17:04:18 +08:00
const outDoor = map.value?.mapData?.polygonData ?? []
// 获取室内多边形数据(遍历建筑和楼层)
2025-10-12 17:04:18 +08:00
const inDoor = map?.mapData?.build?.reduce((result, build) => {
build.floor.forEach(fItem => {
result.push(...fItem.polygonData)
})
return result
}, []) ?? []
// 合并室内外数据并返回
2025-10-12 17:04:18 +08:00
return [...outDoor, ...inDoor]
})
/**
* 使用Vue的provide API为子组件提供共享数据
* 使Fence和Filter组件能够访问地图实例和多边形数据
*/
provide("map", computed(() => map.value)) // 提供地图实例
provide('polygonDataAll', polygonDataAll) // 提供多边形数据
2025-10-12 17:04:18 +08:00
/**
* 组件生命周期钩子挂载后执行
* 初始化3D地图实例并设置事件监听器
*/
2025-10-12 17:04:18 +08:00
onMounted(() => {
// 创建地图实例
2025-10-12 17:04:18 +08:00
map.value = new VgoMap.Map({
el: "mapContainer", // 地图容器元素ID
id: mapId, // 地图ID
2025-10-12 17:04:18 +08:00
})
// 监听地图加载完成事件
2025-10-12 17:04:18 +08:00
map.value.on("loaded", () => {
isLoaded.value = true // 更新地图加载状态
2025-10-12 17:04:18 +08:00
})
})
</script>
<template>
<!-- 地图组件模板 -->
2025-10-12 17:04:18 +08:00
<div class="wrapper">
<!-- 地图渲染容器VgoMap将在此处渲染3D地图 -->
2025-10-12 17:04:18 +08:00
<div id="mapContainer"></div>
<!-- UI组件容器 - 当地图加载完成后显示确保组件在地图数据准备就绪后初始化 -->
2025-10-12 17:04:18 +08:00
<div v-if="isLoaded" class="ui">
<Fence/> <!-- 围栏组件用于在地图上绘制区域边界 -->
<Filter/> <!-- 筛选组件用于控制地图上不同类型标记点的显示/隐藏 -->
2025-10-12 17:04:18 +08:00
</div>
</div>
</template>
<style scoped>
/**
* 地图组件样式定义
* 设置地图容器的基本布局样式
*/
2025-10-12 17:04:18 +08:00
.wrapper {
width: 100%;
height: 100%;
position: relative; /* 相对定位,为子组件的绝对定位提供基准 */
2025-10-12 17:04:18 +08:00
}
#mapContainer {
width: 100%;
height: 100%; /* 使地图充满整个父容器 */
2025-10-12 17:04:18 +08:00
}
</style>