Read and parse KML in java
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;
}
Evgeny Shepelyuk
Updated on October 05, 2020Comments
-
Evgeny Shepelyuk over 3 years
Is there any library available to parse KML ?
-
CurtainDog about 13 yearsI 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 about 7 yearsError:(20, 29) java: no suitable method found for parse(org.jsoup.nodes.Document.OutputSettings.Syntax,java.lang.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 about 7 yearsmy 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 about 7 yearshere is missing semicolon : System.out.println("LATI: "+coo[1])