From 378380aee9993cf75a7c42239af9bc76a02c0326 Mon Sep 17 00:00:00 2001 From: helloxujingliang <3225043@qq.com> Date: Tue, 15 Jul 2025 14:57:12 +0800 Subject: [PATCH] merge --- .../airlinemanagement/index.vue | 34 +- .../workplan/components/airPoint.vue | 72 ++-- .../workplan/components/airPointConfig.vue | 14 + .../workplan/components/airPolygon.vue | 337 +++++++++++++++++- .../workplan/components/createAirLine.vue | 18 +- .../workplan/components/createWorkPlan.vue | 26 +- .../workplan/components/map.vue | 80 +++-- .../demo/workmanagement/workplan/index.vue | 3 + 8 files changed, 500 insertions(+), 84 deletions(-) diff --git a/src/views/demo/workmanagement/airlinemanagement/index.vue b/src/views/demo/workmanagement/airlinemanagement/index.vue index 30ff0b2..4f1e7b5 100644 --- a/src/views/demo/workmanagement/airlinemanagement/index.vue +++ b/src/views/demo/workmanagement/airlinemanagement/index.vue @@ -1,7 +1,9 @@ + \ No newline at end of file diff --git a/src/views/demo/workmanagement/workplan/components/airPoint.vue b/src/views/demo/workmanagement/workplan/components/airPoint.vue index 955c9b2..2cf5760 100644 --- a/src/views/demo/workmanagement/workplan/components/airPoint.vue +++ b/src/views/demo/workmanagement/workplan/components/airPoint.vue @@ -215,7 +215,7 @@ import {missionConfigOptions,folderConfigOptions} from '../waylineConfig/index. const emits = defineEmits(["setFlyPoint","checkPoint","exitDraw"]) -const props = defineProps(["airPoints","airInfo","polygonAirForm"]) +const props = defineProps(["airPoints","airInfo","polygonAirForm","airRoute"]) const areaOptionsShow = ref(false); const airInfo = ref({ @@ -276,7 +276,7 @@ const pointInfo = ref({ "executeHeight": 172.948656023051, "waypointSpeed": 10, "waypointHeadingParam": { - "waypointHeadingMode": "followWayline", + "waypointHeadingMode": "followWayline", // 偏航角模式 "waypointHeadingAngle": 0, "waypointPoiPoint": "0.000000,0.000000,0.000000", "waypointHeadingAngleEnable": 0, @@ -341,8 +341,17 @@ const pointInfo = ref({ "waypointWorkType": 0 }) +// 处理航点数据 const handlerPointInfo = ()=>{ + + if(props.airPoints?.length<=0){ + message.warning("请添加航点!"); + return null; + } props.airPoints?.forEach((item,index)=>{ + + console.log("item123",item); + let point = { "Point": { "coordinates": item.lng+","+item.lat @@ -352,7 +361,7 @@ const handlerPointInfo = ()=>{ "waypointSpeed": 10, "waypointHeadingParam": { "waypointHeadingMode": "followWayline", // 飞行器偏航角模式 : - "waypointHeadingAngle": 0, // 飞行器偏航角 [-180, 180] 当且仅当“wpml:waypointHeadingMode”为“smoothTransition”时必需 + "waypointHeadingAngle": item.aircraftHorizontalAngle, // 飞行器偏航角 [-180, 180] 当且仅当“wpml:waypointHeadingMode”为“smoothTransition”时必需 "waypointPoiPoint": "0.000000,0.000000,0.000000", // 兴趣点 仅当wpml:waypointHeadingMode为towardPOI时必需 "waypointHeadingAngleEnable": 0, "waypointHeadingPathMode": "followBadArc", // 飞行器偏航角转动方向 @@ -408,18 +417,21 @@ const handlerPointInfo = ()=>{ } ] }, - "waypointGimbalHeadingParam": { // 云台参数 - "waypointGimbalPitchAngle": 0, // 云台 垂直俯仰角参数 [-90, -30] - "waypointGimbalYawAngle": 0 // 云台 水平偏航角度 + "waypointGimbalHeadingParam": { + "waypointGimbalPitchAngle": item.cameraVerticalAngle, // 云台 垂直俯仰角参数 [-90, -30] + "waypointGimbalYawAngle": 0 // 云台 水平偏航角度 }, "isRisky": 0, "waypointWorkType": 0 } folder.value.Placemark.push(point); }) + + return true; + } -// waylines.json文件 +// waylines.json 数据 const waylinesJson = ref( { "kml": { @@ -431,33 +443,30 @@ const waylinesJson = ref( } ) -// 退出绘制 -const backPage = ()=>{ - emits("exitDraw") -} + // 保存航线 const saveAirLine = ()=>{ - handlerPointInfo(); + let handlerResult = handlerPointInfo(); - const builder = new XMLBuilder(); + if(handlerResult){ + const builder = new XMLBuilder(); - let lineData = {...waylinesJson.value} + let lineData = {...waylinesJson.value} - let obj = handlerPrefixWpml(lineData); + let obj = handlerPrefixWpml(lineData); - let xmlString = builder.build(obj); + let xmlString = builder.build(obj); - let xmlString2 = xmlString.replace(/<\/?\d+>/g, "") + let xmlString2 = xmlString.replace(/<\/?\d+>/g, "") - let xmlString3 = xmlString2.replace("",``) + let xmlString3 = xmlString2.replace("",``) - console.log("xmlString3",xmlString3); + handlerCreateFile(xmlString3); + } -return null; - handlerCreateFile(xmlString3); } // 处理wmpl:前缀 @@ -489,7 +498,7 @@ const handlerPrefixWpml = (obj) => { // 保存表单 const submitForm = ref({ "id": "", - "airLineName": null, + "airLineName": props.airRoute.name, "airLineType": "waypoint", "uavId": "", "flyToFirstPointMode": "", @@ -505,38 +514,31 @@ const submitForm = ref({ "wpml": "" }) -// 生成xml文件 +// 生成xml文件,创建航线 const handlerCreateFile =async (content)=>{ - const blob = new Blob([content], { type: 'wmpl/plain' }); - // 创建FormData对象用于上传 const formData = new FormData(); - formData.append('xmlFile', blob); - - let res = await uploadXmlFile(formData); - if(res){ - submitForm.value.wpml = res.path; - let addAirLineRes =await addAirLine(submitForm.value); - if(addAirLineRes){ - message.success("操作成功!"); backPage(); }else{ message.error("操作失败!"); } - }else{ message.error("操作失败!"); - } +} + +// 退出绘制 +const backPage = ()=>{ + emits("exitDraw") } diff --git a/src/views/demo/workmanagement/workplan/components/airPointConfig.vue b/src/views/demo/workmanagement/workplan/components/airPointConfig.vue index 55a56ce..7bf6f09 100644 --- a/src/views/demo/workmanagement/workplan/components/airPointConfig.vue +++ b/src/views/demo/workmanagement/workplan/components/airPointConfig.vue @@ -184,4 +184,18 @@ const config = ref({ ::v-deep .ant-slider .ant-slider-rail{ background:#fff!important; } + + +::v-deep .ant-input-number-input{ + background:#3c3c3c!important ; + border:0px solid #ccc!important; + border-top-left-radius: 3px !important; + border-bottom-left-radius: 3px !important; + color:#fff!important; +} + +::v-deep .ant-input-number-input::placeholder{ + color:rgba(255, 255, 255, 0.533)!important; +} + \ No newline at end of file diff --git a/src/views/demo/workmanagement/workplan/components/airPolygon.vue b/src/views/demo/workmanagement/workplan/components/airPolygon.vue index edc1ca6..8b59ea7 100644 --- a/src/views/demo/workmanagement/workplan/components/airPolygon.vue +++ b/src/views/demo/workmanagement/workplan/components/airPolygon.vue @@ -1,14 +1,16 @@ @@ -99,7 +101,6 @@ watch( // 航线预览:生成点 const generatePreviewPoint = (placemark)=>{ - // 设置默认起飞点 startPosition.value = [props.waylineInfo?.taskOffLng, props.waylineInfo?.taskOffLat, 70]; @@ -186,6 +187,8 @@ const generatePreviewPoint = (placemark)=>{ let map: mars3d.Map; // 地图对象 let graphicLayer: mars3d.layer.GraphicLayer; + let drawGraphicLayer:mars3d.layer.GraphicLayer; + let uavGraphicLayer: mars3d.layer.GraphicLayer; // 面航线图层 @@ -207,6 +210,7 @@ const generatePreviewPoint = (placemark)=>{ const exitDraw = () => { // 清空数据 graphicLayer ? graphicLayer.clear() : null; + drawGraphicLayer ? drawGraphicLayer.clear() : null; stickGroundPointLayer ? stickGroundPointLayer.clear() : null; lineGroundPointLayer ? lineGroundPointLayer.clear() : null; @@ -355,11 +359,11 @@ const generatePreviewPoint = (placemark)=>{ "icon": "https://data.mars3d.cn/img/thumbnail/basemap/tdt_img.png", "type": "group", "layers": [ - // { - // "name": "底图", - // "type": "tdt", - // "layer": "img_d" - // }, + { + "name": "底图", + "type": "tdt", + "layer": "img_d" + }, { "name": "注记", "type": "tdt", @@ -384,6 +388,10 @@ const generatePreviewPoint = (placemark)=>{ isAutoEditing: false, // 是否自动激活编辑 }); + drawGraphicLayer = new mars3d.layer.GraphicLayer({ + isAutoEditing:false, + }) + graphicLayer.bindContextMenu([ { text: '按轴平移', @@ -429,6 +437,7 @@ const generatePreviewPoint = (placemark)=>{ ]); map.addLayer(graphicLayer); + map.addLayer(drawGraphicLayer); // 航点地面投影点 stickGroundPointLayer = new mars3d.layer.GraphicLayer({ @@ -458,8 +467,8 @@ const generatePreviewPoint = (placemark)=>{ if (props.uavTrack) { setUAVPosition(); } - // 加载长光高清影像 - loadChangGuangLayer(); + // 加载长光高清影像 + // loadChangGuangLayer(); emits('mapOnLoad',map) }); }; @@ -613,7 +622,10 @@ const loadChangGuangLayer = ()=>{ // 设置起飞点 const setFlyPoint = async () => { - const graphic = await graphicLayer.startDraw({ + + drawGraphicLayer ? drawGraphicLayer.clear : null; + + const graphic = await drawGraphicLayer.startDraw({ type: 'billboardP', style: { image: '/map/start.png', @@ -1449,29 +1461,29 @@ const loadChangGuangLayer = ()=>{ const preViewPointWayLine = (position) => { if (moveTool) { moveTool.destroy(); - moveTool = null; + moveTool = null; } let uuid = buildUUID(); // 参考起飞点 - console.log('position', startPosition.value); + let startGraphic = new mars3d.graphic.BillboardEntity({ - id: 'start-graphic', - position: startPosition.value, - style: { - image: '/map/start.png', - scale: 1, - horizontalOrigin: Cesium.HorizontalOrigin.CENTER, - verticalOrigin: Cesium.VerticalOrigin.BOTTOM, - label: { - text: '参考起飞点', - font_size: 14, - color: '#ffffff', - outline: true, - outlineColor: '#000000', - pixelOffsetY: -35, - }, - }, + id: 'start-graphic', + position: startPosition.value, + style: { + image: '/map/start.png', + scale: 1, + horizontalOrigin: Cesium.HorizontalOrigin.CENTER, + verticalOrigin: Cesium.VerticalOrigin.BOTTOM, + label: { + text: '参考起飞点', + font_size: 14, + color: '#ffffff', + outline: true, + outlineColor: '#000000', + pixelOffsetY: -35, + }, + }, }); graphicLayer.addGraphic(startGraphic); @@ -1677,8 +1689,8 @@ const loadChangGuangLayer = ()=>{ overflow-y: hidden; position: absolute; height: calc(100vh - 80px); - top: 0px; - left: 0px; + top: 40px; + left: 40px; z-index: 999; } @@ -1688,8 +1700,8 @@ const loadChangGuangLayer = ()=>{ overflow-y: hidden; position: absolute; height: calc(100vh - 80px); - top: 0px; - left: 0px; + top: 40px; + left: 40px; z-index: 999; } @@ -1699,8 +1711,8 @@ const loadChangGuangLayer = ()=>{ overflow-y: hidden; position: absolute; height: calc(100vh - 80px); - top: 0px; - right: 0px; + top: 40px; + right: 40px; z-index: 999; } diff --git a/src/views/demo/workmanagement/workplan/index.vue b/src/views/demo/workmanagement/workplan/index.vue index f1ea3c0..adb410c 100644 --- a/src/views/demo/workmanagement/workplan/index.vue +++ b/src/views/demo/workmanagement/workplan/index.vue @@ -29,6 +29,9 @@ + + +