Читать и анализировать KML в Java - PullRequest
9 голосов
/ 17 июля 2009

Есть ли какая-либо библиотека для анализа KML?

Ответы [ 7 ]

9 голосов
/ 17 июля 2009

Вы будете создавать свою собственную библиотеку, но не будете писать никакого кода.

Предлагаю посмотреть http://code.google.com/apis/kml/documentation/kmlreference.html. Оттуда вы можете получить XML-схему . Получив схему, вы можете использовать JAXB , чтобы сгенерировать дерево объектов для простого анализа и записи KML.

Это также может быть хорошим ресурсом , похоже, кто-то другой уже сделал это!

7 голосов
/ 07 декабря 2009

Эта библиотека также выглядит многообещающе:

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

Библиотека обеспечивает поддержку до сих пор.

1 голос
/ 04 октября 2016

Это другие параметры, файл 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;
}
1 голос
/ 22 января 2014

Вот моя реализация 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;
}
1 голос
/ 17 июля 2009

Поскольку это xml, вы можете читать данные любым анализатором, но все же есть библиотека, доступная на http://code.google.com/p/libkml/, она имеет привязки для java, но библиотека находится в C ++

0 голосов
/ 29 сентября 2016

если вы используете 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());
        }

Вы можете иметь несколько вызовов метода select (). Я упростил код до:

 Element e = doc.select("LineString").select("coordinates").first();
0 голосов
/ 05 мая 2016

osmbonuspack очень хорошо работает в случае обработки данных kml.

...