KML文件解析顯示在地圖

風景

KML解析用到的工具jar包下載 dom4j.jar

KML文件格式1:

 <?xml version="1.0" encoding="UTF-8"?>
 <kml xmlns="http://www.opengis.net/kml/2.2" 
 xmlns:gx="http://www.google.com/kml/ext/2.2" 
 xmlns:kml="http://www.opengis.net/kml/2.2" 
 xmlns:atom="http://www.w3.org/2005/Atom">
<Document>
<name>kml演示.kml</name>
<StyleMap id="m_ylw-pushpin">
    <Pair>
        <key>normal</key>
        <styleUrl>#s_ylw-pushpin</styleUrl>
    </Pair>
    <Pair>
        <key>highlight</key>
        <styleUrl>#s_ylw-pushpin_hl</styleUrl>
    </Pair>
</StyleMap>
<Style id="s_ylw-pushpin">
    <IconStyle>
        <scale>1.1</scale>
        <Icon>
            <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
        </Icon>
        <hotSpot x="20" y="2" xunits="pixels" yunits="pixels"/>
    </IconStyle>
    <LineStyle>
        <color>ff7f00ff</color>
    </LineStyle>
    <PolyStyle>
        <color>00ffffff</color>
    </PolyStyle>
</Style>
<Style id="s_ylw-pushpin_hl">
    <IconStyle>
        <scale>1.3</scale>
        <Icon>
            <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
        </Icon>
        <hotSpot x="20" y="2" xunits="pixels" yunits="pixels"/>
    </IconStyle>
    <LineStyle>
        <color>ff7f00ff</color>
    </LineStyle>
    <PolyStyle>
        <color>00ffffff</color>
    </PolyStyle>
</Style>

<Placemark>
    <name>kml演示</name>
    <description>kml demo</description>
    <styleUrl>#m_ylw-pushpin</styleUrl>
    <gx:balloonVisibility>1</gx:balloonVisibility>
    <Polygon>
        <tessellate>1</tessellate>
        <outerBoundaryIs>
            <LinearRing>
                <coordinates>
                    112.9534054145206,28.17429329464148,0 112.9535870388715,28.17077100753803,0 112.9543308168626,28.16807084919302,0 112.9552953925895,28.16843727493238,0 112.9559857751675,28.17013030508299,0 112.9564530523403,28.17275841706835,0 112.9567491514611,28.17512130783434,0 112.9570255033991,28.17814122959389,0 112.9537821602722,28.178221949954,0 112.9534054145206,28.17429329464148,0 
                </coordinates>
            </LinearRing>
        </outerBoundaryIs>
    </Polygon>
</Placemark>

</Document>
</kml>

KML文件格式2:

    <?xml version="1.0" encoding="UTF-8"?>
    <kml xmlns="http://www.opengis.net/kml/2.2" 
xmlns:atom="http://www.w3.org/2005/Atom" 
xmlns:gx="http://www.google.com/kml/ext/2.2" >
<Document>
    <name>OvitalMap_20181122_221353</name>
    <Folder>
        <name>岳麓區(qū)2018年枯死松木伐除試點坐標.kmz</name>
        <Folder>
            <name>枯死木伐除試點</name>
            <Folder>
                <name>枯死木伐除試點</name>
                <Placemark>
                 <name>1</name>
                      <Style>
                        <IconStyle>
                            <Icon>
                                <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
                            </Icon>
                            <color>ffffffff</color>
                            <scale>0.6</scale>
                        </IconStyle>
                        <LabelStyle>
                            <color>ff000000</color>
                            <scale>2.0</scale>
                        </LabelStyle>
                    </Style>
                    <Point>
                        <coordinates>112.89506455,28.05539774,0</coordinates>
                    </Point>
                </Placemark>
                <Placemark>
                
                    <name>1</name>
                    <Style>
                        <IconStyle>
                            <Icon>
                                <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
                            </Icon>
                            <color>ffffffff</color>
                            <scale>0.6</scale>
                        </IconStyle>
                        <LabelStyle>
                            <color>ff000000</color>
                            <scale>2.0</scale>
                        </LabelStyle>
                    </Style>
                    <Point>
                        <coordinates>112.84106543,28.05342430,0</coordinates>
                    </Point>
                </Placemark>
                <Placemark>
               </Folder>
         </Folder>
     </Folder>
</Document>
</kml>

解析代碼

   /**
  $activityName
  @author LiuTao
  @date 2018/11/23/023
   */

