rain
2024-08-21 e945a560b26437d610754cea5abfd992cd63fd7b
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
package com.dji.sample.patches.utils;
 
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
 
import java.io.InputStream;
import java.util.List;
 
/**
 * 解析KML文件工具类
 */
public class ParseKmlFileUtil {
 
    /**
     * 解析kml中的数据
     * @param inputStream
     * @return
     */
    public static String kmlParseData(InputStream inputStream) {
        SAXReader reader = new SAXReader();
        Document doc = null;
        try {
            doc = reader.read(inputStream);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return getResultJSON(doc);
    }
 
    private static String getResultJSON(Document doc) {
        JSONObject jObj = new JSONObject();
        if (doc == null) {
            return null;
        }
 
        JSONArray jArray = new JSONArray();
        int index = 0;
        String autoFlightSpeed = "";
        String actionOnFinish = "";
        List<Element> rootEls = doc.getRootElement().elements();
        for (Element rootEl : rootEls) {
            List<Element> docEls = rootEl.elements();
            for (Element docEl : docEls) {
                if (docEl.getName().equals("Folder")) {
                    List<Element> folderEls = docEl.elements();
                    for (Element folderEl : folderEls) {
                        if (folderEl.getName().equals("Placemark")) {
                            JSONObject wayPointObj = new JSONObject();
                            List<Element> placeMarkEls = folderEl.elements();
                            index++;
                            for (Element placeMarkEl : placeMarkEls) {
                                if (placeMarkEl.getName().equals("ExtendedData")) {
                                    String heading = placeMarkEl.elementTextTrim("heading");
                                    String speed = placeMarkEl.elementTextTrim("speed");
                                    String turnMode = placeMarkEl.elementTextTrim("turnMode");
                                    wayPointObj.put("index", index);
                                    wayPointObj.put("heading", Integer.parseInt(heading));
                                    wayPointObj.put("speed", Integer.parseInt(speed));
                                    wayPointObj.put("turnMode", turnMode);
 
                                    //航点动作
                                    JSONArray actionsArr = new JSONArray();
                                    if (placeMarkEl.elements("actions") != null) {
                                        int hIndex = 1;
                                        List<Element> elList = placeMarkEl.elements("actions");
                                        for (Element el : elList) {
                                            JSONObject wayAction = new JSONObject();
                                            String actionsName = el.getTextTrim();
                                            //这里只解析航点动作,其余的参数可以根据情况自行取值
                                            if (!(actionsName.equals("ShootPhoto")) && !(actionsName.equals("StartRecording")) && !(actionsName.equals("Hovering")) && !(actionsName.equals("StopRecording"))) {
                                                continue;
                                            }
                                            String actionParam = "";//动作参数
                                            if (actionsName.equals("ShootPhoto")) {//拍照
                                                actionParam = el.attribute("targetMode").getValue();
                                            } else if (actionsName.equals("StartRecording")) {//开始录影
                                                actionParam = el.attribute("targetMode").getValue();
                                            } else if (actionsName.equals("Hovering")) {//悬停
                                                actionParam = el.attribute("param").getValue();
                                            } else if (actionsName.equals("StopRecording")) {//结束录影
                                                actionParam = el.attribute("targetMode").getValue();
                                            }
                                            String actionName = el.attribute("label").getValue();//动作名称
                                            wayAction.put("index", hIndex++);
                                            wayAction.put("actionParam", Integer.parseInt(actionParam));
                                            wayAction.put("actionName", actionName);
                                            actionsArr.add(wayAction);
                                        }
                                    }
                                    wayPointObj.put("wayPoint", actionsArr);
                                }
 
                                if (placeMarkEl.getName().equals("Point")) {
                                    String coordinates = placeMarkEl.elementTextTrim("coordinates");
                                    wayPointObj.put("latitude", Double.parseDouble(coordinates.split(",")[1]));//纬度
                                    wayPointObj.put("longitude", Double.parseDouble(coordinates.split(",")[0]));//经度
                                    wayPointObj.put("altitude", Float.parseFloat(coordinates.split(",")[2]));//海拔高度
                                }
                            }
                            jArray.add(wayPointObj);
                        }
                    }
                }
 
                if (docEl.getName().equals("Placemark")) {
                    List<Element> extendedDataEls = docEl.elements();
                    for (Element extendedDataEl : extendedDataEls) {
                        if (extendedDataEl.getName().equals("ExtendedData")) {
                            autoFlightSpeed = extendedDataEl.elementTextTrim("autoFlightSpeed");
                            actionOnFinish = extendedDataEl.elementTextTrim("actionOnFinish");
                        }
                    }
                }
            }
        }
        jObj.put("autoFlightSpeed", autoFlightSpeed);
        jObj.put("actionOnFinish", actionOnFinish);
        jObj.put("wayPoint", jArray);
        return JSONObject.toJSONString(jObj);
    }
}