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);
|
}
|
}
|