Есть ли какая-либо библиотека для разбора KML?Прочитайте и проанализируйте KML в java
ответ
Вы будете создавать свою собственную библиотеку, но вы не будете писать код.
Предлагаю посмотреть на http://code.google.com/apis/kml/documentation/kmlreference.html. Оттуда вы можете получить XML Schema. После того, как вы получили схему, вы можете использовать JAXB, чтобы сгенерировать дерево объектов, чтобы легко разобрать и написать KML.
This may also be a good resource, похоже, что кто-то еще это сделал!
Я пошел по этой дороге для небольшой практики, есть небольшая икота, в которой есть пара элементов, которые сталкиваются, когда схема запускается через компилятор. Ничего серьезного, но будьте готовы написать несколько пользовательских привязок. – CurtainDog
Поскольку XML вы можете прочитать данные с любым анализатором, но все еще есть Lib доступна на http://code.google.com/p/libkml/ она имеет привязки для Java, но Lib в C++
Эта библиотека выглядит многообещающим, а также:
http://code.google.com/p/javaapiforkml/
Библиотека оказывает поддержку до настоящего времени.
Вот моя реализация JSOUP надеюсь, что это помогает
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;
}
osmbonuspack работает очень хорошо в случае обработки данных KML.
если вы используете Android Studio :)
dependencies {
compile 'org.jsoup:jsoup:1.8.1'
}
// find a way to read the file and store it in a string
String inputFileContents = "";
String xmlContent = inputFileContents;
Document doc = Jsoup.parse(xml, "", Parser.xmlParser());
for(Element e : doc.select("LineString").select("coordinates")) {
// the contents
System.out.println(e.text());
}
Вы можете иметь несколько выберите() вызовы методов. я упростил код:
Element e = doc.select("LineString").select("coordinates").first();
Ошибка: (20, 29) java: не найдено подходящего метода для parse (org.jsoup.nodes.Document.OutputSettings.Syntax, java.lang.String, org.jsoup.parser.Parser) метод org.jsoup.Jsoup .parse (java.lang.String, java.lang.String, org.jsoup.parser.Parser) не применимо (аргумент несоответствие; org.jsoup.nodes.Document.OutputSettings.Syntax не может быть преобразован в java.lang. String) метод – user3871754
мой импорт: 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; – user3871754
Это и другие варианты, KML, файл является обычным файлом, который содержит структурировать файл XML. Это другой пример, для поиска одного конкретных меток в файле множественных метки
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;
}
здесь отсутствует точка с запятой: System.out.println ("LATI:" + coo [1]) – user3871754
Вот моя реализация с Jsoup http://stackoverflow.com/questions/1140144/read-and-parse-kml- in-java/21283827 # 21283827 – alexandrius