Xiajijian
2025-12-01 2587cb5656a988d580c1e3d45185ea3d1e7dd6d0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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 {
 
    // 将文件转换成 UavRouteReq 实体
    public static UavRouteReq 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 kmzInfoVoToUavRouteReq(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;
    }
 
}