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