feature: 增加图层管理组件及相关逻辑(目前仅支持DataSource 和 ImageryLayer 的管理
parent
bb042154cd
commit
666dc130e2
@ -1,5 +0,0 @@
|
||||
export default class Airline {
|
||||
constructor(points) {
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,96 @@
|
||||
<script setup lang="ts">
|
||||
import {Menu} from "@vicons/ionicons5";
|
||||
import {useLayerStore} from "@/store/layerManagerStore.ts";
|
||||
import {ref} from "vue";
|
||||
let layerShow = ref(true)
|
||||
let layer: {name:string,id:string} = {
|
||||
name:'', id:''
|
||||
}
|
||||
let itemOptions = [
|
||||
{label: "移除图层", key: 'remove'},
|
||||
{label: "缩放至图层", key: 'lookAt'},
|
||||
{label: "移至顶层", key: 'moveTop'},
|
||||
{label: "移至底层", key: 'moveBottom'},
|
||||
]
|
||||
function handleLayerItem(key:any) {
|
||||
useLayerStore().Layers.forEach((layer) => {
|
||||
if (layer.lName == props.lname && layer.lId == props?.lid) {
|
||||
switch (key) {
|
||||
case 'remove': {
|
||||
if(layer.dataSource){
|
||||
layer.dataSource.then((ds)=>{
|
||||
window.viewer.dataSources.remove(ds)
|
||||
})
|
||||
}
|
||||
if(layer.imageLayer){
|
||||
window.viewer.imageryLayers.remove(layer.imageLayer)
|
||||
}
|
||||
break
|
||||
}
|
||||
case 'lookAt': {
|
||||
if(layer.dataSource) window.viewer.flyTo(layer.dataSource)
|
||||
if(layer.imageLayer) window.viewer.flyTo(layer.imageLayer)
|
||||
break
|
||||
}
|
||||
case 'moveTop': {
|
||||
//TODO:
|
||||
break
|
||||
}
|
||||
case 'moveBottom': {
|
||||
// TODO:
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
const props = defineProps<{ lname: String, lid?: String }>()
|
||||
function onCheck(checked: boolean) {
|
||||
useLayerStore().Layers.forEach((layer) => {
|
||||
if (layer.lName == props.lname && layer.lId == props?.lid) {
|
||||
if(checked){
|
||||
// 选中事件
|
||||
if(layer.dataSource) { // dataSource视Promise对象
|
||||
layer.dataSource.then((ds)=>{
|
||||
ds.show = true
|
||||
})
|
||||
}
|
||||
if(layer.imageLayer) layer.imageLayer.show = true
|
||||
window.viewer.flyTo(layer.dataSource);
|
||||
}
|
||||
else{ //取消选中 隐藏图层
|
||||
if(layer.dataSource) {
|
||||
layer.dataSource.then((ds)=>{
|
||||
ds.show = false
|
||||
})
|
||||
}
|
||||
if(layer.imageLayer) layer.imageLayer.show = false
|
||||
window.viewer.scene.requestRender()
|
||||
layer.show = false
|
||||
}
|
||||
}
|
||||
})
|
||||
layerShow.value = !layerShow.value
|
||||
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<n-row justify-content="space-between" style="align-items: center; border-bottom: 1px solid #e7e6e6">
|
||||
<n-checkbox size="medium" :label="props.lname" style="margin: 0 0 0 1rem;"
|
||||
:checked="layerShow" @update:checked="onCheck"/>
|
||||
|
||||
<n-dropdown :options="itemOptions" @select="handleLayerItem">
|
||||
<n-button tertiary type="success" size="medium">
|
||||
<template #icon>
|
||||
<n-icon><Menu/></n-icon>
|
||||
</template>
|
||||
</n-button>
|
||||
</n-dropdown>
|
||||
</n-row>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
@ -0,0 +1,30 @@
|
||||
import {defineStore} from "pinia";
|
||||
type layer = {
|
||||
lName: string
|
||||
lId: string
|
||||
dataSource?: any
|
||||
imageLayer?: any
|
||||
show: boolean
|
||||
}
|
||||
|
||||
export const useLayerStore = defineStore('LayerStore', {
|
||||
state: ()=>{
|
||||
return {
|
||||
Layers: [] as layer[]
|
||||
}
|
||||
},
|
||||
actions: {
|
||||
addLayer(lName: string,dataSource?:any,imageLayer?: any,show=true) {
|
||||
let time = new Date()
|
||||
|
||||
let layer: layer = {
|
||||
dataSource: dataSource,
|
||||
imageLayer: imageLayer,
|
||||
lId: time.getTime().toString(),
|
||||
lName: lName,
|
||||
show: show
|
||||
}
|
||||
this.Layers.push(layer)
|
||||
}
|
||||
}
|
||||
})
|
Loading…
Reference in New Issue