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>岳麓区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内容 解析
      *  @param xml
      */

public Boolean parseXmlWithDom4j(String xml, KmlHelperListener mKmlHelperListener) throws Exception {
    Log.e("kml", xml);
    SAXReader reader = new SAXReader();
    Document document = null;
    try {
        //读取xml字符串,注意这里要转成输入流
        document = reader.read(new ByteArrayInputStream(xml.getBytes("utf-8")));
        //  document = reader.read(input);
        //读取xml字符串,注意这里要转成输入流
        Element root = document.getRootElement();
        //读取xml字符串,注意这里要转成输入流
        Element node = root.element("Document");
        mKmlFileElementBeanList = new ArrayList<>();
        Log.e("节点", 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;
}

//遍历当前节点下的所有节点
public void listNodes(Element node, KmlHelperListener mKmlHelperListener) {
    //根节点名
    //Placemark节点中的name属性
    try {
        //如果当前节点是Placemark就解析其子节点
        Log.e("根节点名字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节点的所有子节点
                    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文件格式出现异常");
        e.printStackTrace();
    }
    //同时迭代当前节点下面的所有子节点
    Iterator<Element> iterator = node.elementIterator();
    while (iterator.hasNext()) {
        Element e = iterator.next();
        listNodes(e, mKmlHelperListener);
    }
}

/**
 * 根据类型 转换 坐标
 * GPS转高德坐标
 */
public LatLng convert(LatLng sourceLatLng) {
    CoordinateConverter converter = new CoordinateConverter(mContext);
    // CoordType.GPS 待转换坐标类型
    converter.from(CoordinateConverter.CoordType.GPS);
    // sourceLatLng待转换坐标点
    converter.coord(sourceLatLng);
    // 执行转换操作
    LatLng desLatLng = converter.convert();
    return desLatLng;
}

}

/**
 * 读取文件内容
 *
 * @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(); // 取内存中保存的数据
        result = new String(data, "utf-8");
        bos.close();
        is.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return result;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 197,966评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,170评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,909评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,959评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,851评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,583评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,956评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,590评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,878评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,892评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,719评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,501评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,957评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,124评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,440评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,003评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,211评论 2 339

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    X先生_未知数的X阅读 15,962评论 3 119
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,373评论 1 45
  • 我們總得學會體諒別人,因為愛,因為友善,因為那些曾經在一起的回憶。當你說出那些傷人的話時,我已經做好準備了,不...
    蔡怡橙阅读 92评论 0 0
  • 2018年3月19日 宝宝,你好, 今天早晨八点五十一分,妈妈给爸爸微信发了一张图片,拍的是昨天爸爸给妈妈买的验孕...
    第七感5599阅读 303评论 0 0
  • 今日作业: 单词读记(找准读音, 读出来的才是听力!!!) P55-62 P81-83 P70-75 真题练习: ...
    L7_526d阅读 352评论 0 0