Read and parse KML in java

31,677

Solution 1

You'll be making your own library, but you won't be writing any code.

I suggest looking at http://code.google.com/apis/kml/documentation/kmlreference.html. From there you can get the XML Schema. Once you've got the schema you can use JAXB to generate an object tree to easily parse and write KML.

This may also be a good resource, looks like someone else has already done it!

Solution 2

This library looks promising as well:

http://code.google.com/p/javaapiforkml/

The library provides support till now.

Solution 3

Here's my JSOUP implementation hope it helps

public ArrayList<ArrayList<LatLng>> getCoordinateArrays() {
    ArrayList<ArrayList<LatLng>> allTracks = new ArrayList<ArrayList<LatLng>>();

    try {
        StringBuilder buf = new StringBuilder();
        InputStream json = MyApplication.getInstance().getAssets().open("track.kml");
        BufferedReader in = new BufferedReader(new InputStreamReader(json));
        String str;
                      String buffer;
        while ((str = in.readLine()) != null) {
            buf.append(str);
        }

        in.close();
        String html = buf.toString();
        Document doc = Jsoup.parse(html, "", Parser.xmlParser());
        ArrayList<String> tracksString = new ArrayList<String>();
        for (Element e : doc.select("coordinates")) {
            tracksString.add(e.toString().replace("<coordinates>", "").replace("</coordinates>", ""));
        }

        for (int i = 0; i < tracksString.size(); i++) {
            ArrayList<LatLng> oneTrack = new ArrayList<LatLng>();
            ArrayList<String> oneTrackString = new ArrayList<String>(Arrays.asList(tracksString.get(i).split("\\s+")));
            for (int k = 1; k < oneTrackString.size(); k++) {
                LatLng latLng = new LatLng(Double.parseDouble(oneTrackString.get(k).split(",")[0]),
                        Double.parseDouble(oneTrackString.get(k).split(",")[1]));
                oneTrack.add(latLng);
            }
            allTracks.add(oneTrack);
        }}

    } catch (Exception e) {
        e.printStackTrace();
    }
    return allTracks;
}

Solution 4

Since it is xml you can read the data with any parser but still there is an lib available at http://code.google.com/p/libkml/ it has bindings for java but the lib is in C++

Solution 5

This is other options, the kml file is a normal file, who contain structure the xml file. This is other example, for search one specific placemark in the file the multiple placemarks

private static void readKML(InputStream fileKML, String nameCoordinates) {
    String column = null;
    Boolean folder = Boolean.TRUE;
    Boolean placemark = Boolean.FALSE;
    Boolean placeCorrect = Boolean.FALSE;
    BufferedReader br = new BufferedReader(new InputStreamReader(fileKML));
    try {
        while ((column = br.readLine()) != null) {
            if (folder) {
                int ifolder = column.indexOf("<Folder>");
                if (ifolder != -1) {
                    folder = Boolean.FALSE;
                    placemark = Boolean.TRUE;
                    continue;
                }
            }
            if (placemark) {
                String tmpLine = nameCoordinates;
                tmpLine = tmpLine.replaceAll("\t", "");
                tmpLine = tmpLine.replaceAll(" ", "");
                String tmpColumn = column;
                tmpColumn = tmpColumn.replaceAll("\t", "");
                tmpColumn = tmpColumn.replaceAll(" ", "");
                int name = tmpColumn.indexOf(tmpLine);
                if (name != -1) {
                    placemark = Boolean.FALSE;
                    placeCorrect = Boolean.TRUE;
                    continue;
                }
            }
            if (placeCorrect) {
                int coordin = column.indexOf("<coordinates>");
                if (coordin != -1) {
                    String tmpCoordin = column;
                    tmpCoordin = tmpCoordin.replaceAll(" ", "");
                    tmpCoordin = tmpCoordin.replaceAll("\t", "");
                    tmpCoordin = tmpCoordin.replaceAll("<coordinates>", "");
                    tmpCoordin = tmpCoordin
                            .replaceAll("</coordinates>", "");
                    String[] coo = tmpCoordin.split(",");
                    System.out.println("LONG: "+coo[0]);
                    System.out.println("LATI: "+coo[1])
                    break;
                }
            }

        }
        br.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return cresp;
}
Share:
31,677
Evgeny Shepelyuk
Author by

Evgeny Shepelyuk

Updated on October 05, 2020

Comments

  • Evgeny Shepelyuk
    Evgeny Shepelyuk over 3 years

    Is there any library available to parse KML ?

  • CurtainDog
    CurtainDog about 13 years
    I went down this road for a little practice, there's a little hiccup in that there are a couple of elements that collide when the schema is run through the compiler. Nothing major, but be prepared to write a few custom bindings.
  • Kamil Nękanowicz
    Kamil Nękanowicz about 7 years
    Error:(20, 29) java: no suitable method found for parse(org.jsoup.nodes.Document.OutputSettings.Syntax,java.la‌​ng.String,org.jsoup.‌​parser.Parser) method org.jsoup.Jsoup.parse(java.lang.String,java.lang.String,org.‌​jsoup.parser.Parser) is not applicable (argument mismatch; org.jsoup.nodes.Document.OutputSettings.Syntax cannot be converted to java.lang.String) method
  • Kamil Nękanowicz
    Kamil Nękanowicz about 7 years
    my imports:import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.parser.Parser; import static org.jsoup.nodes.Document.OutputSettings.Syntax.xml;
  • Kamil Nękanowicz
    Kamil Nękanowicz about 7 years
    here is missing semicolon : System.out.println("LATI: "+coo[1])