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 rootEls = doc.getRootElement().elements(); for (Element rootEl : rootEls) { List docEls = rootEl.elements(); for (Element docEl : docEls) { if (docEl.getName().equals("Folder")) { List folderEls = docEl.elements(); for (Element folderEl : folderEls) { if (folderEl.getName().equals("Placemark")) { JSONObject wayPointObj = new JSONObject(); List 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 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 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); } }