diff --git a/src/component/map/AdministrativeDivision.vue b/src/component/map/AdministrativeDivision.vue index 1fcf732..03b9a75 100644 --- a/src/component/map/AdministrativeDivision.vue +++ b/src/component/map/AdministrativeDivision.vue @@ -4,72 +4,14 @@ - - - diff --git a/src/component/rain-earthquake/RiskPointComponent.vue b/src/component/rain-earthquake/RiskPointComponent.vue index 7f12ac9..18911c7 100644 --- a/src/component/rain-earthquake/RiskPointComponent.vue +++ b/src/component/rain-earthquake/RiskPointComponent.vue @@ -34,28 +34,17 @@ import { useViewerStore } from '@/stores/useViewerStore'; import { useLoadingInformationStore } from '@/stores/useLoadingInformation'; import { CesiumUtilsSingleton } from '@/utils/cesium/CesiumUtils'; - import { riskAreaIcon } from '@/assets'; + import { useRiskPoint } from '@/hooks/rain-earthquake/useRiskPoint'; const riskPoints = ref([]); - const informationBoxTitle = '风险区域'; + // 信息框相关配置 const offsetX = ref(0); const offsetY = ref(0); const riskPointDetail = ref(); - const field = { - riskName: '风险区名称', - unitCode: '统一编号', - housing: '住房(间)', - permanentPopulation: '常住人口(人)', - residentCounts: '居民户数(户)', - riskProperty: '威胁财产(万元)', - inspectorName: '巡查员姓名', - inspectorTele: '巡查员手机号', - position: '位置', - lon: '经度', - lat: '纬度', - }; + // 获取钩子函数 + const { informationBoxTitle, field, getDisasterIcon } = useRiskPoint(); $api.riskSpots.getBasePoins().then((res) => { riskPoints.value = res.data; @@ -100,10 +89,4 @@ ); - - diff --git a/src/hooks/map/useAdministrativeDivision.ts b/src/hooks/map/useAdministrativeDivision.ts new file mode 100644 index 0000000..78f9b9f --- /dev/null +++ b/src/hooks/map/useAdministrativeDivision.ts @@ -0,0 +1,68 @@ +import { + baQiao, + beiLin, + changAn, + gaoLing, + huYi, + lanTian, + lianHu, + linTong, + weiYang, + xinCheng, + yanLiang, + yanTa, + zhouZhi, +} from '@/assets'; +import { Color } from 'cesium'; + +export const useAdministrativeDivision = () => { + const areas = [ + baQiao, + beiLin, + changAn, + gaoLing, + huYi, + lanTian, + lianHu, + linTong, + weiYang, + xinCheng, + yanLiang, + yanTa, + zhouZhi, + ]; + const areasId = [ + 'baqiao', + 'beilin', + 'changan', + 'gaoling', + 'huyi', + 'lantian', + 'lianhu', + 'lintong', + 'weiyang', + 'xincheng', + 'yanliang', + 'yanta', + 'zhouzhi', + ]; + const areasColor = [ + new Color(255 / 255, 153 / 255, 0 / 255), + new Color(255 / 255, 51 / 255, 102 / 255), + new Color(0 / 255, 178 / 255, 255 / 255), + new Color(102 / 255, 255 / 255, 102 / 255), + new Color(204 / 255, 102 / 255, 255 / 255), + new Color(255 / 255, 204 / 255, 0 / 255), + new Color(0 / 255, 204 / 255, 153 / 255), + new Color(255 / 255, 102 / 255, 102 / 255), + new Color(102 / 255, 153 / 255, 255 / 255), + new Color(255 / 255, 178 / 255, 102 / 255), + new Color(153 / 255, 255 / 255, 204 / 255), + new Color(255 / 255, 153 / 255, 204 / 255), + new Color(190 / 255, 255 / 255, 232 / 255), + ]; + const areaTransparency = 0.3; + const labelTransparency = 1; + + return { areas, areasId, areasColor, areaTransparency, labelTransparency }; +}; diff --git a/src/hooks/map/useMap.ts b/src/hooks/map/useMap.ts new file mode 100644 index 0000000..ac57564 --- /dev/null +++ b/src/hooks/map/useMap.ts @@ -0,0 +1,78 @@ +import config from '@/config/config.json'; +import { CesiumUtilsSingleton } from '@/utils/cesium/CesiumUtils'; +import { ScreenSpaceEventType } from 'cesium'; +import type { ClickObject } from '@/types/cesium/ClickObject'; +import { useLoadingInformationStore } from '@/stores/useLoadingInformation'; +export const useMap = () => { + // 注册全局点击监听器 + const registerAndClickOnTheListener = () => { + CesiumUtilsSingleton.clickLayer((pickedObject: ClickObject) => { + if ( + pickedObject && + pickedObject.id && + typeof pickedObject.id === 'string' + ) { + const matchResult = pickedObject.id.match(/\d+$/); + const id = matchResult ? parseInt(matchResult[0]) : -1; + + // 当id改变时候,重置状态 + if ( + useLoadingInformationStore().getHiddenPointId() !== id && + useLoadingInformationStore().getRiskPointId() !== id + ) { + useLoadingInformationStore().resetStatue(); + } + + // 点击对象 + useLoadingInformationStore().setClickObject(pickedObject); + + // 隐患点 + if (pickedObject.id.startsWith(config.prefix.hiddenDangerPointId)) { + useLoadingInformationStore().setHiddenPointId(id); + } + + // 风险点 + else if (pickedObject.id.startsWith(config.prefix.riskPointId)) { + useLoadingInformationStore().setRiskPointId(id); + } else { + // 重置状态 + useLoadingInformationStore().resetStatue(); + } + } else { + // 重置状态 + useLoadingInformationStore().resetStatue(); + } + }); + }; + + // 注册全局滚轮监听器 + const registerAScrollListener = () => { + CesiumUtilsSingleton.getViewer()!.scene.canvas.addEventListener( + 'wheel', + () => { + // 设置最小最大高度 + CesiumUtilsSingleton.setHeightLimits(); + } + ); + }; + + // 当行政区超出页面时,自动拉回视角 + const automaticallyAdjustThePerspective = () => { + CesiumUtilsSingleton.outOverView(); + }; + + // 禁止事件 + const prohibitedEvents = () => { + // 禁止全局默认双击事件 + CesiumUtilsSingleton.getViewer()?.cesiumWidget.screenSpaceEventHandler.removeInputAction( + ScreenSpaceEventType.LEFT_DOUBLE_CLICK + ); + }; + + return { + registerAndClickOnTheListener, + registerAScrollListener, + automaticallyAdjustThePerspective, + prohibitedEvents, + }; +}; diff --git a/src/hooks/rain-earthquake/useHiddenPoint.ts b/src/hooks/rain-earthquake/useHiddenPoint.ts new file mode 100644 index 0000000..a7c341b --- /dev/null +++ b/src/hooks/rain-earthquake/useHiddenPoint.ts @@ -0,0 +1,34 @@ +import { + debrisFlowIcon, + flashFloodIcon, + landslideIcon, + waterLoggingIcon, +} from '@/assets'; + +export const useHiddenPoint = () => { + const field = { + fieldCode: '野外编号', + disasterName: '灾害点名称', + position: '位置', + disasterType: '灾害类型', + scaleGrade: '规模等级', + riskGrade: '风险等级', + }; + + function getDisasterIcon(disasterType?: string): string { + switch (disasterType) { + case '滑坡': + return landslideIcon; + case '泥石流': + return debrisFlowIcon; + case '内涝': + return waterLoggingIcon; + case '山洪': + return flashFloodIcon; + default: + throw new Error(`未知的灾害类型: ${disasterType}`); + } + } + + return { field, getDisasterIcon }; +}; diff --git a/src/hooks/rain-earthquake/useRiskPoint.ts b/src/hooks/rain-earthquake/useRiskPoint.ts new file mode 100644 index 0000000..7eda9f9 --- /dev/null +++ b/src/hooks/rain-earthquake/useRiskPoint.ts @@ -0,0 +1,26 @@ +import { riskAreaIcon } from '@/assets'; + +export const useRiskPoint = () => { + // 信息框标题 + const informationBoxTitle = '风险区域'; + + const field = { + riskName: '风险区名称', + unitCode: '统一编号', + housing: '住房(间)', + permanentPopulation: '常住人口(人)', + residentCounts: '居民户数(户)', + riskProperty: '威胁财产(万元)', + inspectorName: '巡查员姓名', + inspectorTele: '巡查员手机号', + position: '位置', + lon: '经度', + lat: '纬度', + }; + + function getDisasterIcon(): string { + return riskAreaIcon; + } + + return { informationBoxTitle, field, getDisasterIcon }; +}; diff --git a/src/hooks/rainstorm/useRainDisasterChain.ts b/src/hooks/rainstorm/useRainDisasterChain.ts index b03ae4b..05a22d9 100644 --- a/src/hooks/rainstorm/useRainDisasterChain.ts +++ b/src/hooks/rainstorm/useRainDisasterChain.ts @@ -4,7 +4,7 @@ import { HiddenPointType } from '@/types/common/DisasterType'; import type { PaginationType } from '@/types/common/PaginationType'; // 灾害链影响点列表钩子函数 -export function useRainDisasterChain() { +export const useRainDisasterChain = () => { // 搜索条件 const conditions = ref({ tableData: '', @@ -70,4 +70,4 @@ export function useRainDisasterChain() { changeConditions, changeCurrentPage, }; -} +}; diff --git a/src/hooks/rainstorm/useRainLegend.ts b/src/hooks/rainstorm/useRainLegend.ts index 3013e74..ced983f 100644 --- a/src/hooks/rainstorm/useRainLegend.ts +++ b/src/hooks/rainstorm/useRainLegend.ts @@ -7,7 +7,7 @@ import { } from '@/assets'; // 引入图例钩子函数 -export function useRainLegend() { +export const useRainLegend = () => { // 图例数据 const legendList = [ { name: '滑坡隐患点', link: landslideIcon }, @@ -18,4 +18,4 @@ export function useRainLegend() { ]; return { legendList }; -} +}; diff --git a/src/hooks/useIndex.ts b/src/hooks/useIndex.ts new file mode 100644 index 0000000..bcdf7f6 --- /dev/null +++ b/src/hooks/useIndex.ts @@ -0,0 +1,25 @@ +import { useRoute } from 'vue-router'; + +export const useIndex = () => { + const route = useRoute(); + + const topNavMap = [ + { title: '暴雨灾害链', name: 'rainstorm', query: { identification: 1 } }, + { title: '地震灾害链', name: 'earthquake', query: { identification: 2 } }, + { title: '多灾种灾害链分析', name: 'index', query: { identification: 3 } }, + { title: '灾害链情景推演', name: 'index', query: { identification: 4 } }, + { title: '数据管理', name: 'index', query: { identification: 5 } }, + { title: '文件管理', name: 'index', query: { identification: 6 } }, + ]; + + // 判断当前导航项是否激活 + const isActive = (identification: number) => { + const targetId = identification.toString(); + let currentId = route.query.identification; + if (!currentId) return targetId === '1'; + if (Array.isArray(currentId)) currentId = currentId[0]; + return currentId === targetId || route.query.identification === targetId; + }; + + return { topNavMap, isActive }; +}; diff --git a/src/views/IndexView.vue b/src/views/IndexView.vue index fa139ef..0c5b5d3 100644 --- a/src/views/IndexView.vue +++ b/src/views/IndexView.vue @@ -29,30 +29,12 @@