From da0d06cb06ef3fc55d88cb4a9a52505ac35c03e6 Mon Sep 17 00:00:00 2001 From: feiyu02 <risaku@163.com> Date: 星期三, 26 三月 2025 15:12:31 +0800 Subject: [PATCH] 走航融合(待完成) --- src/model/SatelliteGrid.js | 20 ++ src/api/index.js | 4 src/views/underwaymix/UnderwayMixMode.vue | 409 ++++++++++++++++++++++++++++----------------- src/api/gridApi.js | 15 + src/components.d.ts | 1 src/views/underwaymix/component/GridStyleTool.vue | 42 ++++ 6 files changed, 333 insertions(+), 158 deletions(-) diff --git a/src/api/gridApi.js b/src/api/gridApi.js index 8abfe14..83a8c4d 100644 --- a/src/api/gridApi.js +++ b/src/api/gridApi.js @@ -148,5 +148,20 @@ return $http.get(`air/satellite/import/grid/aod/download/template`, { responseType: 'blob' }); + }, + + buildUnderwayHeatmap(groupId, gridDataDetailList, searchLength) { + return $http + .post( + `air/satellite/product/underway/heatmap/build`, + gridDataDetailList, + { + params: { + groupId: groupId, + searchLength: 4 + } + } + ) + .then((res) => res.data); } }; diff --git a/src/api/index.js b/src/api/index.js index c19983c..d3d4da3 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -1,7 +1,7 @@ import axios from 'axios'; import { ElMessage } from 'element-plus'; -const debug = false; +const debug = true; let ip1 = 'http://47.100.191.150:9029/'; // console.log(import.meta.env); @@ -10,7 +10,7 @@ } if (debug) { - ip1 = 'http://192.168.0.138:8084/'; + ip1 = 'http://192.168.0.110:8084/'; } const $http = axios.create({ diff --git a/src/components.d.ts b/src/components.d.ts index a0257ee..f0d1927 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -45,6 +45,7 @@ ElScrollbar: typeof import('element-plus/es')['ElScrollbar'] ElSelect: typeof import('element-plus/es')['ElSelect'] ElSlider: typeof import('element-plus/es')['ElSlider'] + ElSpace: typeof import('element-plus/es')['ElSpace'] ElSwitch: typeof import('element-plus/es')['ElSwitch'] ElTable: typeof import('element-plus/es')['ElTable'] ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] diff --git a/src/model/SatelliteGrid.js b/src/model/SatelliteGrid.js index cb547e9..ad01ca9 100644 --- a/src/model/SatelliteGrid.js +++ b/src/model/SatelliteGrid.js @@ -629,6 +629,26 @@ return heatTag; } + drawHeatGrid2(tag, headGridDataDetailList) { + const heatTag = `heat-${tag}`; + if (this.mapViewsMap.has(heatTag)) { + this.changeVisibility({ + tags: [heatTag], + showGridViews: true + }); + } else { + this.drawTagGrid({ + tag: heatTag, + data: headGridDataDetailList, + extData: { + name: `璧拌埅鐑姏鍥� - ${heatTag}`, + type: 2 + } + }); + } + return heatTag; + } + search(gdd, width, height, eachwidth, eachheight, searchLength) { function getCellWidthRange(cellId, width, height) { const total = width * height; diff --git a/src/views/underwaymix/UnderwayMixMode.vue b/src/views/underwaymix/UnderwayMixMode.vue index c0dbe9b..460355c 100644 --- a/src/views/underwaymix/UnderwayMixMode.vue +++ b/src/views/underwaymix/UnderwayMixMode.vue @@ -8,7 +8,7 @@ <template #content> <el-row> <el-form :inline="true"> - <el-form-item label="璧拌埅铻嶅悎"> + <!-- <el-form-item label="璧拌埅铻嶅悎"> <el-select v-model="selectedfusionData" multiple @@ -26,8 +26,8 @@ :value="i" /> </el-select> - </el-form-item> - <el-form-item> + </el-form-item> --> + <!-- <el-form-item> <el-button type="primary" class="el-button-custom" @@ -37,13 +37,125 @@ " @click="handleFusionClick" > - {{ '鍙犲姞铻嶅悎' }} + {{ '鍙犲姞璧拌埅' }} </el-button> - </el-form-item> + </el-form-item> --> </el-form> </el-row> + <div class="m-t-8">绛涢�夎緟鍔�</div> + <el-form :inline="false"> + <el-form-item label="鏃舵绛涢��"> + <el-select + v-model="selectedTimeSection" + multiple + clearable + placeholder="閫夋嫨鏃舵" + size="small" + style="width: 300px" + > + <el-option + v-for="(v, i) in timeSectionList" + :key="i" + :label="v" + :value="v" + /> + </el-select> + </el-form-item> + <el-form-item label="鍖哄煙绛涢��"> + <el-select + v-model="selectedZone" + multiple + clearable + placeholder="閫夋嫨鍖哄煙" + size="small" + style="width: 300px" + > + <el-option + v-for="(v, i) in zoneList" + :key="i" + :label="v" + :value="v" + /> + </el-select> + </el-form-item> + <el-form-item label="鑳屾櫙绛涢��"> + <el-select + v-model="selectedPollutionDegree" + multiple + clearable + placeholder="閫夋嫨鑳屾櫙" + size="small" + style="width: 300px" + > + <el-option + v-for="(v, i) in pollutionDegreeList" + :key="i" + :label="v" + :value="v" + /> + </el-select> + </el-form-item> + </el-form> + + <el-table + :data="showFusionDataList" + table-layout="fixed" + size="small" + :show-overflow-tooltip="true" + border + height="50vh" + row-class-name="t-row-normal" + cell-class-name="t-cell" + header-row-class-name="t-header-row" + header-cell-class-name="t-header-cell" + :highlight-current-row="false" + @row-click="handleRowClick" + @selection-change="handleSelectionChange" + > + <el-table-column type="selection" width="40" /> + <!-- <el-table-column + type="index" + label="搴忓彿" + width="30" + /> --> + <el-table-column + prop="dataTime" + label="鏃堕棿" + align="center" + :formatter="timeFormatter" + width="100" + /> + <el-table-column + prop="missionCode" + label="浠诲姟缂栧彿" + align="center" + width="150" + /> + <el-table-column + prop="zone" + label="鍖哄煙" + align="center" + width="50" + /> + <el-table-column + prop="pollutionDegree" + label="姹℃煋鑳屾櫙" + align="center" + width="50" + /> + </el-table> + <div class="m-t-8">鎿嶄綔</div> - <el-row class="m-t-8"> + <el-space class="m-t-8 m-b-8"> + <el-button + type="primary" + class="el-button-custom" + size="small" + :disabled="!gridCellList || selectedfusionData.length == 0" + @click="handleFusionClick" + > + {{ '鍙犲姞璧拌埅' }} + </el-button> <CheckButton active-text="寮�鍚瀺鍚�" inactive-text="闅愯棌铻嶅悎" @@ -51,80 +163,7 @@ @change="handleMixClick" > </CheckButton> - <CheckButton - :disabled="!mixActive" - active-text="椋庨櫓鐑姏鍥�" - inactive-text="椋庨櫓鐑姏鍥�" - :default-value="false" - @change="handleHeatMapClick" - > - </CheckButton> - <!-- <CheckButton - active-text="鎼滅储缃戞牸" - inactive-text="鎼滅储缃戞牸" - :default-value="false" - @change="handleHeatMapSearchClick" - > - </CheckButton> --> - </el-row> - <!-- <div class="m-t-8">缃戞牸瑕佺礌</div> - <el-row class="m-t-8"> - <CheckButton - active-text="鏄剧ず缃戞牸" - inactive-text="闅愯棌缃戞牸" - :default-value="true" - @change="handleGridClick" - > - </CheckButton> - <el-button - type="primary" - class="el-button-custom" - size="small" - @click="handleRankClick" - > - {{ rankVisible ? '闅愯棌鎺掑悕' : '鏄剧ず鎺掑悕' }} - </el-button> - <el-button - type="primary" - class="el-button-custom" - size="small" - @click="handleDataClick" - > - {{ dataVisible ? '闅愯棌鏁版嵁' : '鏄剧ず鏁版嵁' }} - </el-button> - </el-row> - <div class="m-t-8">缃戞牸鏍峰紡</div> - <el-row class="m-t-8"> - <el-button - type="primary" - class="el-button-custom" - size="small" - @click="handleOpacityClick" - > - {{ !isOpacity ? '閫忔槑鍖�' : '鍙栨秷閫忔槑鍖�' }} - </el-button> - <el-button - type="primary" - class="el-button-custom" - size="small" - @click="handleColorClick" - > - {{ isStandardColor ? '缁樺埗瀵规瘮鑹�' : '缁樺埗鏍囧噯鑹�' }} - </el-button> - </el-row> - <div class="m-t-8">璧拌埅瑕佺礌</div> - <el-row class="m-t-8"> - - <el-button - type="primary" - class="el-button-custom" - size="small" - :loading="missionLoading || loading" - @click="handleUnderwayClick" - > - {{ underwayVisible ? '闅愯棌璧拌埅璺嚎' : '鏄剧ず璧拌埅璺嚎' }} - </el-button> - </el-row> --> + </el-space> </template> <template #footer> </template> </BaseCard> @@ -181,6 +220,77 @@ const gridDataDetailMap = new Map(); +const selectedTimeSection = ref([]); +const selectedZone = ref([]); +const selectedPollutionDegree = ref([]); + +const timeSectionList = computed(() => { + const res = []; + fusionDataList.value.forEach((e) => { + const t = moment(e.dataTime).format('YYYY-MM-DD'); + if (res.indexOf(t) == -1) { + res.push(t); + } + }); + return res; +}); + +const zoneList = computed(() => { + const res = []; + fusionDataList.value.forEach((e) => { + const t = e.zone; + if (res.indexOf(t) == -1) { + res.push(t); + } + }); + return res; +}); + +const pollutionDegreeList = computed(() => { + const res = []; + fusionDataList.value.forEach((e) => { + const t = e.pollutionDegree; + if (res.indexOf(t) == -1) { + res.push(t); + } + }); + return res; +}); + +const showFusionDataList = computed(() => { + return fusionDataList.value.filter((v) => { + const b1 = + selectedTimeSection.value.length == 0 || + selectedTimeSection.value.indexOf( + moment(v.dataTime).format('YYYY-MM-DD') + ) != -1; + const b2 = + selectedZone.value.length == 0 || + selectedZone.value.indexOf(v.zone) != -1; + const b3 = + selectedPollutionDegree.value.length == 0 || + selectedPollutionDegree.value.indexOf(v.pollutionDegree) != -1; + + return b1 && b2 && b3; + }); +}); +// if ( +// selectedTimeSection.value.length == 0 && +// selectedZone.value.length == 0 && +// selectedPollutionDegree.value.length == 0 +// ) { +// return true; +// } else { +// const b1 = +// selectedTimeSection.value.indexOf( +// moment(v.dataTime).format('YYYY-MM-DD') +// ) != -1; +// const b2 = selectedZone.value.indexOf(v.zone) != -1; +// const b3 = selectedPollutionDegree.value.indexOf(v.pollutionDegree) != -1; + +// return b1 && b2 || b3; +// } + const mixActive = ref(false); const heatActive = ref(false); const gridVisible = ref(true); @@ -190,8 +300,8 @@ const isStandardColor = ref(true); const isOpacity = ref(false); -function timeFormatter(value) { - return moment(value).format('YYYY-MM-DD'); +function timeFormatter(row, col, cellValue, index) { + return moment(cellValue).format('YYYY-MM-DD'); } function fetchFusionData() { @@ -215,15 +325,6 @@ // } // }); // } - -function resetButton() { - gridVisible.value = true; - underwayVisible.value = false; - rankVisible.value = false; - dataVisible.value = false; - isStandardColor.value = true; - isOpacity.value = false; -} function prepareGrid(gridInfo) { satelliteGrid.gridPrepare(gridInfo, (polygon) => { @@ -281,7 +382,8 @@ // resetButton(); satelliteGrid.changeVisibility({ showGridViews: false }); selectedfusionData.value.forEach((i) => { - const d = fusionDataList.value[i]; + // const d = fusionDataList.value[i]; + const d = i; if (gridDataDetailMap.has(d.id)) { satelliteGrid.changeVisibility({ tags: [d.id], showGridViews: true }); // gridCtrls.value = Array.from(satelliteGrid.mapViewsMap); @@ -357,18 +459,34 @@ showRankTxt: false }); if (heatActive.value) { - heatTag = satelliteGrid.drawHeatGrid(mixTag); - satelliteGrid.setGridEvent( - [heatTag], - 'click', - (gridCell, gridDataDetail) => { - gridStore.selectedGridCellAndDataDetail = { - gridCell, - gridDataDetail - }; - } - ); - gridCtrls.value = [satelliteGrid]; + // heatTag = satelliteGrid.drawHeatGrid(mixTag); + // satelliteGrid.setGridEvent( + // [heatTag], + // 'click', + // (gridCell, gridDataDetail) => { + // gridStore.selectedGridCellAndDataDetail = { + // gridCell, + // gridDataDetail + // }; + // } + // ); + // gridCtrls.value = [satelliteGrid]; + + const data = satelliteGrid.gridDataDetailMap.get(mixTag); + gridApi.buildUnderwayHeatmap(3, data, 10).then((res) => { + heatTag = satelliteGrid.drawHeatGrid2(mixTag, res.data); + satelliteGrid.setGridEvent( + [heatTag], + 'click', + (gridCell, gridDataDetail) => { + gridStore.selectedGridCellAndDataDetail = { + gridCell, + gridDataDetail + }; + } + ); + gridCtrls.value = [satelliteGrid]; + }); } else { satelliteGrid.changeVisibility({ tags: [mixTag], @@ -394,17 +512,6 @@ console.log(res); } -function handleGridClick() { - gridVisible.value = !gridVisible.value; - selectedfusionData.value.forEach((i) => { - const d = fusionDataList.value[i]; - satelliteGrid.changeVisibility({ - tags: [d.id], - showGridViews: gridVisible.value - }); - }); -} - function handleUnderwayClick({ isShow, dataId }) { underwayVisible.value = !underwayVisible.value; @@ -419,46 +526,8 @@ } } -function handleRankClick() { - rankVisible.value = !rankVisible.value; - selectedfusionData.value.forEach((i) => { - const d = fusionDataList.value[i]; - satelliteGrid.changeVisibility({ - tags: [d.id], - showRankTxt: rankVisible.value - }); - }); -} - -function handleDataClick() { - dataVisible.value = !dataVisible.value; - selectedfusionData.value.forEach((i) => { - const d = fusionDataList.value[i]; - satelliteGrid.changeVisibility({ - tags: [d.id], - showDataTxt: dataVisible.value - }); - }); -} - -function handleColorClick() { - isStandardColor.value = !isStandardColor.value; - selectedfusionData.value.forEach((i) => { - const d = fusionDataList.value[i]; - if (gridDataDetailMap.has(d.id)) { - satelliteGrid.changeGridColor({ - tag: d.id, - useCustomColor: !isStandardColor.value, - opacity: 1, - zIndex: 11 - }); - } - }); -} - -function handleOpacityClick() { - isOpacity.value = !isOpacity.value; - satelliteGrid.changeGridOpacity({ opacityValue: isOpacity.value ? 0.1 : 1 }); +function handleSelectionChange(val) { + selectedfusionData.value = val; } /**璧拌埅杞ㄨ抗*******************************************************************/ @@ -565,4 +634,32 @@ mapLine.drawTagLine(missionCode, fd, factor); } </script> -<style scoped></style> +<style scoped> +:deep(.el-table) { + --el-table-bg-color: transparent; + --el-table-row-hover-bg-color: var(--select_color); + --el-table-current-row-bg-color: var(--select_color); + /* --el-table-current-row-bg-color: #7dff5d96; */ + --el-table-text-color: var(--font-color); +} + +:deep(.t-row-normal) { + cursor: pointer; + background-color: transparent !important; +} + +:deep(.t-cell) { + /* background: red !important; */ + /* height: 40px; + border: 1px solid black; */ +} + +:deep(.t-header-row) { +} + +:deep(.t-header-cell) { + background-color: var(--bg-color-2) !important; + /* text-align: center !important; */ + color: white !important; +} +</style> diff --git a/src/views/underwaymix/component/GridStyleTool.vue b/src/views/underwaymix/component/GridStyleTool.vue index e21302d..35b61e7 100644 --- a/src/views/underwaymix/component/GridStyleTool.vue +++ b/src/views/underwaymix/component/GridStyleTool.vue @@ -53,6 +53,13 @@ > </CheckButton> <CheckButton + active-text="椋庨櫓鐑姏鍥�" + inactive-text="椋庨櫓鐑姏鍥�" + :default-value="false" + @change="(e) => handleHeatMapClick(e, i, value)" + > + </CheckButton> + <CheckButton v-if="value.extData.type == 0" active-text="鏄剧ず璧拌埅杞ㄨ抗" inactive-text="闅愯棌璧拌埅杞ㄨ抗" @@ -105,6 +112,10 @@ * 缃戞牸鏍峰紡鎺у埗宸ュ叿 */ import { ref, reactive, onMounted, onUnmounted, computed, toRaw } from 'vue'; +import gridApi from '@/api/gridApi'; +import { useGridStore } from '@/stores/grid-info'; + +const gridStore = useGridStore() const props = defineProps({ // 缃戞牸绠$悊瀵硅薄[SatelliteGrid]鏁扮粍 @@ -200,6 +211,37 @@ function handleHighlightGridClick(e, index, value) { toRaw(props.gridCtrls[index]).mixGrid(value.tag.split('-'), e); } + +let heatTag +function handleHeatMapClick(e, index, value) { + const _satelliteGrid = toRaw(props.gridCtrls[index]) + _satelliteGrid.changeVisibility({ + showGridViews: false, + showDataTxt: false, + showRankTxt: false + }); + if (e) { + const data = _satelliteGrid.gridDataDetailMap.get(value.tag); + gridApi.buildUnderwayHeatmap(3, data).then((res) => { + heatTag = _satelliteGrid.drawHeatGrid2(value.tag, res.data); + _satelliteGrid.setGridEvent( + [heatTag], + 'click', + (gridCell, gridDataDetail) => { + gridStore.selectedGridCellAndDataDetail = { + gridCell, + gridDataDetail + }; + } + ); + }); + } else { + _satelliteGrid.changeVisibility({ + tags: [value.tag], + showGridViews: true + }); + } +} </script> <style scoped> .content-wrap { -- Gitblit v1.9.3