2026-03-31 14:17:30 +08:00
|
|
|
<template>
|
2026-04-02 08:56:49 +08:00
|
|
|
<div class="map-controller" :style="{ right: drawerOpen ? '480px' : '12px' }">
|
2026-04-02 13:51:36 +08:00
|
|
|
<div class="map-controller-group" v-for="item in controllers">
|
|
|
|
|
<a-tooltip
|
|
|
|
|
:title="child.name"
|
|
|
|
|
:placement="child.key === 'Calculate' ? 'right' : 'left'"
|
|
|
|
|
v-for="child in item.children"
|
|
|
|
|
:key="child.key"
|
|
|
|
|
>
|
|
|
|
|
<component v-if="child.component" :is="child.component" />
|
|
|
|
|
<div v-else class="map-controller-item" @click="handleControllerClick(child)">
|
|
|
|
|
<i class="icon iconfont" :class="'icon-' + child.icon"></i>
|
2026-04-02 09:27:56 +08:00
|
|
|
</div>
|
|
|
|
|
</a-tooltip>
|
2026-03-31 14:17:30 +08:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
<script setup lang="ts">
|
2026-04-02 13:51:36 +08:00
|
|
|
import { ref, watch, computed } from "vue";
|
2026-04-02 08:56:49 +08:00
|
|
|
import { useUiStore } from "@/store/modules/ui";
|
2026-04-02 13:51:36 +08:00
|
|
|
import Calculate from "./Calculate.vue";
|
|
|
|
|
import LayerController from "./LayerController.vue";
|
2026-04-02 08:56:49 +08:00
|
|
|
|
|
|
|
|
// 使用 Pinia store
|
|
|
|
|
const uiStore = useUiStore();
|
|
|
|
|
const drawerOpen = ref(uiStore.drawerOpen);
|
|
|
|
|
|
|
|
|
|
// 监听 store 中的 drawerOpen 变化
|
2026-04-02 09:27:56 +08:00
|
|
|
watch(
|
|
|
|
|
() => uiStore.drawerOpen,
|
|
|
|
|
(newVal) => {
|
|
|
|
|
drawerOpen.value = newVal;
|
|
|
|
|
}
|
|
|
|
|
);
|
2026-04-02 08:56:49 +08:00
|
|
|
|
2026-03-31 14:17:30 +08:00
|
|
|
const isFullScreen = ref(false);
|
|
|
|
|
const mapType = ref("2D");
|
2026-04-02 08:56:49 +08:00
|
|
|
|
|
|
|
|
// 响应式的控制器配置
|
2026-04-02 13:51:36 +08:00
|
|
|
const controllers: any = computed(() => [
|
2026-03-31 14:17:30 +08:00
|
|
|
{
|
2026-04-02 09:27:56 +08:00
|
|
|
children: [
|
|
|
|
|
{
|
|
|
|
|
name: "全屏",
|
|
|
|
|
key: "fullScreen",
|
|
|
|
|
icon: isFullScreen.value ? "exitFullScreen" : "fullScreen",
|
|
|
|
|
},
|
|
|
|
|
],
|
2026-03-31 14:17:30 +08:00
|
|
|
},
|
2026-04-02 09:27:56 +08:00
|
|
|
|
2026-03-31 14:17:30 +08:00
|
|
|
{
|
2026-04-02 09:27:56 +08:00
|
|
|
children: [
|
2026-04-02 13:51:36 +08:00
|
|
|
// {
|
|
|
|
|
// name: "定位",
|
|
|
|
|
// key: "positioning",
|
|
|
|
|
// icon: "iconGlobal",
|
|
|
|
|
// },
|
2026-04-02 09:27:56 +08:00
|
|
|
{
|
|
|
|
|
name: "放大",
|
|
|
|
|
key: "zoomIn",
|
|
|
|
|
icon: "zoomIn",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "缩小",
|
|
|
|
|
key: "zoomOut",
|
|
|
|
|
icon: "zoomOut",
|
|
|
|
|
},
|
|
|
|
|
],
|
2026-03-31 14:17:30 +08:00
|
|
|
},
|
|
|
|
|
{
|
2026-04-02 13:51:36 +08:00
|
|
|
children: [
|
|
|
|
|
{
|
|
|
|
|
name: "3D",
|
|
|
|
|
key: "dim",
|
|
|
|
|
icon: mapType.value === "2D" ? "a-3D" : "a-2D",
|
|
|
|
|
},
|
|
|
|
|
],
|
2026-03-31 14:17:30 +08:00
|
|
|
},
|
|
|
|
|
{
|
2026-04-02 13:51:36 +08:00
|
|
|
children: [
|
|
|
|
|
{
|
|
|
|
|
name: "图层管理",
|
|
|
|
|
key: "layerController",
|
|
|
|
|
component: LayerController,
|
|
|
|
|
},
|
|
|
|
|
],
|
2026-03-31 14:17:30 +08:00
|
|
|
},
|
|
|
|
|
{
|
2026-04-02 13:51:36 +08:00
|
|
|
children: [
|
|
|
|
|
{
|
|
|
|
|
name: "测量工具",
|
|
|
|
|
key: "Calculate",
|
|
|
|
|
component: Calculate,
|
|
|
|
|
},
|
|
|
|
|
],
|
2026-03-31 14:17:30 +08:00
|
|
|
},
|
|
|
|
|
{
|
2026-04-02 13:51:36 +08:00
|
|
|
children: [
|
|
|
|
|
{
|
|
|
|
|
name: "梯级",
|
|
|
|
|
key: "TJ",
|
|
|
|
|
icon: "tiji",
|
|
|
|
|
},
|
|
|
|
|
],
|
2026-03-31 14:17:30 +08:00
|
|
|
},
|
|
|
|
|
{
|
2026-04-02 13:51:36 +08:00
|
|
|
children: [
|
|
|
|
|
{
|
|
|
|
|
name: "下载",
|
|
|
|
|
key: "screenShot",
|
|
|
|
|
icon: "downLoad",
|
|
|
|
|
},
|
|
|
|
|
],
|
2026-03-31 14:17:30 +08:00
|
|
|
},
|
2026-04-02 13:51:36 +08:00
|
|
|
|
|
|
|
|
// {
|
|
|
|
|
// name: "倾斜摄影",
|
|
|
|
|
// key: "OSBGController",
|
|
|
|
|
// icon: "obliquePhotography",
|
|
|
|
|
// },
|
|
|
|
|
// {
|
|
|
|
|
// name: "三维漫游",
|
|
|
|
|
// key: "threedRoam",
|
|
|
|
|
// icon: "roaming",
|
|
|
|
|
// },
|
2026-03-31 14:17:30 +08:00
|
|
|
]);
|
2026-04-02 13:51:36 +08:00
|
|
|
|
|
|
|
|
// 添加全屏切换功能
|
|
|
|
|
const toggleFullScreen = () => {
|
|
|
|
|
isFullScreen.value = !isFullScreen.value;
|
|
|
|
|
// 这里可以添加实际的浏览器全屏切换逻辑
|
|
|
|
|
if (isFullScreen.value) {
|
|
|
|
|
document.documentElement.requestFullscreen();
|
|
|
|
|
} else {
|
|
|
|
|
document.exitFullscreen();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 控制器点击事件处理
|
|
|
|
|
const handleControllerClick = (item: any) => {
|
|
|
|
|
switch (item.key) {
|
|
|
|
|
case "fullScreen":
|
|
|
|
|
toggleFullScreen();
|
|
|
|
|
break;
|
|
|
|
|
case "rightDrawer":
|
|
|
|
|
// 使用全局事件切换右侧面板
|
|
|
|
|
// GlobalEvents.get('rightDrawerState').set(!drawerOpen);
|
|
|
|
|
break;
|
|
|
|
|
// 可以在这里添加其他控制器的处理逻辑
|
|
|
|
|
default:
|
|
|
|
|
console.log(`点击了控制器: ${item.name}`);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
};
|
2026-03-31 14:17:30 +08:00
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
|
|
.map-controller {
|
|
|
|
|
position: absolute;
|
|
|
|
|
right: 480px;
|
|
|
|
|
bottom: 114px;
|
|
|
|
|
z-index: 10;
|
|
|
|
|
.map-controller-group {
|
|
|
|
|
box-shadow: 0 1px 2px #00000026;
|
|
|
|
|
background-color: #fff;
|
|
|
|
|
border: none;
|
|
|
|
|
.map-controller-item {
|
|
|
|
|
height: 40px;
|
|
|
|
|
width: 40px;
|
|
|
|
|
color: #000;
|
|
|
|
|
line-height: 40px;
|
|
|
|
|
text-align: center;
|
|
|
|
|
position: relative;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
.iconfont {
|
|
|
|
|
font-size: 20px;
|
|
|
|
|
}
|
|
|
|
|
&:hover {
|
|
|
|
|
background-color: #005292;
|
|
|
|
|
color: #ffffff;
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-04-02 13:51:36 +08:00
|
|
|
}
|
|
|
|
|
.map-controller-group:not(:first-child) {
|
|
|
|
|
margin-top: 10px;
|
2026-03-31 14:17:30 +08:00
|
|
|
}
|
|
|
|
|
}
|
2026-04-02 09:27:56 +08:00
|
|
|
</style>
|