public class KmlHelper {

public static boolean addSampleSuccess = false; //判斷讀取KML是否成功
private Coordinate coordinate = null; //存儲從KML文件中讀取出來的坐標值和name
//    private static List<LatLng> coordinateList = null;//存儲每次實例化的 

Coordinate對象鹅颊,每個Coordinate都保存著不同的x,y,name
private Context mContext;
private AMap aMap;
private Polygon mPolygon;
private String kmlPath = "/storage/emulated/0/Android/kml演示.kml";

private KmlHelperListener mKmlHelperListener;
private List<KMLFileElementBean> mKmlFileElementBeanList = null;

public interface KmlHelperListener {
    void onSuccessPoint(List<KMLFileElementBean> fileElementBeans);
}

public KmlHelper(Context context, AMap aMap) {
    this.mContext = context;
    this.aMap = aMap;
}

/**
 * ZIP
 *
 * @param mKmlHelperListener
 * @throws Exception
 */
public void parseKmlFile(String kmzPath, KmlHelperListener mKmlHelperListener) throws Exception {
    File file = new File(kmzPath);//pathName為KML文件的路徑
    try {
        ZipFile zipFile = new ZipFile(file);
        ZipInputStream zipInputStream = null;
        InputStream inputStream = null;
        ZipEntry entry = null;
        zipInputStream = new ZipInputStream(new FileInputStream(file));
        while ((entry = zipInputStream.getNextEntry()) != null) {
            String zipEntryName = entry.getName().toLowerCase();
            if (zipEntryName.endsWith("kml") || zipEntryName.endsWith("kmz")) {
                inputStream = zipFile.getInputStream(entry);
                //parseXmlWithDom4j(inputStream);
            } else if (zipEntryName.endsWith("png")) {

            }
        }
        zipInputStream.close();
        inputStream.close();
    } catch (ZipException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

/**
 * kml
 *  Assets
 * @param name
 * @param mKmlHelperListener
 */
public void parseKml(String name, KmlHelperListener mKmlHelperListener) {
    InputStream is = null;
    try {
        is = mContext.getAssets().open(name);
        if (is != null) {
            int lenght = is.available();
            byte[] buffer = new byte[lenght];
            is.read(buffer);
            String result = new String(buffer, "utf8");
            Log.e("kml", result);
            parseXmlWithDom4j(result, mKmlHelperListener);
        }

    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }

}
   /***
      * 讀取KML內(nèi)容 解析
      *  @param xml
      */

public Boolean parseXmlWithDom4j(String xml, KmlHelperListener mKmlHelperListener) throws Exception {
    Log.e("kml", xml);
    SAXReader reader = new SAXReader();
    Document document = null;
    try {
        //讀取xml字符串漫雕,注意這里要轉(zhuǎn)成輸入流
        document = reader.read(new ByteArrayInputStream(xml.getBytes("utf-8")));
        //  document = reader.read(input);
        //讀取xml字符串慢睡,注意這里要轉(zhuǎn)成輸入流
        Element root = document.getRootElement();
        //讀取xml字符串砾脑,注意這里要轉(zhuǎn)成輸入流
        Element node = root.element("Document");
        mKmlFileElementBeanList = new ArrayList<>();
        Log.e("節(jié)點", node.getName());//Document
        //使用遞歸
        Iterator<Element> iterator = node.elementIterator();
        while (iterator.hasNext()) {
            Element e = iterator.next();
            listNodes(e, mKmlHelperListener);
        }
        // listNodes(node, mKmlHelperListener);
        addSampleSuccess = true;
        mKmlHelperListener.onSuccessPoint(mKmlFileElementBeanList);
    } catch (DocumentException e) {
        // TODO: handle exception
        e.printStackTrace();
    }
    return addSampleSuccess;
}

//遍歷當前節(jié)點下的所有節(jié)點
public void listNodes(Element node, KmlHelperListener mKmlHelperListener) {
    //根節(jié)點名
    //Placemark節(jié)點中的name屬性
    try {
        //如果當前節(jié)點是Placemark就解析其子節(jié)點
        Log.e("根節(jié)點名字1", node.getName());
        if ("Placemark".equals(node.getName())) {
            KMLFileElementBean kmlFileElementBean = new KMLFileElementBean();
            String name = node.elementText("name");

            kmlFileElementBean.setName(name);
            List<LatLng> coordinateList = new ArrayList<>();

            Iterator<Element> iterator = node.elementIterator();
            while (iterator.hasNext()) {
                Element e = iterator.next();
                if ("Polygon".equals(e.getName())) {
                    Log.e("面名字3", e.getName());
                    kmlFileElementBean.setType("Polygon");
                    //遍歷Point節(jié)點的所有子節(jié)點
                    Element i1 = node.element("Polygon");
                    Element i2 = i1.element("outerBoundaryIs");
                    Element i3 = i2.element("LinearRing");
                    String nodeContent = i3.elementText("coordinates");

                    String[] nodeContentSplit = nodeContent.trim().split(" ");
                    for (int i = 0; i < nodeContentSplit.length; i++) {
                        String[] coorDinats = nodeContentSplit[i].split(",");
                        LatLng latLng = new LatLng(Double.parseDouble(coorDinats[1]), Double.parseDouble(coorDinats[0]));
                        coordinateList.add(convert(latLng));
                    }
                    kmlFileElementBean.setLatLngs(coordinateList);
                } else if ("Point".equals(e.getName())) {
                    Log.e("點名字3", e.getName());
                    Element i1 = node.element("Point");
                    kmlFileElementBean.setType("Point");
                    String nodeContent = i1.elementText("coordinates");
                    String[] coorDinats = nodeContent.trim().split(",");
                    LatLng latLng = new LatLng(Double.parseDouble(coorDinats[1]), Double.parseDouble(coorDinats[0]));
                    coordinateList.add(convert(latLng));
                    kmlFileElementBean.setLatLngs(coordinateList);
                }
            }
            mKmlFileElementBeanList.add(kmlFileElementBean);

        }
    } catch (Exception e) {
        ToastUtils.showToast("讀取kml文件格式出現(xiàn)異常");
        e.printStackTrace();
    }
    //同時迭代當前節(jié)點下面的所有子節(jié)點
    Iterator<Element> iterator = node.elementIterator();
    while (iterator.hasNext()) {
        Element e = iterator.next();
        listNodes(e, mKmlHelperListener);
    }
}

/**
 * 根據(jù)類型 轉(zhuǎn)換 坐標
 * GPS轉(zhuǎn)高德坐標
 */
public LatLng convert(LatLng sourceLatLng) {
    CoordinateConverter converter = new CoordinateConverter(mContext);
    // CoordType.GPS 待轉(zhuǎn)換坐標類型
    converter.from(CoordinateConverter.CoordType.GPS);
    // sourceLatLng待轉(zhuǎn)換坐標點
    converter.coord(sourceLatLng);
    // 執(zhí)行轉(zhuǎn)換操作
    LatLng desLatLng = converter.convert();
    return desLatLng;
}

}

/**
 * 讀取文件內(nèi)容
 *
 * @return
 */
public static String readtext(File f) {
    if (!f.exists()) {
        return null;
    }
    FileInputStream is;
    String result = null;
    try {
        is = new FileInputStream(f);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] array = new byte[1024];
        int len = -1;
        while ((len = is.read(array)) > 0 - 1) {
            bos.write(array, 0, len);
        }
        byte[] data = bos.toByteArray(); // 取內(nèi)存中保存的數(shù)據(jù)
        result = new String(data, "utf-8");
        bos.close();
        is.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return result;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末星爪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子科乎,更是在濱河造成了極大的恐慌宴杀,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜗元,死亡現(xiàn)場離奇詭異或渤,居然都是意外死亡,警方通過查閱死者的電腦和手機奕扣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門薪鹦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人成畦,你說我怎么就攤上這事距芬±钥” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵框仔,是天一觀的道長舀武。 經(jīng)常有香客問我,道長离斩,這世上最難降的妖魔是什么银舱? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮跛梗,結(jié)果婚禮上寻馏,老公的妹妹穿的比我還像新娘。我一直安慰自己核偿,他們只是感情好诚欠,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著漾岳,像睡著了一般轰绵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尼荆,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天左腔,我揣著相機與錄音,去河邊找鬼捅儒。 笑死液样,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的巧还。 我是一名探鬼主播鞭莽,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼麸祷!你這毒婦竟也來了撮抓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤摇锋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后站超,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荸恕,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年死相,在試婚紗的時候發(fā)現(xiàn)自己被綠了融求。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡算撮,死狀恐怖生宛,靈堂內(nèi)的尸體忽然破棺而出县昂,到底是詐尸還是另有隱情,我是刑警寧澤陷舅,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布倒彰,位于F島的核電站,受9級特大地震影響莱睁,放射性物質(zhì)發(fā)生泄漏待讳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一仰剿、第九天 我趴在偏房一處隱蔽的房頂上張望创淡。 院中可真熱鬧,春花似錦南吮、人聲如沸琳彩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽露乏。三九已至,卻和暖如春砚尽,著一層夾襖步出監(jiān)牢的瞬間施无,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工必孤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猾骡,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓敷搪,卻偏偏與公主長得像兴想,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赡勘,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1嫂便、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,969評論 3 119
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標準闸与。 注意:講述HT...
    kismetajun閱讀 27,449評論 1 45
  • 我們總得學會體諒別人毙替,因為愛,因為友善践樱,因為那些曾經(jīng)在一起的回憶厂画。當你說出那些傷人的話時,我已經(jīng)做好準備了拷邢,不...
    蔡怡橙閱讀 96評論 0 0
  • 2018年3月19日 寶寶袱院,你好, 今天早晨八點五十一分,媽媽給爸爸微信發(fā)了一張圖片忽洛,拍的是昨天爸爸給媽媽買的驗孕...
    第七感5599閱讀 304評論 0 0
  • 今日作業(yè): 單詞讀記(找準讀音腻惠, 讀出來的才是聽力!S椤集灌!) P55-62 P81-83 P70-75 真題練習: ...
    L7_526d閱讀 359評論 0 0