ard-admin/src/main/java/com/ard/web/controller/route/UavRouteController.java
@@ -2,6 +2,7 @@ import com.ard.common.core.domain.AjaxResult; import com.ard.route.domain.djuav.UavRouteReq; import com.ard.route.domain.vo.KmzInfoVo; import com.ard.route.service.UavRouteService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -51,5 +52,14 @@ return success(routeService.parseKmz(fileUrl)); } /** * KmzInfoVo实体类转换为UavRouteReq实体类 */ @ApiOperation("KmzInfoVo转换UavRouteReq") @PostMapping("/KmzInfoVoToUavRouteReq") public AjaxResult parseKmz(@RequestBody KmzInfoVo kmzInfoVo){ return success(routeService.kmzInfoVoToUavRouteReq(kmzInfoVo)); } } ard-route/src/main/java/com/ard/route/service/UavRouteService.java
@@ -23,9 +23,8 @@ public KmzInfoVo parseKmz(String file); /** * 编辑kmz文件 * 定制:删除旧的文件名的文件,并添加新文件名的文件 * KmzInfoVo实体类转换为UavRouteReq实体类 */ public KmzResultVo updateKmzNew(UavRouteReq uavRouteReq, String oldFileName, String newFilePath) ; public UavRouteReq kmzInfoVoToUavRouteReq(KmzInfoVo kmzInfoVo); } ard-route/src/main/java/com/ard/route/service/impl/ArdRouteInfoServiceImpl.java
@@ -113,20 +113,10 @@ if (ardRouteInfo.getGroupId() == null){ ardRouteInfo.setGroupId("0"); } // 航线数据 byte[] routeData; try { routeData = serialize(ardRouteInfo.getUavRouteReq()); } catch (IOException e) { throw new RuntimeException(e); } ardRouteInfo.getUavRouteReq().setDroneType(subStringDroneType(ardRouteInfo.getAircraft())); ardRouteInfo.setRouteData(routeData); KmzResultVo kmzResult = routeService.buildKmz(ardRouteInfo.getUavRouteReq(), ardRouteInfo.getName()); ardRouteInfo.setPath(kmzResult.getPath()); ardRouteInfo.setReadOnly("0"); ardRouteInfo.setPointCount(getPointCount(ardRouteInfo)); ardRouteInfoMapper.insertArdRouteInfo(ardRouteInfo); ardRouteInfoMapper.insertArdRouteInfo(dataProcessing(ardRouteInfo)); return kmzResult.getPath(); } @@ -144,20 +134,34 @@ KmzResultVo kmzResult; // 获取源文件名字 ArdRouteInfo route = ardRouteInfoMapper.selectArdRouteInfoById(ardRouteInfo.getId()); if (route.getName().equals(ardRouteInfo.getName())) { kmzResult = routeService.updateKmz(ardRouteInfo.getUavRouteReq(), ardRouteInfo.getName()); }else { kmzResult = routeService.updateKmzNew(ardRouteInfo.getUavRouteReq(), route.getName(), ardRouteInfo.getName()); } // 先删除航线 delOssService(route); // 再生成航线 kmzResult = routeService.buildKmz(ardRouteInfo.getUavRouteReq(), ardRouteInfo.getName()); if ("更新航线kmz文件失败".equals(kmzResult.getData())) { return 0; } ardRouteInfo.setPath(kmzResult.getPath()); ardRouteInfo.setPointCount(getPointCount(ardRouteInfo)); } return ardRouteInfoMapper.updateArdRouteInfo(ardRouteInfo); return ardRouteInfoMapper.updateArdRouteInfo(dataProcessing(ardRouteInfo)); } // 新增信息加工 private ArdRouteInfo dataProcessing(ArdRouteInfo ardRouteInfo) { // 航线数据 byte[] routeData; try { routeData = serialize(ardRouteInfo.getUavRouteReq()); } catch (IOException e) { throw new RuntimeException(e); } ardRouteInfo.setRouteData(routeData); ardRouteInfo.setReadOnly("0"); ardRouteInfo.setPointCount(getPointCount(ardRouteInfo)); return ardRouteInfo; } // 获取行点总数 private Integer getPointCount(ArdRouteInfo ardRouteInfo) { if (ardRouteInfo.getUavRouteReq().getRoutePointList() != null) { return ardRouteInfo.getUavRouteReq().getRoutePointList().size(); @@ -176,16 +180,21 @@ // 删除航线(kmz)文件 for (String id : ids) { ArdRouteInfo information = ardRouteInfoMapper.selectArdRouteInfoById(id); if (information.getPath() != null){ ossService.deleteObject("kmz", subStringMinioUrlName(information.getPath())); } if (information.getPath1() != null){ ossDockService.deleteObject("kmz", subStringMinioUrlName(information.getPath1())); } delOssService(information); } return ardRouteInfoMapper.deleteArdRouteInfoByIds(ids); } // 删除minio文件 private void delOssService(ArdRouteInfo information){ if (information.getPath() != null){ ossService.deleteObject("kmz", subStringMinioUrlName(information.getPath())); } if (information.getPath1() != null){ ossDockService.deleteObject("kmz", subStringMinioUrlName(information.getPath1())); } } /** * 删除航线(kmz)信息 * ard-route/src/main/java/com/ard/route/service/impl/UavRouteServiceImpl.java
@@ -37,6 +37,7 @@ import static com.ard.route.util.RouteFileUtils.*; import static com.ard.route.util.ToolUtils.*; import static com.ard.route.util.UavRouteReqUtils.kmzInfoVOToUavRouteReq; /** * Author:xia @@ -230,42 +231,12 @@ return null; } /** * KmzInfoVo实体类转换为UavRouteReq实体类 */ @Override public KmzResultVo updateKmzNew(UavRouteReq uavRouteReq, String oldFile, String newFile) { KmzResultVo result = new KmzResultVo(); // 校验修改的文件是否存在 ArdRouteInfo routeInformation = ardRouteInformationService.selectArdRouteInfoByName(oldFile); if ( routeInformation == null ){ result.setData("修改航线文件失败,请检查文件是否存在"); return result; } // 获取文件 String minioUrl = subStringMinioUrlName(routeInformation.getPath()); try (InputStream inputStream = ossService.getObject(kmzPath,minioUrl); ArchiveInputStream archiveInputStream = new ZipArchiveInputStream(inputStream)){ ArchiveEntry entry; KmlInfo kmlInfo = new KmlInfo(); KmlInfo wpmlInfo = new KmlInfo(); KmlParams kmlParams = new KmlParams(); while (!Objects.isNull(entry = archiveInputStream.getNextEntry())) { String name = entry.getName(); if (name.toLowerCase().endsWith(".kml")) { kmlInfo = RouteFileUtils.parseKml(archiveInputStream); buildKmlParams(kmlParams, kmlInfo); this.handleRouteUpdate(kmlInfo, uavRouteReq, FileTypeConstants.KML, kmlParams); } else if (name.toLowerCase().endsWith(".wpml")) { wpmlInfo = RouteFileUtils.parseKml(archiveInputStream); this.handleRouteUpdate(wpmlInfo, uavRouteReq, FileTypeConstants.WPML, kmlParams); } } // 删除文件 ossService.deleteObject(kmzPath, minioUrl); return buildKmzMethod(newFile, kmlInfo, wpmlInfo); } catch (Exception e) { result.setData("更新航线kmz文件失败"); return result; } public UavRouteReq kmzInfoVoToUavRouteReq(KmzInfoVo kmzInfoVo) { return kmzInfoVOToUavRouteReq(kmzInfoVo); } } ard-route/src/main/java/com/ard/route/util/RouteFileUtils.java
@@ -36,7 +36,13 @@ */ public static KmlInfo parseKml(InputStream inputStream) { XStream xStream = new XStream(); xStream.allowTypes(new Class[]{KmlInfo.class, KmlAction.class, KmlWayLineCoordinateSysParam.class, KmlPoint.class, KmlActionGroup.class}); xStream.allowTypes(new Class[]{ KmlInfo.class, KmlAction.class, KmlWayLineCoordinateSysParam.class, KmlPoint.class, KmlActionGroup.class }); xStream.alias("kml", KmlInfo.class); xStream.processAnnotations(KmlInfo.class); xStream.autodetectAnnotations(true); ard-route/src/main/java/com/ard/route/util/UavRouteReqUtils.java
New file @@ -0,0 +1,134 @@ package com.ard.route.util; import com.ard.oss.service.impl.OssServiceContext; import com.ard.route.domain.djuav.ActionGroupReq; import com.ard.route.domain.djuav.PointActionReq; import com.ard.route.domain.djuav.RoutePointReq; import com.ard.route.domain.djuav.UavRouteReq; import com.ard.route.domain.djuav.kml.*; import com.ard.route.domain.vo.KmzInfoVo; import org.apache.commons.compress.archivers.ArchiveEntry; import org.apache.commons.compress.archivers.ArchiveInputStream; import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Objects; import static com.ard.route.util.ToolUtils.getDoublePoint; public class UavRouteReqUtils { @Resource private OssServiceContext ossService; // 将文件转换成 UavRouteReq 实体 public static KmzInfoVo fileConversionEntity(MultipartFile file){ KmzInfoVo kmzInfoVO = new KmzInfoVo(); try (InputStream inputStream = file.getInputStream(); ArchiveInputStream archiveInputStream = new ZipArchiveInputStream(inputStream)){ ArchiveEntry entry; while (!Objects.isNull(entry = archiveInputStream.getNextEntry())) { String name = entry.getName(); if (name.toLowerCase().endsWith(".kml")) { kmzInfoVO.setKmlInfo(RouteFileUtils.parseKml(archiveInputStream)); } else if (name.toLowerCase().endsWith(".wpml")) { kmzInfoVO.setWpmlInfo(RouteFileUtils.parseKml(archiveInputStream)); } } return kmzInfoVO; }catch (Exception e) { e.printStackTrace(); } return null; } public static UavRouteReq kmzInfoVOToUavRouteReq(KmzInfoVo vo) { UavRouteReq uavRouteReq = new UavRouteReq(); if (vo.getKmlInfo().getDocument().getFolder().getTemplateType() != null){ uavRouteReq.setTemplateType(vo.getKmlInfo().getDocument().getFolder().getTemplateType()); } uavRouteReq.setDroneType(Integer.valueOf(vo.getKmlInfo().getDocument().getKmlMissionConfig().getDroneInfo().getDroneEnumValue())); uavRouteReq.setImageFormat(vo.getKmlInfo().getDocument().getFolder().getPayloadParam().getImageFormat()); uavRouteReq.setGlobalHeight(Double.valueOf(vo.getKmlInfo().getDocument().getFolder().getGlobalHeight())); uavRouteReq.setAutoFlightSpeed(Double.valueOf(vo.getKmlInfo().getDocument().getFolder().getAutoFlightSpeed())); uavRouteReq.setTakeOffRefPoint(vo.getKmlInfo().getDocument().getKmlMissionConfig().getTakeOffRefPoint()); uavRouteReq.setRoutePointList(routePointList(vo.getKmlInfo().getDocument().getFolder().getPlacemarkList())); return uavRouteReq; } public static List<RoutePointReq> routePointList(List<KmlPlacemark> placemarkList) { List<RoutePointReq> routePointList = new ArrayList<>(); for (KmlPlacemark kmlPlacemark : placemarkList) { RoutePointReq routePointReq = new RoutePointReq(); routePointReq.setRoutePointIndex(Integer.valueOf(kmlPlacemark.getIndex())); routePointReq.setLongitude(getDoublePoint(kmlPlacemark.getKmlPoint().getCoordinates(),"lon")); routePointReq.setLatitude(getDoublePoint(kmlPlacemark.getKmlPoint().getCoordinates(),"lat")); routePointReq.setHeight(Double.valueOf(kmlPlacemark.getHeight())); if (kmlPlacemark.getWaypointSpeed() != null) { routePointReq.setSpeed(Double.valueOf(kmlPlacemark.getWaypointSpeed())); } if (kmlPlacemark.getActionGroup() != null) { routePointReq.setActionGroupList(actionGroupList(kmlPlacemark.getActionGroup())); } routePointList.add(routePointReq); } return routePointList; } public static List<ActionGroupReq> actionGroupList(List<KmlActionGroup> actionGroup) { List<ActionGroupReq> actionGroupList = new ArrayList<>(); for (KmlActionGroup kmlActionGroup : actionGroup) { ActionGroupReq actionGroupReq = new ActionGroupReq(); List<PointActionReq> actions = new ArrayList<>(); //for (KmlAction kmlAction : kmlActionGroup.getAction()) { for (int i=0 ; i < kmlActionGroup.getAction().size() ; i++) { PointActionReq pointActionReq = actions(kmlActionGroup.getAction().get(i),i); actions.add(pointActionReq); } actionGroupReq.setActions(actions); actionGroupList.add(actionGroupReq); } return actionGroupList; } public static PointActionReq actions(KmlAction kmlAction,Integer actionIndex){ PointActionReq pointActionReq = new PointActionReq(); pointActionReq.setActionIndex(actionIndex); if ("takePhoto".equals(kmlAction.getActionActuatorFunc())) { // 照相 pointActionReq.setTakePhotoType(0); pointActionReq.setFileSuffix(kmlAction.getActionActuatorFuncParam().getFileSuffix()); pointActionReq.setImageFormat(""); pointActionReq.setUseGlobalImageFormat(Integer.valueOf(kmlAction.getActionActuatorFuncParam().getUseGlobalPayloadLensIndex())); } if ("startRecord".equals(kmlAction.getActionActuatorFunc())) { // 开始录像 pointActionReq.setPanoShotSubMode(kmlAction.getActionActuatorFuncParam().getFileSuffix()); pointActionReq.setStartRecord(true); } if ("stopRecord".equals(kmlAction.getActionActuatorFunc())) { // 停止录像 pointActionReq.setStopRecord(true); } if ("gimbalRotate".equals(kmlAction.getActionActuatorFunc())) { // 云台偏航俯仰 if ("1".equals(kmlAction.getActionActuatorFuncParam().getGimbalPitchRotateEnable())) { // 云台俯仰角 pointActionReq.setGimbalPitchRotateAngle(Double.valueOf(kmlAction.getActionActuatorFuncParam().getGimbalPitchRotateAngle())); } if ("1".equals(kmlAction.getActionActuatorFuncParam().getGimbalYawRotateEnable())){ // 云台偏航角 pointActionReq.setGimbalYawRotateAngle(Double.valueOf(kmlAction.getActionActuatorFuncParam().getGimbalYawRotateAngle())); } } if ("zoom".equals(kmlAction.getActionActuatorFunc())) { pointActionReq.setZoom(Double.valueOf(kmlAction.getActionActuatorFuncParam().getFocalLength())); } if ("hover".equals(kmlAction.getActionActuatorFunc())) { pointActionReq.setHoverTime(Integer.valueOf(kmlAction.getActionActuatorFuncParam().getHoverTime())); } if ("rotateYaw".equals(kmlAction.getActionActuatorFunc())) { pointActionReq.setAircraftHeading(Double.valueOf(kmlAction.getActionActuatorFuncParam().getAircraftHeading())); } return pointActionReq; } }