diff --git a/src/views/demo/workmanagement/workplan/components/airPolygon.vue b/src/views/demo/workmanagement/workplan/components/airPolygon.vue index 62dee8c..5c27ca1 100644 --- a/src/views/demo/workmanagement/workplan/components/airPolygon.vue +++ b/src/views/demo/workmanagement/workplan/components/airPolygon.vue @@ -7,7 +7,7 @@
- +
@@ -39,7 +39,7 @@
参考起飞点
- + 设置起飞点 @@ -224,7 +224,7 @@ import {uavModel,calculateHeight,calculateGsd,calculateSpacing} from '../lib/cal -const emits = defineEmits(["setFlyPoint","exitDraw","calculatParamChange"]) +const emits = defineEmits(["setTakeOffPoint","exitDraw","calculatParamChange"]) // const props = defineProps(["airInfo","polygonAirForm","airPoints","airLineForm","waylineInfo"]) @@ -257,8 +257,8 @@ const airInfo = ref({ picture:23 }) -const setFlyPoint = ()=>{ - emits("setFlyPoint"); +const setTakeOffPoint = ()=>{ + emits("setTakeOffPoint"); } // 航线计算参数 @@ -532,12 +532,14 @@ const pointInfo = { // 处理航点数据 const handlerPointInfo = ()=>{ + if(props.airPoints?.length<=0){ message.warning("请绘制航测区域!"); return null; } let placemarkArray = []; + props.airPoints?.forEach((item,index)=>{ let point = { "Point": { @@ -666,24 +668,14 @@ const saveAirLine = ()=>{ let handlerResult = handlerPointInfo(); - if(handlerResult){ - const builder = new XMLBuilder(); - let lineData = {...waylinesJson.value} - let obj = handlerPrefixWpml(lineData); - let xmlString = builder.build(obj); - let xmlString2 = xmlString.replace(/<\/?\d+>/g, "") - let xmlString3 = xmlString2.replace("",``) - - handlerCreateFile(xmlString3); - } } @@ -734,18 +726,12 @@ const handlerPrefixWpml = (obj) => { } -// 保存表单 -const submitForm = ref({}) -// 传入表单 -submitForm.value = props.airLineForm; // 生成xml文件,创建航线 const handlerCreateFile =async (xmlString3)=>{ - console.log("submitForm",submitForm.value); - const blob =await convertXmlToKmz(xmlString3,templateStr); // const blob = new Blob([content], { type: 'wpml/plain' }); @@ -758,15 +744,17 @@ const handlerCreateFile =async (xmlString3)=>{ let res = await uploadXmlFile("默认文件夹/面状航线",formData); if(res){ - submitForm.value.wpml = res.path; + props.airLineForm.wpml = res.path; + let addAirLineRes = null; + if(props.editModel == 'add'){ - addAirLineRes =await addAirLine(submitForm.value); + addAirLineRes =await addAirLine(props.airLineForm); }else if(props.editModel == 'edit'){ - addAirLineRes =await editAirLine(submitForm.value); + addAirLineRes =await editAirLine(props.airLineForm); } diff --git a/src/views/demo/workmanagement/workplan/components/map.vue b/src/views/demo/workmanagement/workplan/components/map.vue index e0a4b1f..d6603cb 100644 --- a/src/views/demo/workmanagement/workplan/components/map.vue +++ b/src/views/demo/workmanagement/workplan/components/map.vue @@ -7,7 +7,7 @@
{ - - // 设置默认起飞点 - startPosition.value = [props.airLineForm?.taskOffLng, props.airLineForm?.taskOffLat, 70]; + takeOffPointPosition.value = [props.airLineForm?.taskOffLng, props.airLineForm?.taskOffLat, 70]; // 先清空所有数据 clearAllLayer(); @@ -371,11 +369,11 @@ const generatePreviewPoint = (placemark)=>{ let graphicLayer: mars3d.layer.GraphicLayer; + let uavGraphicLayer: mars3d.layer.GraphicLayer; + // 设置参考起飞点图层 let takeOffPointGraphicLayer:mars3d.layer.GraphicLayer; - let uavGraphicLayer: mars3d.layer.GraphicLayer; - // 测区面图层 let polygonGraphicLayer: mars3d.layer.GraphicLayer; @@ -648,7 +646,7 @@ const initMap = () => { }) takeOffPointGraphicLayer.on(mars3d.EventType.editMovePoint, function (event) { - flyPointMove(event); + takeOffPointMove(event); }); map.addLayer(takeOffPointGraphicLayer); @@ -683,14 +681,15 @@ const initMap = () => { text: '删除测区', icon: 'fa fa-camera-retro', // 支持 font-class 的字体方式图标 callback: (e) => { - handlerRemovePolygonArea(e); + handlerClearPolygonGraphicLayer(e); }, }, ]); polygonGraphicLayer.on(mars3d.EventType.editMovePoint,(event)=>{ - handlerPolygonEdit(event); + onPolygonGraphicLayerEdit(event); }) + map.addLayer(polygonGraphicLayer); @@ -734,7 +733,7 @@ const handlerBindMapMenus = () => { text: '添加航点', icon: 'fa fa-camera-retro', // 支持 font-class 的字体方式图标 callback: (e) => { - if (!startPosition.value) { + if (!takeOffPointPosition.value) { message.warning('请先设置起飞点'); return null; } @@ -758,7 +757,6 @@ const handlerBindMapMenus = () => { ///////////////////////////////图层和影像加载//////////////////////////////////////////// - // 加载长光卫星高分影像 const loadChangGuangLayer = ()=>{ var layer = new mars3d.layer.XyzLayer({ @@ -776,14 +774,13 @@ const loadChangGuangLayer = ()=>{ map.addLayer(layer); } - ///////////////////////////////参考起飞点//////////////////////////////////////////// // 全局参考起飞点 数据格式:[lng,lat,alt] -const startPosition = ref(null); +const takeOffPointPosition = ref(null); // 设置起飞点 -const setFlyPoint = async () => { +const setTakeOffPoint = async () => { takeOffPointGraphicLayer ? takeOffPointGraphicLayer.clear() : null; @@ -801,29 +798,31 @@ const setFlyPoint = async () => { outlineColor: '#000000', pixelOffsetY: -50, }, - }, + } }); - startPosition.value = graphic.toJSON().position; + + takeOffPointPosition.value = graphic.toJSON().position; polygonAirForm.value.startingPoint = graphic.toJSON().position; - // 设置表单数据 - props.airLineForm.taskOffLng = startPosition.value[0] - props.airLineForm.taskOffLat = startPosition.value[1] + props.airLineForm.taskOffLng = takeOffPointPosition.value[0] + props.airLineForm.taskOffLat = takeOffPointPosition.value[1] // 更新航线 updatePolygonLineByParams(); }; // 参考起飞点移动 -const flyPointMove = (e) => { +const takeOffPointMove = (e) => { + let res = handlerGetLngLatHeight(e); - startPosition.value = [res.lng,res.lat,res.alt]; + + takeOffPointPosition.value = [res.lng,res.lat,res.alt]; polygonAirForm.value.startingPoint = [res.lng,res.lat,res.alt]; // 设置表单数据 - props.airLineForm.taskOffLng = startPosition.value[0] - props.airLineForm.taskOffLat = startPosition.value[1] + props.airLineForm.taskOffLng = takeOffPointPosition.value[0] + props.airLineForm.taskOffLat = takeOffPointPosition.value[1] // 更新航线 updatePolygonLineByParams(); @@ -890,9 +889,6 @@ const handlerDrawPolygon = async () => { props.airLineForm.flyToFirstPointMode = polygonWkt; - console.log("props.airLineForm",props.airLineForm); - - let spceing = parseFloat(polygonCalculateParams.value?.spacing) / 10000; let lines = generateScanLines(polygon,spceing, 0); @@ -905,7 +901,7 @@ const handlerDrawPolygon = async () => { }; // 测区编辑后重新计算航线 -const handlerPolygonEdit = (e)=>{ +const onPolygonGraphicLayerEdit = (e)=>{ let coordinates = e.graphic.toJSON().positions; @@ -913,12 +909,13 @@ const handlerPolygonEdit = (e)=>{ coordinates.push(coordinates[0]); } - console.log("coordinates",coordinates); - polygonGeoJson.value = coordinates; let polygon = turf.polygon([coordinates]); + let polygonWkt = GeojsonToWkt(polygon['geometry']); + props.airLineForm.flyToFirstPointMode = polygonWkt; + let spceing = parseFloat(polygonCalculateParams.value?.spacing) / 10000; let lines = generateScanLines(polygon,spceing, 0); @@ -934,28 +931,12 @@ const handlerPolygonEdit = (e)=>{ // 绘制面航线 const handlerDrawPolygonLine = (lines) => { - let nodeGraphic = polygonGraphicLayer.getGraphicById("polygon-node-1"); - - if(nodeGraphic){ - nodeGraphic.setOptions({ - id: 'polygon-node-1', - name: '航点', - position: lines.geometry.coordinates[0], - style: { - image: '/map/node.png', - scale: 1, - horizontalOrigin: Cesium.HorizontalOrigin.CENTER, - verticalOrigin: Cesium.VerticalOrigin.BOTTOM, - label: { - text: '', - font_size: 14, - color: '#ffffff', - outline: true, - outlineColor: '#000000', - pixelOffsetY: -35, - }, - }, - }) + // 设置首航点 + let firstAirLinePoint = polygonGraphicLayer.getGraphicById("polygon-node-1"); + if(firstAirLinePoint){ + firstAirLinePoint.setOptions({ + position: lines.geometry.coordinates[0], + }) }else{ const graphic = new mars3d.graphic.BillboardEntity({ id: 'polygon-node-1', @@ -980,9 +961,7 @@ const handlerDrawPolygonLine = (lines) => { polygonGraphicLayer.addGraphic(graphic); } - - // 判断飞行模式 - + // 判断飞行模式 设置航点高度 lines.geometry.coordinates.unshift([ polygonAirForm.value.startingPoint[0], polygonAirForm.value.startingPoint[1], @@ -1005,8 +984,6 @@ const handlerDrawPolygonLine = (lines) => { arcType: Cesium.ArcType.GEODESIC, // 使用大地线 width: 2.0, color: '#0aed8b', - // clampToGround: true, - extrudedHeight: 100, // 相对于地形的高度(米) }, }, flyTo: true, @@ -1096,7 +1073,6 @@ function generateScanLines(polygon, spacing, angle = 0) { airPoints.value?.push(point); }) - return connectedLine; } @@ -1113,7 +1089,7 @@ const connectLinesManual = (lines) => { // 相对起飞点高度 - let relativeHeight = startPosition.value[2] + parseFloat(polygonCalculateParams.value.height); + let relativeHeight = takeOffPointPosition.value[2] + parseFloat(polygonCalculateParams.value.height); line.geometry.coordinates?.forEach((item, idx) => { line.geometry.coordinates[idx].push(relativeHeight); @@ -1180,13 +1156,11 @@ const CalculateAreaInfo = (polygon, lines) => { }; // 删除面状测区 和 面状航线 -const handlerRemovePolygonArea = () => { - if (polygonGraphicLayer) { - polygonGraphicLayer.clear(); - } - if (polygonLineGraphicLayer) { - polygonLineGraphicLayer.clear(); - } +const handlerClearPolygonGraphicLayer = () => { + + polygonGraphicLayer ? polygonGraphicLayer.clear() : null; + + polygonLineGraphicLayer ? polygonLineGraphicLayer.clear() : null; textLabelGraphicLayer ? textLabelGraphicLayer.clear() : null; @@ -1198,6 +1172,7 @@ const handlerRemovePolygonArea = () => { time: 0, picture: '- -', }; + }; // 面状航线测区、参数改变 @@ -1237,7 +1212,6 @@ const updatePolygonLineByParams = ()=>{ } } - // 计算绘制的多边形每条线的长度和中心点 const polygonBorderInfo = ref([]); @@ -1307,10 +1281,14 @@ const handlerLoadtextLabelGraphicLayer = (info) => { // 编辑回显航线 const handlerEditPolygonAirLine =async () => { - polygonAirForm.value.startingPoint = [props.airLineForm.taskOffLng,props.airLineForm.taskOffLat]; + // 设置参考起飞点 + + takeOffPointPosition.value = [props.airLineForm.taskOffLng,props.airLineForm.taskOffLat,props.airLineForm?.taskOffAlt ? props.airLineForm?.taskOffAlt : 71] + + polygonAirForm.value.startingPoint = [props.airLineForm.taskOffLng,props.airLineForm.taskOffLat,props.airLineForm?.taskOffAlt ? props.airLineForm?.taskOffAlt : 71]; - // 起点 takeOffPointGraphicLayer ? takeOffPointGraphicLayer.clear() : null; + let startFlyGraphic = new mars3d.graphic.BillboardEntity({ position:[props.airLineForm.taskOffLng,props.airLineForm.taskOffLat], style: { @@ -1328,16 +1306,13 @@ const handlerEditPolygonAirLine =async () => { clampToGround: true, }, }) + takeOffPointGraphicLayer.addGraphic(startFlyGraphic); - startPosition.value = [props.airLineForm.taskOffLng,props.airLineForm.taskOffLat,71] - - // 测区 + // 加载测区 let areaJson = WktToGeojson(props.airLineForm.flyToFirstPointMode) - polygonGeoJson.value = areaJson.coordinates[0]; - let geojsonData = { "type": "FeatureCollection", "features": [ @@ -1363,12 +1338,11 @@ const handlerEditPolygonAirLine =async () => { }, }) - // 文本标注 + // 加载文本标注 handlerGetPolygonBorderInfo(areaJson.coordinates[0]) - // 航线 + // 加载航线 let placemark = props.waylineInfo?.Folder?.Placemark - placemark?.forEach((item, index) => { let coordinate = item.Point.coordinates.split(','); let airPointInfo = { @@ -1386,6 +1360,7 @@ const handlerEditPolygonAirLine =async () => { }); let coordinates = []; + airPoints.value?.forEach((item, index) => { coordinates.push([item.lng, item.lat]); }); @@ -1393,7 +1368,6 @@ const handlerEditPolygonAirLine =async () => { let line = turf.lineString(coordinates); handlerDrawPolygonLine(line); - } ///////////////////////////////航点航线计算//////////////////////////////////////////// @@ -1446,15 +1420,16 @@ const pointMove = (e, id) => { // 绘制航线 const handlerDrawLine = () => { + let positions = []; airPoints.value?.forEach((item, index) => { positions.push([item.lng, item.lat, item.alt]); }); - positions.unshift([startPosition.value[0], startPosition.value[1], airPoints.value[0].alt]); + positions.unshift([takeOffPointPosition.value[0], takeOffPointPosition.value[1], airPoints.value[0].alt]); - positions.unshift([startPosition.value[0], startPosition.value[1], startPosition.value[2]]); + positions.unshift([takeOffPointPosition.value[0], takeOffPointPosition.value[1], takeOffPointPosition.value[2]]); // 判断是否已经绘制 if (positions.length > 1) { @@ -2046,7 +2021,7 @@ const preViewPointWayLine = (position) => { let startGraphic = new mars3d.graphic.BillboardEntity({ id: 'start-graphic', - position: startPosition.value, + position: takeOffPointPosition.value, style: { image: '/map/start.png', scale: 1, @@ -2128,8 +2103,11 @@ const preViewPolygonWayLine = (lines) => { // 清空所有图层 const clearAllLayer = () => { + graphicLayer ? graphicLayer.clear() : null; + stickGroundPointLayer ? stickGroundPointLayer.clear() : null; + lineGroundPointLayer ? lineGroundPointLayer.clear() : null; polygonGraphicLayer ? polygonGraphicLayer.clear() : null; @@ -2293,6 +2271,7 @@ const setUAVPosition = () => { }, frameRate: 1, }); + } else { const graphicModel = new mars3d.graphic.ModelPrimitive({ id: 'set-uav',