src/components/chat/chatComponents/summaryCom/components/recordSetTable/map/LayerControl.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/components/chat/smallChat/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/model/map/OLMap.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/components/chat/chatComponents/summaryCom/components/recordSetTable/map/LayerControl.vue
@@ -76,7 +76,7 @@ <script setup lang="ts"> import { Close } from '@element-plus/icons-vue'; import { ElTree } from 'element-plus'; import { onMounted, ref, watch } from 'vue'; import { computed, onMounted, ref, watch } from 'vue'; import { useDrag } from '/@/hooks/useDrag'; import type { OLMap } from '/@/model/map/OLMap'; import { GaoDeSourceType, gaoDeSourceTypeMap, OverlayType } from '/@/model/map/OLMap'; @@ -100,7 +100,7 @@ const activeSourceType = ref(props.olMap.activeSourceType); const changeSourceType = (val: GaoDeSourceType) => { props.olMap.setSourceUrl(val); props.olMap.applySourceType(val); }; const overlayTreeRef = ref<InstanceType<typeof ElTree>>(); @@ -120,15 +120,31 @@ }); }; const setTreeChecked = (checked: boolean) => { treeData.value.forEach((item) => { if (checked) { overlayTreeRef.value?.setCheckedKeys([ROOT_OVERLAY_TYPE.Marker]); } else { overlayTreeRef.value?.setCheckedKeys([]); } }); }; let isHumanCheckTrigger = false; watch( () => props.olMap.markerIsVisible.value, (val) => { if (isHumanCheckTrigger) { isHumanCheckTrigger = false; return; } setTreeChecked(val); } ); const handleNodeClick = (data: any, node: any) => { if (data.id === ROOT_OVERLAY_TYPE.Marker) { const overlays = props.olMap.map.getOverlays().getArray(); const filteredOverlays = overlays.filter((overlay) => { const type = overlay.get('type'); return type === OverlayType.Marker; }); props.olMap.adjustViewToOverlays(filteredOverlays); props.olMap.adjustViewToMarkers(); } }; @@ -152,6 +168,7 @@ }; const handleCheck = (data: any, node: any) => { const checkedKeys = node.checkedKeys; isHumanCheckTrigger = true; const isVisible = checkedKeys.includes(ROOT_OVERLAY_TYPE.Marker); props.olMap.toggleMarkerOverlayVisible(isVisible); }; src/components/chat/smallChat/index.vue
@@ -84,7 +84,7 @@ import { AssistantContent } from './types'; import { agentStreamByPost } from '/@/api/ai/chat'; import { Logger } from '/@/model/logger/Logger'; import type { OLMap } from '/@/model/map/OLMap'; import { GaoDeSourceType, gaoDeSourceTypeMap, type OLMap } from '/@/model/map/OLMap'; import assistantPic from '/static/images/role/assistant-200x192.png'; import userPic from '/static/images/role/user-200x206.png'; import { useDrag } from '/@/hooks/useDrag'; @@ -103,7 +103,11 @@ const chatContainerRef = ref<HTMLDivElement>(null); const { startDrag, style: chatContainerStyle, handleStyle } = useDrag({ const { startDrag, style: chatContainerStyle, handleStyle, } = useDrag({ handle: chatHeaderRef, }); @@ -118,10 +122,35 @@ return result as ChatMessage<AssistantContent>; }; const mockCommand = (question: string) => { if (question === `切换${gaoDeSourceTypeMap[GaoDeSourceType.Vector]}`) { handleMapCommand({ operate: '切换标准地图' }); return; } else if (question === `切换${gaoDeSourceTypeMap[GaoDeSourceType.Satellite]}`) { handleMapCommand({ operate: '切换卫星地图' }); return; } else if (question === `切换${gaoDeSourceTypeMap[GaoDeSourceType.SatelliteRoad]}`) { handleMapCommand({ operate: '切换路网地图' }); return; } else if (question === '显示设备') { handleMapCommand({ operate: '显示设备' }); return; } else if (question === '隐藏设备') { handleMapCommand({ operate: '隐藏设备' }); return; } else if (question === '聚焦设备') { handleMapCommand({ operate: '聚焦设备' }); return; } } const startStream = (question: string) => { if (lastIsInit) { showHistory.value = false; } // mockCommand(question); // return; let haveMapOperate = false; agentStreamByPost( { @@ -157,6 +186,7 @@ last.content.isLoading = content.isLoading; } }; const handleMapCommand = (command: any) => { if (!command) return; switch (command.operate) { @@ -166,6 +196,26 @@ case '缩小': props.olMap.zoomOut(); break; case `切换${gaoDeSourceTypeMap[GaoDeSourceType.Vector]}`: props.olMap.setSourceType(GaoDeSourceType.Vector); break; case `切换${gaoDeSourceTypeMap[GaoDeSourceType.Satellite]}`: props.olMap.setSourceType(GaoDeSourceType.Satellite); break; case `切换${gaoDeSourceTypeMap[GaoDeSourceType.SatelliteRoad]}`: props.olMap.setSourceType(GaoDeSourceType.SatelliteRoad); break; case '显示设备': props.olMap.toggleMarkerOverlayVisible(true); break; case '隐藏设备': props.olMap.toggleMarkerOverlayVisible(false); break; case '聚焦设备': props.olMap.adjustViewToMarkers(); break; } refreshAssistantMessage({ value: `已执行操作: ${command.operate}` }); @@ -215,7 +265,7 @@ const [userMessage, assistantMessage] = applyMessage(); const question = inputText.value; inputText.value = ''; startStream(question); }; src/model/map/OLMap.ts
@@ -1,7 +1,6 @@ import { defaultsDeep } from 'lodash-es'; import type { Overlay } from 'ol'; import { Map as OpenLayerMap, View } from 'ol'; import { ZoomSlider } from 'ol/control'; import type { Extent } from 'ol/extent'; import { getTopLeft, getWidth } from 'ol/extent'; import Tile from 'ol/layer/Tile'; @@ -121,14 +120,19 @@ }); this.activeSourceType.value = sourceType; this.markerIsVisible.value = markerIsVisible; this.setSourceUrl(this.activeSourceType.value); this.applySourceType(this.activeSourceType.value); this.listenMapClick(); this.addBasicControl(); } setSourceUrl(type: GaoDeSourceType = GaoDeSourceType.Vector) { applySourceType(type: GaoDeSourceType = GaoDeSourceType.Vector) { const url = getGaoDeSourceUrl(type); this.source.setUrl(url); } setSourceType(type: GaoDeSourceType = GaoDeSourceType.Vector) { this.activeSourceType.value = type; this.applySourceType(type); } addMarkerLayer(dataList: any[], options: any) { const { markerOpt } = options; @@ -194,6 +198,16 @@ return overlay; } adjustViewToMarkers() { const overlays = this.map.getOverlays().getArray(); const filteredOverlays = overlays.filter((overlay) => { const type = overlay.get('type'); return type === OverlayType.Marker; }); this.adjustViewToOverlays(filteredOverlays); } adjustViewToOverlays(overlays: Overlay[]) { if (overlays.length === 0) return; const extent = overlays.reduce<number[] | null>((ext, item) => { @@ -254,7 +268,7 @@ setConfig(config: MapConfig) { this.activeSourceType.value = config.sourceType; this.markerIsVisible.value = config.markerIsVisible; this.setSourceUrl(this.activeSourceType.value); this.applySourceType(this.activeSourceType.value); this.toggleMarkerOverlayVisible(this.markerIsVisible.value); }