kml航线文件 test.kml
<?xml version="1.0" encoding="UTF-8"?>
<kml
xmlns="http://www.opengis.net/kml/2.2">
<Document>
<name>test</name>
<open>1</open>
<ExtendedData
xmlns:mis="www.dji.com">
<mis:type>Waypoint</mis:type>
</ExtendedData>
<Folder>
<name>waypoints</name>
<description>Waypoints in the Mission</description>
<Placemark>
<name>Waypoint1</name>
<description>Waypoint</description>
<visibility>1</visibility>
<ExtendedData
xmlns:mis="www.dji.com">
<mis:heading>-134</mis:heading>
<mis:speed>2</mis:speed>
<mis:shootingDistance>13</mis:shootingDistance>
<mis:shootingPointCoordinates>111.0983479988443,37.01457095565122,1896.5923519015155</mis:shootingPointCoordinates>
<mis:useWaylineAltitude>false</mis:useWaylineAltitude>
<mis:gimbalPitch>-65</mis:gimbalPitch>
<mis:shootingPointName>1</mis:shootingPointName>
<mis:turnMode>Auto</mis:turnMode>
</ExtendedData>
<Point>
<altitudeMode>absolute</altitudeMode>
<coordinates>111.09839250793982,37.01460527594669,1908.524353132992</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Waypoint2</name>
<description>Waypoint</description>
<visibility>1</visibility>
<ExtendedData
xmlns:mis="www.dji.com">
<mis:heading>-134</mis:heading>
<mis:speed>2</mis:speed>
<mis:shootingDistance>9</mis:shootingDistance>
<mis:shootingPointCoordinates>111.0983479213188,37.014569952772014,1895.526510862932</mis:shootingPointCoordinates>
<mis:useWaylineAltitude>false</mis:useWaylineAltitude>
<mis:gimbalPitch>0</mis:gimbalPitch>
<mis:shootingPointName>2</mis:shootingPointName>
<mis:turnMode>Auto</mis:turnMode>
<mis:actions param="85" label="变焦">CameraZoom</mis:actions>
<mis:actions param="-134" label="飞行器偏航角">AircraftYaw</mis:actions>
<mis:actions param="-134" label="">GimbalYaw</mis:actions>
<mis:actions param="0" label="云台俯仰角度">GimbalPitch</mis:actions>
<mis:actions label="拍照" targetMode="1">ShootPhoto</mis:actions>
<mis:actions param="3000" label="悬停">Hovering</mis:actions>
</ExtendedData>
<Point>
<altitudeMode>absolute</altitudeMode>
<coordinates>111.09842083344881,37.01462617419697,1895.676510862932</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Waypoint3</name>
<description>Waypoint</description>
<visibility>1</visibility>
<ExtendedData
xmlns:mis="www.dji.com">
<mis:heading>-104</mis:heading>
<mis:speed>2</mis:speed>
<mis:shootingDistance>14</mis:shootingDistance>
<mis:shootingPointCoordinates>111.09833058696367,37.01454961742473,1893.137775470016</mis:shootingPointCoordinates>
<mis:useWaylineAltitude>false</mis:useWaylineAltitude>
<mis:gimbalPitch>-6</mis:gimbalPitch>
<mis:shootingPointName>3</mis:shootingPointName>
<mis:turnMode>Auto</mis:turnMode>
<mis:actions param="110" label="变焦">CameraZoom</mis:actions>
<mis:actions param="-104" label="飞行器偏航角">AircraftYaw</mis:actions>
<mis:actions param="-104" label="">GimbalYaw</mis:actions>
<mis:actions param="-6" label="云台俯仰角度">GimbalPitch</mis:actions>
<mis:actions label="拍照" targetMode="2">ShootPhoto</mis:actions>
<mis:actions param="4000" label="悬停">Hovering</mis:actions>
</ExtendedData>
<Point>
<altitudeMode>absolute</altitudeMode>
<coordinates>111.09848273607679,37.0145799077828,1894.7511739557633</coordinates>
</Point>
</Placemark>
</Folder>
<Placemark>
<name>Wayline</name>
<description>Wayline</description>
<visibility>1</visibility>
<ExtendedData
xmlns:mis="www.dji.com">
<mis:autoFlightSpeed>2</mis:autoFlightSpeed>
<mis:actionOnFinish>GoHome</mis:actionOnFinish>
<mis:headingMode>UsePointSetting</mis:headingMode>
<mis:idleVel>13</mis:idleVel>
<mis:shootingDistance>9</mis:shootingDistance>
<mis:ratio>0</mis:ratio>
<mis:safeDistance>1</mis:safeDistance>
<mis:droneInfo>
<mis:droneType>PM430</mis:droneType>
<mis:advanceSettings>true</mis:advanceSettings>
<mis:droneCameras>
<mis:camera>
<mis:cameraIndex>0</mis:cameraIndex>
<mis:cameraName>Zenmuse H20</mis:cameraName>
<mis:cameraType>42</mis:cameraType>
</mis:camera>
</mis:droneCameras>
<mis:droneHeight>
<mis:useAbsolute>true</mis:useAbsolute>
<mis:hasTakeoffHeight>false</mis:hasTakeoffHeight>
<mis:takeoffHeight>0.0</mis:takeoffHeight>
</mis:droneHeight>
</mis:droneInfo>
</ExtendedData>
<LineString>
<tessellate>1</tessellate>
<altitudeMode>absolute</altitudeMode>
<coordinates>111.09839250793982,37.01460527594669,1908.524353132992 111.09842083344881,37.01462617419697,1895.676510862932 111.09848273607679,37.0145799077828,1894.7511739557633 111.09841589613552,37.014636897212036,1890.160501527927 111.09833044960578,37.01468697022552,1900.2181590584132 111.09839316266266,37.01460516414601,1906.1682555644604 111.09828017701443,37.014513299250375,1906.1828930265633 111.09823284998993,37.01447833257162,1895.9186961743105 111.09815662047038,37.0145400191933,1895.885366828352 111.09822650481567,37.014472589266084,1890.2437807705185 111.0983014722973,37.0144250168267,1899.871399487196 111.09825273111107,37.01448924349809,1907.8173283169701 111.09832277706118,37.0145549839105,1911.0963697793666 111.09686385329996,37.015699076391115,1907.7602924460912 111.09697005245027,37.01572282294655,1905.4387124896948 111.09700251535844,37.01573660593659,1891.6987675452303 111.096987257612,37.01574078982032,1888.6490502910299 111.09699370942747,37.0157307145364,1888.4481729020602 111.0970012849001,37.015725828246204,1885.0752640761675 111.09699469467955,37.01574222780545,1884.8787157940421 111.09713217828755,37.015658152672586,1886.3336822207161 111.09721701877822,37.01558282686176,1894.9451527778276 111.09698638660188,37.01573388396523,1904.2449757045006 111.09681400957868,37.015688693795575,1904.2201858479061 111.09673555293568,37.015670747813054,1891.6861157601882 111.09671893392954,37.015679157406765,1884.9525572385428 111.09672401124294,37.015661407324394,1885.1997151365965 111.09672968063501,37.01565262260179,1885.0265025420204 111.09674001496137,37.015575482029206,1886.7343144449258 111.09674009621801,37.01555083560462,1881.8839780470232 111.09675402797905,37.015564244491436,1896.3836895477602 111.09677131894182,37.01567587266993,1904.9803130411492 111.09685861459411,37.01570321375351,1906.8148904791854 111.09779845153889,37.01935720108644,1855.2831306980936 111.09790488660633,37.01934033665613,1852.8268928247262 111.09793601100387,37.01933244486925,1840.7371933925867 111.09791899239531,37.01935180569637,1837.688716510227 111.09789948675984,37.01931249643759,1837.7153433329006 111.09793301790353,37.01932171619823,1834.1207419629313 111.09793308826625,37.01933121682208,1834.2036374901377 111.09794009648442,37.01934079592952,1834.1868153626222 111.09802016630499,37.01941590124263,1843.3671727874475 111.09790287823114,37.01934103313638,1850.5448330787333 111.0977502783727,37.01937071164669,1851.7190055100004 111.09768038662878,37.01938865797223,1840.8211478020228 111.09766987322871,37.01940267731095,1834.1353347468284 111.0976666914089,37.01939461347223,1834.2707264395958 111.09766288074115,37.01938611203685,1834.157938913756 111.09760597365744,37.01932804310187,1844.643198051626 111.09772553211394,37.01937584126532,1854.8650902100192 111.09780065269547,37.019363502882634,1857.0830465315157 111.09903498476956,37.02164861797421,1887.2364818141286 111.09903153366201,37.021647804926836,1890.181726343721</coordinates>
</LineString>
</Placemark>
</Document>
</kml>
解析代码
1.main方法测试
import java.io.File;
public class Test {
public static void main(String[] args) {
File file = new File("E:\\home\\test.kml");
String kmlJson = ParseKmlFileUtil.kmlParseData(file);
System.out.println("kmlJson输出结果:" + kmlJson);
}
}
2.ParseKmlFileUtil工具类
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.File;
import java.util.List;
/**
* 解析KML文件工具类
*/
public class ParseKmlFileUtil {
public static String kmlParseData(File file) {
SAXReader reader = new SAXReader();
Document doc = null;
try {
doc = reader.read(file);
} 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);
}
}
3.输出结果
{
"actionOnFinish": "GoHome",
"autoFlightSpeed": "2",
"wayPoint": [
{
"altitude": 1908.5244,
"heading": -134,
"latitude": 37.01460527594669,
"index": 1,
"turnMode": "Auto",
"speed": 2,
"wayPoint": [
],
"longitude": 111.09839250793982
},
{
"altitude": 1895.6765,
"heading": -134,
"latitude": 37.01462617419697,
"index": 2,
"turnMode": "Auto",
"speed": 2,
"wayPoint": [
{
"index": 1,
"actionParam": 1,
"actionName": "拍照"
},
{
"index": 2,
"actionParam": 3000,
"actionName": "悬停"
}
],
"longitude": 111.09842083344881
},
{
"altitude": 1894.7512,
"heading": -104,
"latitude": 37.0145799077828,
"index": 3,
"turnMode": "Auto",
"speed": 2,
"wayPoint": [
{
"index": 1,
"actionParam": 2,
"actionName": "拍照"
},
{
"index": 2,
"actionParam": 4000,
"actionName": "悬停"
}
],
"longitude": 111.09848273607679
}
]
}