Java中使用dom4j解析kml航线数据为Json格式输出

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
        }
    ]
}

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Android解析KML文件的步骤如下: 1. 创建SAXParserFactory实例。 2. 创建SAXParser实例。 3. 创建DefaultHandler的子类实例,覆盖startElement()、characters()、endElement()等方法。 4. 调用SAXParser的parse()方法,传入KML文件的InputStream和DefaultHandler实例,开始解析。 5. 在startElement()方法,可以获取到每个标签的名称和属性值。 6. 在characters()方法,可以获取到每个标签的文本内容。 7. 在endElement()方法,可以处理当前标签的子标签和属性值。 以下是一个简单的例子,演示如何解析KML文件: ```java public class KmlParser { public static void parse(InputStream inputStream) { try { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); DefaultHandler handler = new DefaultHandler() { boolean inCoordinates = false; public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equalsIgnoreCase("coordinates")) { inCoordinates = true; } } public void characters(char[] ch, int start, int length) throws SAXException { if (inCoordinates) { String coords = new String(ch, start, length); // 坐标处理逻辑 inCoordinates = false; } } }; parser.parse(inputStream, handler); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上面的例子,我们只处理了KML文件的coordinates标签,读取其的坐标信息。如果需要处理其他标签或属性,可以在DefaultHandler子类覆盖相应的方法进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想天涯~路在脚下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值