2025-11-16 14:43:35 +08:00
|
|
|
<template>
|
|
|
|
|
<div class="map-viewer">
|
2025-11-17 11:12:56 +08:00
|
|
|
<!-- Cesium 地图容器 -->
|
|
|
|
|
<MapViewport />
|
2025-11-16 14:43:35 +08:00
|
|
|
|
2025-11-17 11:12:56 +08:00
|
|
|
<!-- 地图控制工具 - 使用 Teleport 传送到更高层级 -->
|
|
|
|
|
<!-- 延迟渲染确保目标元素已存在 -->
|
|
|
|
|
<Teleport to="#sa-controls" v-if="isMounted">
|
2025-11-16 14:43:35 +08:00
|
|
|
<MapControls />
|
2025-11-17 11:12:56 +08:00
|
|
|
</Teleport>
|
2025-11-16 14:43:35 +08:00
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup>
|
2025-11-17 11:12:56 +08:00
|
|
|
import { ref, onMounted } from 'vue'
|
|
|
|
|
import { MapViewport } from '@/map'
|
2025-11-16 14:43:35 +08:00
|
|
|
import MapControls from './MapControls.vue'
|
|
|
|
|
|
2025-11-17 11:12:56 +08:00
|
|
|
// 延迟标志,确保 Teleport 目标元素已存在
|
|
|
|
|
const isMounted = ref(false)
|
2025-11-16 14:43:35 +08:00
|
|
|
|
2025-11-17 11:12:56 +08:00
|
|
|
onMounted(() => {
|
|
|
|
|
// 使用 nextTick 确保 DOM 完全渲染
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
isMounted.value = true
|
|
|
|
|
}, 0)
|
|
|
|
|
})
|
2025-11-16 14:43:35 +08:00
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style scoped lang="scss">
|
|
|
|
|
@use '@/styles/mixins.scss' as *;
|
|
|
|
|
@use '../../assets/styles/common.scss' as *;
|
|
|
|
|
|
|
|
|
|
.map-viewer {
|
|
|
|
|
position: relative;
|
2025-11-17 11:12:56 +08:00
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
2025-11-16 14:43:35 +08:00
|
|
|
|
2025-11-17 11:12:56 +08:00
|
|
|
// MapViewport 会自动填满父容器
|
|
|
|
|
// 地图相关的样式由 MapViewport 组件内部处理
|
2025-11-16 14:43:35 +08:00
|
|
|
}
|
|
|
|
|
</style>
|