From ed55401fa7a62c88a07a65e08e3ede9fc98a99d6 Mon Sep 17 00:00:00 2001
From: 张含笑 <zhx18749296735@163.com>
Date: Mon, 25 Aug 2025 17:26:58 +0800
Subject: [PATCH] feat:显示图斑
---
src/views/resource/components/spotDetails.vue | 278 ++++++++++++++++++++++++++++++-------------------------
1 files changed, 152 insertions(+), 126 deletions(-)
diff --git a/src/views/resource/components/spotDetails.vue b/src/views/resource/components/spotDetails.vue
index 9136b61..f76e404 100644
--- a/src/views/resource/components/spotDetails.vue
+++ b/src/views/resource/components/spotDetails.vue
@@ -7,16 +7,7 @@
<div v-for="(item, index) in infoList" :key="index" class="itemCon">
<div class="itemBox">
<div class="itemTitle">{{ item.name }}:</div>
- <div
- truncated
- class="itemValue"
- v-if="item.name !== '飞行事件' && item.name !== '任务执行次数'"
- >
- {{ item.value ? item.value : '--' }}
- </div>
- <div class="itemValue" v-if="item.name === '任务执行次数'">
- {{ item.value ? item.value : '0' }}次
- </div>
+ <div class="itemValue">{{item.value}}</div>
</div>
</div>
</div>
@@ -28,7 +19,7 @@
<div class="table-overlay">
<div class="table-content">
<div>图斑列表</div>
- <el-table :data="tableData" border style="width: 100%">
+ <el-table ref="polygonTableEle" :data="tableData" border style="width: 100%" @row-click="handleLocationPolygon">
<el-table-column type="index" label="序号" width="80">
<template #default="{ $index }">
{{ ($index + 1).toString().padStart(2, '0') }}
@@ -37,15 +28,17 @@
<el-table-column prop="dkbh" label="图斑名称" />
<el-table-column prop="investigate" label="图斑状态" />
<el-table-column label="操作" width="100" align="center">
- <el-button type="text">删除</el-button>
- <el-button type="text">编辑</el-button>
+ <template #default="scope">
+ <el-button type="text">删除</el-button>
+ <el-button type="text" @click="handleSelectionChange(scope.row)">编辑</el-button>
+ </template>
</el-table-column>
</el-table>
<div class="pagination-container">
<el-pagination
background
layout="prev, pager, next"
- :total="10"
+ :total="50"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
@@ -60,19 +53,32 @@
</template>
<script setup>
-import {getPatchesSpotList} from '@/api/patchManagement/index'
+import {
+ getCenterPoint,
+ getLnglatDist,
+ getLnglatAltitude,
+ getPolygonMaxHeight,
+ cartesian3Convert,
+ getWaylineShowHeight,
+} from '@/utils/cesium/mapUtil.js'
+import { getPatchesSpotList } from '@/api/patchManagement/index';
import * as Cesium from 'cesium';
import { PublicCesium } from '@/utils/cesium/publicCesium';
import { ref, watch, onBeforeUnmount } from 'vue';
const uploadPatchDialog = defineModel('show');
+const polygonTableEle = ref(null)
let publicCesiumInstance = null;
let viewer = null;
-const viewInstance = shallowRef(null)
-const homeViewer = shallowRef(null)
-let tbJwdList = []
+const viewInstance = shallowRef(null);
+const homeViewer = shallowRef(null);
+let tbJwdList = [];
+// 当前选中的图斑面数据
+let nowSelectObj = ref({})
+// 记录上一次点击高亮
+let lastHighlightRow = null
const infoList = ref([
- { name: '文件名称', value: '', field: 'job_info_num' },
- { name: '图斑类型', value: '', field: 'name' },
+ { name: '文件名称', value: '55', field: 'job_info_num' },
+ { name: '图斑类型', value: 'ee', field: 'name' },
{ name: '图斑数量', value: '', field: 'industry_type_str' },
{ name: '异常图斑数量', value: '', field: 'event_number' },
{ name: '行政区划', value: '', field: 'device_names' },
@@ -86,110 +92,36 @@
});
const handleSizeChange = () => {};
const handleCurrentChange = () => {};
-const tableData = ref([])
+const tableData = ref([]);
const polygonSearch = ref({
- investigate: '',
- isPush: '',
- isException: '',
- inRange: '1',
- dkbh: '',
- dkmj: '',
- page: 1,
- pageSize: 20,
- total: 0,
- workspaceId: 'ede19ef4-2e92-42f3-83cc-89afb54e95a7',
- area_code: '360000000000',
- device_sn: '',
- })
+ investigate: '',
+ isPush: '',
+ isException: '',
+ inRange: '1',
+ dkbh: '',
+ dkmj: '',
+ page: 1,
+ page_size: 1000,
+ total: 0,
+ workspaceId: 'ede19ef4-2e92-42f3-83cc-89afb54e95a7',
+ area_code: '360000000000',
+ device_sn: '',
+});
// 获取列表数据
-// const getTableList = async () => {
-// tableData.value = []
-// const res = await getPatchesSpotList(polygonSearch.value)
-// if (res.data.code !== 0) return
-// tableData.value = res.data.data.list.map(item => ({
-// ...item,
-// dkfw: item.sdfw && item.is_exception == 1 ? item.sdfw : item.dkfw,
-// }))
-// console.log('shuju ',tableData.value);
-
-// // 加载图斑
-// entitiesAddSpot()
-// }
- const getTableList = async () => {
- tableData.value = []
- const res = await getPatchesSpotList(polygonSearch.value)
- if (res.data.code !== 0) return
-
- tableData.value = res.data.data.list.map(item => ({
- ...item,
- dkfw: item.sdfw && item.is_exception == 1 ? item.sdfw : item.dkfw,
- }))
-
- // 先清空地图现有图斑
- tbJwdList = []
- viewer.entities.removeAll() // 清除所有实体
-
- // 再加载新图斑
- entitiesAddSpot()
- }
-// 初始化所有图斑
- const entitiesAddSpot = () => {
- tableData.value.forEach(item => {
- if (!item.dkfw) return
-
- const numbersWithCommas = item.dkfw.match(/\d+(\.\d+)?/g)
- if (!numbersWithCommas || numbersWithCommas.length % 2 !== 0) {
- console.error('Invalid coordinate format for item:', item.id)
- return
- }
-
- const grouped = numbersWithCommas.map(Number)
-
- tbJwdList.push({
- ...item,
- grouped: grouped,
- })
-
- try {
- homeViewer.value.entities.add({
- id: 'polygon_dk' + item.id,
- name: item.dkbh || '未命名图斑',
- polygon: {
- hierarchy: new Cesium.PolygonHierarchy(
- Cesium.Cartesian3.fromDegreesArray(grouped)
- ),
- material: item.is_exception == 1
- ? Cesium.Color.RED.withAlpha(0.5)
- : Cesium.Color.YELLOW.withAlpha(0.5),
- outline: true,
- outlineColor: Cesium.Color.WHITE,
- outlineWidth: 2,
- clampToGround: true
- },
- label: {
- text: item.dkbh || '',
- font: '14px sans-serif',
- style: Cesium.LabelStyle.FILL_AND_OUTLINE,
- outlineWidth: 2,
- verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
- pixelOffset: new Cesium.Cartesian2(0, -10)
- }
- })
- } catch (e) {
- console.error('Failed to add polygon:', e)
- }
- })
-
- // 自动缩放到所有图斑范围
- if (tbJwdList.length > 0) {
- const positions = tbJwdList.flatMap(item =>
- Cesium.Cartesian3.fromDegreesArray(item.grouped)
- )
- homeViewer.value.camera.flyToBoundingSphere(
- new Cesium.BoundingSphere.fromPoints(positions)
- )
- }
- }
+const getTableList = async () => {
+ tableData.value = [];
+ const res = await getPatchesSpotList(polygonSearch.value);
+ if (res.data.code !== 0) return;
+ tableData.value = res.data.data.list.map(item => ({
+ ...item,
+ dkfw: item.sdfw && item.is_exception == 1 ? item.sdfw : item.dkfw,
+ }));
+ // 先清空地图现有图斑
+ tbJwdList = [];
+ viewer.entities.removeAll(); // 清除所有实体
+ // 加载图斑
+ entitiesAddSpot();
+};
// 地图
const initMap = () => {
@@ -203,12 +135,107 @@
flatMode: false,
layerMode: 4,
});
-homeViewer.value = publicCesiumInstance.getViewer()
+ homeViewer.value = publicCesiumInstance.getViewer();
viewer = publicCesiumInstance.getViewer();
- viewInstance.value = publicCesiumInstance
+ viewInstance.value = publicCesiumInstance;
viewer.scene.globe.depthTestAgainstTerrain = true;
};
+// 初始化所有图斑
+const entitiesAddSpot = () => {
+ tableData.value.forEach(item => {
+ // 取出当中经纬度
+ const numbersWithCommas = item.dkfw.match(/\d+(\.\d+)?/g);
+ if (!numbersWithCommas) return;
+ // 绘制图斑
+ const grouped = numbersWithCommas.map(item => Number(item));
+ // 为框选存储对比值
+ tbJwdList.push({
+ ...item,
+ grouped: grouped,
+ });
+ viewInstance.value.removeById('polygon_dk' + item.id);
+ homeViewer.value.entities?.add({
+ id: 'polygon_dk' + item.id,
+ customType: 'pattern_spot_polygon',
+ customInfo: {
+ ...item,
+ },
+ polygon: {
+ hierarchy: new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArray(grouped)),
+ material: Cesium.Color.YELLOW.withAlpha(0.5),
+ outline: true,
+ outlineColor: Cesium.Color.YELLOW,
+ outlineWidth: 2,
+ clampToGround: true,
+ },
+ zIndex: 99,
+ });
+ if (tbJwdList.length > 0) {
+ const positions = tbJwdList.flatMap(item => Cesium.Cartesian3.fromDegreesArray(item.grouped));
+ homeViewer.value.camera.flyToBoundingSphere(new Cesium.BoundingSphere.fromPoints(positions));
+ }
+ viewInstance.value.removeLeftClickEvent('spotHighlighting')
+ viewInstance.value.addLeftClickEvent(null, spotHighlighting, 'spotHighlighting')
+ });
+};
+// 编辑
+const handleSelectionChange =(row)=>{
+ heightlightSpot(row)
+}
+// 高亮当前选中图斑,并定位
+const handleLocationPolygon = (data, Deselect) => {
+ heightlightSpot(data)
+}
+// 鼠标触发点击图斑高亮 pick:可以获取当前图斑数据
+const spotHighlighting = (click, pick, viewer) => {
+ if (!pick || !(pick.id?.customType == 'pattern_spot_polygon')) return
+ // 表格也对应选中数据 TODO
+ const data = pick.id?.customInfo
+ // 高亮图斑
+ heightlightSpot(data)
+}
+// 选中列表或者点击地图内的图斑 高亮图斑
+const heightlightSpot = data => {
+ nowSelectObj.value = data
+ if (!data) {
+ clearSelect()
+ return
+ }
+
+ // 保存当前选中图斑
+ // 取出当中经纬度
+ const numbersWithCommas = data.dkfw.match(/\d+(\.\d+)?/g)
+ // 转换为二维数组
+ const groupedArr = numbersWithCommas.reduce((acc, val, index, src) => {
+ if (index % 2 === 0) acc.push(src.slice(index, index + 2))
+ return acc
+ }, [])
+ // 求出中心点
+ const polygonCenter = getCenterPoint(groupedArr)
+ if (viewInstance.value.getEntityById('polygon_center')) {
+ viewInstance.value.removeById('polygon_center')
+ }
+ // 高亮当前图斑,将上一个高亮图斑恢复
+ if (lastHighlightRow) {
+ let lastentity = homeViewer.value.entities?.getById('polygon_dk' + lastHighlightRow.id)
+
+ if (lastentity && lastentity.polygon) {
+ lastentity.polygon.material = Cesium.Color.YELLOW.withAlpha(0.5)
+ lastentity.polygon.outlineColor = Cesium.Color.YELLOW
+ }
+ }
+ let Nowentity = homeViewer.value.entities?.getById('polygon_dk' + data.id)
+ if (Nowentity && Nowentity.polygon) {
+ Nowentity.polygon.material = Cesium.Color.RED.withAlpha(0.3)
+ Nowentity.polygon.outlineColor = Cesium.Color.RED
+ }
+
+ homeViewer.value.scene.camera.setView({
+ destination: Cesium.Cartesian3.fromDegrees(Number(polygonCenter.lng), Number(polygonCenter.lat), 2500.0),
+ })
+ lastHighlightRow = data
+}
// 销毁
const destroyMap = () => {
if (viewer) {
@@ -222,7 +249,7 @@
if (newVal) {
setTimeout(() => {
initMap();
- getTableList()
+ getTableList();
}, 0);
} else {
destroyMap();
@@ -231,7 +258,6 @@
onBeforeUnmount(() => {
destroyMap();
-
});
</script>
--
Gitblit v1.9.3