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