From 63fe7f7424ddc3a3ca3489a5c1de595b2ad5c196 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=95=E5=B5=A9?= <17854119262@163.com> Date: Fri, 11 Jul 2025 15:38:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AA=92=E4=BD=93=E5=BA=93-=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E5=8C=BA=E5=9F=9F-=E5=8F=AF=E6=B5=8B=E8=AF=95=E7=89=88?= =?UTF-8?q?=EF=BC=88=E8=87=AA=E5=AE=9A=E4=B9=89=E7=A6=81=E9=99=8D=E5=8C=BA?= =?UTF-8?q?=E6=9C=AA=E5=AE=9E=E8=A3=85=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/demo/mediaLibrary.ts | 40 + .../MapboxMaps/src/WktGeojsonTransform.ts | 8 +- .../demo/system/mediaLibrary/path/index.vue | 84 +- .../system/mediaLibrary/path/pathAreaInfo.vue | 150 ++-- .../system/mediaLibrary/path/pathLeftMenu.vue | 227 +++-- .../demo/system/mediaLibrary/path/pathMap.vue | 837 ++++++++++++++---- 6 files changed, 967 insertions(+), 379 deletions(-) create mode 100644 src/api/demo/mediaLibrary.ts diff --git a/src/api/demo/mediaLibrary.ts b/src/api/demo/mediaLibrary.ts new file mode 100644 index 0000000..2094a87 --- /dev/null +++ b/src/api/demo/mediaLibrary.ts @@ -0,0 +1,40 @@ +import { defHttp } from '@/utils/http/axios'; +enum Api { + // 获取地图作业区域列表 + GetWorkAreaList = '/api/Manage/GetWorkAreaList', + // 添加地图作业区域 + AddWorkArea = '/api/Manage/AddWorkArea', + // 更新地图作业区域 + UpdateWorkArea = '/api/Manage/UpdateWorkArea', + // 删除地图作业区域 + DeleteWorkArea = '/api/Manage/DeleteWorkArea', +} + +// 获取地图作业区域列表 +export function GetWorkAreaList(params) { + return defHttp.get({ + url: Api.GetWorkAreaList, + params + }); +} +// 添加地图作业区域 +export function AddWorkArea(params) { + return defHttp.post({ + url: Api.AddWorkArea, + data:params + }); +} +// 更新地图作业区域 +export function UpdateWorkArea(params) { +return defHttp.post({ + url: Api.UpdateWorkArea, + data:params +}); +} +// 删除地图作业区域 +export function DeleteWorkArea(params) { +return defHttp.post({ + url: Api.DeleteWorkArea + '?id=' + params.id, + data:params +}); +} \ No newline at end of file diff --git a/src/components/MapboxMaps/src/WktGeojsonTransform.ts b/src/components/MapboxMaps/src/WktGeojsonTransform.ts index 3721c9b..16a8fcd 100644 --- a/src/components/MapboxMaps/src/WktGeojsonTransform.ts +++ b/src/components/MapboxMaps/src/WktGeojsonTransform.ts @@ -3,20 +3,20 @@ import { wktToGeoJSON,geojsonToWKT } from "@terraformer/wkt" const wktCollectionToGeoJson = (wktStr) => { - console.log("wktStr",wktStr); + // console.log("wktStr",wktStr); let geojson = WKT.parse(wktStr); - console.log("geojson",geojson); + // console.log("geojson",geojson); } const WktToGeojson = (wktData)=> { // return WKT.parse(wktData) - console.log("wktData",wktData); + // console.log("wktData",wktData); return wktToGeoJSON(wktData); } const GeojsonToWkt = (geojsonData)=> { // return WKT.convert(geojsonData) - console.log("geojsonData",geojsonData) + // console.log("geojsonData",geojsonData) return geojsonToWKT(geojsonData) } diff --git a/src/views/demo/system/mediaLibrary/path/index.vue b/src/views/demo/system/mediaLibrary/path/index.vue index 30486ff..940efaf 100644 --- a/src/views/demo/system/mediaLibrary/path/index.vue +++ b/src/views/demo/system/mediaLibrary/path/index.vue @@ -24,6 +24,7 @@ @setNowShowMarkData="setNowShowMarkData" @setNowShowImageData="setNowShowImageData" @setNowShowAreaData="setNowShowAreaData" + @setAllAreaData="setAllAreaData" @deleteMark="deleteMark" @deleteArea="deleteArea" /> @@ -41,6 +42,9 @@ @setNowShowMarkData="setNowShowMarkData" @setNowShowImageData="setNowShowImageData" @setNowShowAreaData="setNowShowAreaData" + @setAllMarkData="setAllMarkData" + @setAllImageData="setAllImageData" + @setAllAreaData="setAllAreaData" @closePathImageInfo="closePathImageInfo" /> @@ -85,6 +89,13 @@ import markJson from './json/mark.json'; import areaJson from './json/area.json'; import imageJson from './json/image.json'; + import { + GetWorkAreaList, + AddWorkArea, + UpdateWorkArea, + DeleteWorkArea, + } from '@/api/demo/mediaLibrary'; + import { WktToGeojson, GeojsonToWkt } from '@/components/MapboxMaps/src/WktGeojsonTransform'; import { useMessage } from '@/hooks/web/useMessage'; const { createMessage, createConfirm } = useMessage(); @@ -166,28 +177,41 @@ function closePathAreaInfo() { areaInfoShow.value = false; nowShowAreaData.value = {}; + pathMapRef.value.areaRestoreDefault(); } // 当前展示的区域信息 const nowShowAreaData = ref(); - const allAreaDataList = ref(areaJson); + const allAreaDataList: any = ref(areaJson); // 设置当前展示的区域信息 - function setNowShowAreaData(value) { + function setNowShowAreaData(value, restore = true) { if (value.id) { areaInfoShow.value = true; } else { areaInfoShow.value = false; } + if (restore) { + pathMapRef.value.areaRestoreDefault(); + } nowShowAreaData.value = value; } + // 刷新区域信息 + function setAllAreaData() { + // 查询地图工作区域 + getWorkAreaList(); + } // 删除区域 - function deleteArea(value) { - allAreaDataList.value = cloneDeep(allAreaDataList.value).filter((item) => item.id != value.id); - areaInfoShow.value = false; - nowShowAreaData.value = {}; - setTimeout(() => { - pathLeftMenuRef.value.updateShowMenuInfoList('地图作业区域'); - }, 50); + async function deleteArea(value) { + DeleteWorkArea({ + id: value.id, + }).then((result) => { + if (result) { + // 刷新 + getWorkAreaList(); + areaInfoShow.value = false; + nowShowAreaData.value = {}; + } + }); } // 右侧图片是否显示---------------------------------------------------- @@ -222,7 +246,49 @@ pathMapRef.value.handlerLocation([position.lng, position.lat]); } + // 查询地图工作区域 + async function getWorkAreaList() { + allAreaDataList.value = await GetWorkAreaList({ workspaceid: 1 }); + allAreaDataList.value.forEach((area, index) => { + let geomjson = WktToGeojson(area.geom); + area = { + ...area, + properties: JSON.parse(area.properties), + geomtype: getGeomType(area), + coordinates: geomjson.coordinates, + }; + allAreaDataList.value[index] = area; + }); + setTimeout(() => { + pathLeftMenuRef.value.updateShowMenuInfoList('地图作业区域'); + }, 50); + } + + // 获取WKT类型 + function getGeomType(area) { + let geom = area.geom; + let radiusFlag = area.properties.indexOf('radius') > -1 ? true : false; + // 点 + if (geom.indexOf('POINT Z') > -1 && !radiusFlag) { + return 'Point'; + } + // 线 + if (geom.indexOf('LINESTRING Z') > -1 && !radiusFlag) { + return 'Polyline'; + } + // 多边形 + if (geom.indexOf('MULTIPOLYGON Z') > -1 && !radiusFlag) { + return 'Polygon'; + } + // 圈 + if (geom.indexOf('MULTIPOLYGON Z') > -1 && radiusFlag) { + return 'Circle'; + } + } + onMounted(() => { + // 查询地图工作区域 + getWorkAreaList(); nowShowMarkData.value = markJson[1]; }); diff --git a/src/views/demo/system/mediaLibrary/path/pathAreaInfo.vue b/src/views/demo/system/mediaLibrary/path/pathAreaInfo.vue index dc63429..641e390 100644 --- a/src/views/demo/system/mediaLibrary/path/pathAreaInfo.vue +++ b/src/views/demo/system/mediaLibrary/path/pathAreaInfo.vue @@ -6,13 +6,13 @@
- +
- +
@@ -73,7 +71,7 @@
- {{ props.nowShowAreaData.status == 'enable' ? '已启用' : '已禁用' }} + {{ props.nowShowAreaData.state == 0 ? '已启用' : '已禁用' }}
@@ -81,33 +79,29 @@
水平距离
-
{{ distance.toFixed(1) }}m
+
{{ nowAreaData.length.toFixed(1) }}m
水平面积
-
{{ area.toFixed(2) }}㎡
+
{{ nowAreaData.area.toFixed(2) }}㎡
- +
水平周长
- -
{{ distance2 }}m
+ +
{{ nowAreaData.length.toFixed(1) }}m
- +
半径
- +
- +
@@ -120,19 +114,19 @@
- {{ nowAreaData.content.properties.width }} + {{ nowAreaData.properties.width }}
@@ -153,7 +147,7 @@
绘制者
-
{{ props.nowShowAreaData.created_nickname }}
+
{{ props.nowShowAreaData.createdUser }}
@@ -182,7 +176,15 @@ MinusOutlined, PlusOutlined, } from '@ant-design/icons-vue'; + import { + GetWorkAreaList, + AddWorkArea, + UpdateWorkArea, + DeleteWorkArea, + } from '@/api/demo/mediaLibrary'; import { cloneDeep } from 'lodash-es'; + import { useMessage } from '@/hooks/web/useMessage'; + const { createMessage, createConfirm } = useMessage(); const props = defineProps(['allAreaDataList', 'nowShowAreaData']); const emits = defineEmits([ @@ -193,6 +195,16 @@ ]); const nowAreaData: any = ref(props.nowShowAreaData); + watch( + () => nowAreaData.value, + () => { + emits('setNowShowAreaData', nowAreaData.value, false); + }, + { + deep: true, + }, + ); + // 宽度---------------------------------------------------------------------- const numInputFlag = ref(false); const focusInputRef = ref(); @@ -209,40 +221,40 @@ function blurInput() { numInputFlag.value = false; // 检测是否是数字 - if (/^-?\d+(\.\d+)?$/.test(nowAreaData.value.content.properties.width.toString())) { - if (nowAreaData.value.content.properties.width > 100) { + if (/^-?\d+(\.\d+)?$/.test(nowAreaData.value.properties.width.toString())) { + if (nowAreaData.value.properties.width > 100) { // 不能大于100 - nowAreaData.value.content.properties.width = 100; - } else if (nowAreaData.value.content.properties.width < 10) { + nowAreaData.value.properties.width = 100; + } else if (nowAreaData.value.properties.width < 10) { // 不能小于10 - nowAreaData.value.content.properties.width = 10; + nowAreaData.value.properties.width = 10; } else { // 保存小数点后两位 - let newnum = cloneDeep(nowAreaData.value.content.properties.width); - nowAreaData.value.content.properties.width = parseFloat(parseFloat(newnum).toFixed(2)); + let newnum = cloneDeep(nowAreaData.value.properties.width); + nowAreaData.value.properties.width = parseFloat(parseFloat(newnum).toFixed(2)); } } else { // 不是数字 - nowAreaData.value.content.properties.width = 10; + nowAreaData.value.properties.width = 10; } } // 宽度-减少 function removeRecordNum() { - let newnum = cloneDeep(nowAreaData.value.content.properties.width); + let newnum = cloneDeep(nowAreaData.value.properties.width); if (newnum == 10) { return; } newnum -= 5; - nowAreaData.value.content.properties.width = parseFloat(newnum.toFixed(2)); + nowAreaData.value.properties.width = parseFloat(newnum.toFixed(2)); } // 宽度-增加 function addRecordNum() { - let newnum = cloneDeep(nowAreaData.value.content.properties.width); + let newnum = cloneDeep(nowAreaData.value.properties.width); if (newnum == 100) { return; } newnum += 5; - nowAreaData.value.content.properties.width = parseFloat(newnum.toFixed(2)); + nowAreaData.value.properties.width = parseFloat(newnum.toFixed(2)); } // 关闭 @@ -251,52 +263,28 @@ } // 移动到中心位置 function handlerLocation() { - let coordinates = props.nowShowAreaData.content.geometry.coordinates; - if (props.nowShowAreaData.content.geometry.type == 'Circle') { + if (props.nowShowAreaData.geomtype == 'Circle') { emits('handlerLocation', { - lng: coordinates[0], - lat: coordinates[1], + lng: props.nowShowAreaData.properties.centerPoint[0], + lat: props.nowShowAreaData.properties.centerPoint[1], }); } else { emits('handlerLocation', { - lng: coordinates[0][0][0], - lat: coordinates[0][0][1], + lng: props.nowShowAreaData.properties.centerPoint[0], + lat: props.nowShowAreaData.properties.centerPoint[1], }); } } // 删除此区域 function deleteArea() { - emits('deleteArea', props.nowShowAreaData); - } - - // 水平距离 - const distance = ref(0); - async function getDistance() { - distance.value = mars3d.MeasureUtil.getSurfaceDistance( - props.nowShowAreaData.content.geometry.coordinates[0], - ); - } - - // 水平面积 - const area = ref(0); - async function getArea() { - if (props.nowShowAreaData.content.geometry.type == 'Circle') { - let radius = props.nowShowAreaData.content.geometry.radius; - area.value = Math.PI * radius * radius; - } else { - area.value = mars3d.MeasureUtil.getSurfaceArea( - props.nowShowAreaData.content.geometry.coordinates[0], - ); - } - } - - // 水平周长 - const distance2 = ref(0); - async function getDistance2() { - distance.value = mars3d.MeasureUtil.getDistance( - props.nowShowAreaData.content.geometry.coordinates[0], - true, - ); + createConfirm({ + iconType: 'info', + title: '提示', + content: '将会影响到项目内设备的作业范围,是否删除该区域?', + onOk: async () => { + emits('deleteArea', props.nowShowAreaData); + }, + }); } watch( @@ -304,14 +292,14 @@ () => { nowAreaData.value = props.nowShowAreaData; // 水平面积 - getArea(); + // getArea(); if (props.nowShowAreaData.type == 'noland') { // 水平距离 - getDistance(); + // getDistance(); } - if (props.nowShowAreaData.content.geometry.type == 'Polygon') { + if (props.nowShowAreaData.geomtype == 'Polygon') { // 水平距离 - getDistance2(); + // getDistance(); } }, { diff --git a/src/views/demo/system/mediaLibrary/path/pathLeftMenu.vue b/src/views/demo/system/mediaLibrary/path/pathLeftMenu.vue index 209f35f..df01a12 100644 --- a/src/views/demo/system/mediaLibrary/path/pathLeftMenu.vue +++ b/src/views/demo/system/mediaLibrary/path/pathLeftMenu.vue @@ -89,28 +89,17 @@ 全部禁降区 全部状态 - 已启用 - 已禁用 + 已启用 + 已禁用
-
+
- - - - + + + +
- - + +
{{ show.name }}
@@ -260,33 +260,35 @@ props.nowShowAreaData && props.nowShowAreaData.id == show.id ? '2px solid #2D8CF0' : '', - background: - props.nowShowAreaData && show.status == 'enable' ? '#3c3c3c' : '#3c3c3c55', + background: props.nowShowAreaData && show.state == 0 ? '#3c3c3c' : '#3c3c3c55', }" > -
- {{ show.name }} -
+ + +
+ {{ show.name }} +
+
- +
@@ -296,27 +298,27 @@ :style="{ width: '13px', height: '13px', - outline: `2px solid ${show.content.properties.color}`, + outline: `2px solid #00FF00`, 'margin-right': '6px', - 'border-radius': show.content.geometry.type == 'Circle' ? '6.5px' : '0px', + 'border-radius': show.geomtype == 'Circle' ? '6.5px' : '0px', }" /> - +
{{ getType(show.type) }}
-
+
-
+