Java(Android)解析KML文件
參考自:http://blog.csdn.net/yyywyr/article/details/38359049
http://blog.csdn.net/warrenwyf/article/details/5703279
http://zhidao.baidu.com/question/568729363.html
1 KML文件
现有一个在ARCGIS中生成的点要素shapefile文件,将其转换成kmz文件。可是这个kmz文件并非纯文本的KML服务。而是一个压缩文件,用压缩软件打开这个kmz之后会发现当中包括了一个“doc.kml”和一个“*.png”图标文件。因此。我们须要解析的就是这个doc.kml文件。
其格式例如以下:
<?
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:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/kml/2.2 http://schemas.opengis.net/kml/2.2.0/ogckml22.xsd http://www.google.com/kml/ext/2.2 http://code.google.com/apis/kml/schema/kml22gx.xsd">
<Document id="4thalter">
<name>4thalter</name>
<Snippet></Snippet>
<Folder id="FeatureLayer0">
<name>4thalter</name>
<Snippet></Snippet>
<Placemark id="ID_00000">
<name>456</name>
<Snippet></Snippet>
<description>
这里是一个HTML文档
</description>
<styleUrl>#IconStyle00</styleUrl>
<Point>
<altitudeMode>clampToGround</altitudeMode>
<coordinates> 119.46,30.96,0</coordinates>
</Point>
</Placemark>
<Placemark id="ID_00002">
<name>457</name>
<Snippet></Snippet>
<description>
这里是一个HTML文档
</description>
<styleUrl>#IconStyle00</styleUrl>
<Point>
<altitudeMode>clampToGround</altitudeMode>
<coordinates> 120.46,30.96,0</coordinates>
</Point>
</Placemark>
<Placemark id="ID_00022">
<name>xc64</name>
<Snippet></Snippet>
<description>
这里是一个HTML文档
</description>
<styleUrl>#IconStyle00</styleUrl>
<Point>
<altitudeMode>clampToGround</altitudeMode>
<coordinates> 118.81,30.93,0</coordinates>
</Point>
</Placemark>
</Folder>
<Style id="IconStyle00">
<IconStyle>
<Icon><href>Layer0_Symbol_11269a08.png</href></Icon>
<scale>0.437500</scale>
</IconStyle>
<LabelStyle>
<color>ff000000</color>
<scale>0.833333</scale>
</LabelStyle>
<PolyStyle>
<color>ff000000</color>
<outline>0</outline>
</PolyStyle>
</Style>
</Document>
</kml>
我们须要解析的属性标签存放在description结点下的HTML中,例如以下:
<![CDATA[<html xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<head>
<META http-equiv="Content-Type" content="text/html">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body style="margin:0px 0px 0px 0px;overflow:auto;background:#FFFFFF;">
<table style="font-family:Arial,Verdana,Times;font-size:12px;text-align:left;width:100%;border-collapse:collapse;padding:3px 3px 3px 3px">
<tr style="text-align:center;font-weight:bold;background:#9CBCE2">
<td>第四组</td>
</tr>
<tr>
<td>
<table style="font-family:Arial,Verdana,Times;font-size:12px;text-align:left;width:100%;border-spacing:0px; padding:3px 3px 3px 3px">
<tr>
<td>FID</td>
<td>22</td>
</tr>
<tr bgcolor="#D4E4F3">
<td>soiltype</td>
<td>6</td>
</tr>
<tr>
<td>x</td>
<td>673556</td>
</tr>
<tr bgcolor="#D4E4F3">
<td>y</td>
<td>3424365</td>
</tr>
<tr>
<td>dem</td>
<td>14</td>
</tr>
<tr bgcolor="#D4E4F3">
<td>planc</td>
<td>0</td>
</tr>
<tr>
<td>profc</td>
<td>0</td>
</tr>
<tr bgcolor="#D4E4F3">
<td>slope</td>
<td>0</td>
</tr>
<tr>
<td>PYNAME</td>
<td>第四组</td>
</tr>
<tr bgcolor="#D4E4F3">
<td>ID</td>
<td>664</td>
</tr>
<tr>
<td>name</td>
<td>xc64</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
]]>
在本案例中。我须要从HTML中提取出坐标x,y和name这三个属性。代码例如以下:
package com.test.parsekml;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.jsoup.Jsoup;
import org.jsoup.select.Elements;
import android.util.Log;
public class ReadKml {
public void parseKml(String pathName) throws Exception
{
File file = new File(pathName);//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();
Log.d("压缩实体的名称:", zipEntryName);
if (zipEntryName.endsWith("kml") || zipEntryName.endsWith("kmz")) {
inputStream = zipFile.getInputStream(entry);
parseXmlWithDom4j(inputStream);
}else if (zipEntryName.endsWith("png")) {
/*ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
byte[] b = new byte[512];
int readedByteSize = 0;
while ((readedByteSize = zipInputStream.read(b)) != -1) {
byteArrayOut.write(b, 0, readedByteSize);
}
byteArrayOut.flush();
byteArrayOut.close();
InputStream isBitmap = new ByteArrayInputStream(byteArrayOut.toByteArray());
Bitmap bitmap = BitmapFactory.decodeStream(isBitmap);
isBitmap.close();*/
}
}
zipInputStream.close();
inputStream.close();
} catch (ZipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void parseXmlWithDom4j(InputStream input) throws Exception
{
SAXReader reader = new SAXReader();
Document document = null;
try {
document = reader.read(input);
} catch (DocumentException e) {
// TODO: handle exception
e.printStackTrace();
}
Element root = document.getRootElement();//获取doc.kml文件的根结点
listNodes(root);
}
//遍历当前节点下的全部节点
public void listNodes(Element node){
Log.d("当前结点的名称:", node.getName());
//首先获取当前节点的全部属性节点
/* List<Attribute> list = node.attributes();
//遍历属性节点
for(Attribute attribute : list){
Log.d("属性", attribute.getName() +":" + attribute.getValue());
} */
//假设当前节点内容不为空,则输出
if(!(node.getTextTrim().equals("")) && "description".equals(node.getName())){
//Log.d("当前结点内容:", node.getText());
parseHtml(node.getText());
}
//同一时候迭代当前节点以下的全部子节点
//使用递归
Iterator<Element> iterator = node.elementIterator();
while(iterator.hasNext()){
Element e = iterator.next();
listNodes(e);
}
}
public void parseHtml(String htmlData)
{
org.jsoup.nodes.Document document = Jsoup.parse(htmlData);
Elements trs = document.select("table").select("tr");
String trContent = "";
String trContentSplit[] = null;
String x = "";
String y = "";
String name = "";
for (int i = 2; i < trs.size(); i++) {//在KML文件里的HTML文本中,共同拥有13个tr,每一个tr包括了一个属性,当中第二个tr包括了全部的属性,因此我们在处理时从第三个tr開始
trContent = trs.get(i).text();
trContentSplit = trContent.split(" ");
if ("name".equals(trContentSplit[0])) {
name = trContentSplit[1];
}
if ("x".equals(trContentSplit[0]) || "X".equals(trContentSplit[0])) {
x = trContentSplit[1].trim();
}
if ("y".equals(trContentSplit[0]) || "Y".equals(trContentSplit[0])) {
y = trContentSplit[1].trim();
}
/*Elements tds = elements.get(i).select("td");
for (int j = 0; j < tds.size(); j++) {
htmlContent = tds.get(j).text();
}*/
}
Log.d("X:", x);
Log.d("Y:", y);
Log.d("Name:", name);
}
}
本文中使用了dom4j包来解析XML和jsoup包来解析HTML
Java(Android)解析KML文件的更多相关文章
- Java jdom解析xml文件带冒号的属性
Java jdom解析xml文件带冒号的属性 转载请标明出处: https://dujinyang.blog.csdn.net/article/details/99644824 本文出自:[奥特曼超人 ...
- JAVA简便解析json文件
JAVA简便解析json文件 首先放上我要解析的json文件: { "resultcode":"200", "reason":"S ...
- 解析KML文件并提取coordinates中的经纬度坐标信息
从googleEarh导出的kml文件 <?xml version="1.0" encoding="UTF-8"?><kml xmlns=&q ...
- android解析xml文件的方式
android解析xml文件的方式 作者:东子哥 ,发布于2012-11-26,来源:博客园 在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xm ...
- Java环境解析apk文件信息
概述:Java解析apk文件,获取apk文件里的包名,版本号,图标文件等; 功能:可以提供给windows和linux平台使用; 原理:利用aapt.exe或者aapt这些anroid平台解析apk文 ...
- Android 解析XML文件和生成XML文件
解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...
- Android解析XML文件
XML文件和获取XML值 XML文件样例 <?xml version="1.0" encoding="utf-8"?> <citys> ...
- java opencsv解析csv文件
记一次使用opencsv解析csv文件时碰到的坑 最近在开发过程中需要解析csv文件,公司用的解析工具是opencsv,在根据opencsv的官方文档去解析时发现csv文件中含有繁体字,使用其自带的C ...
- Android解析xml文件-采用DOM,PULL,SAX三种方法解析
解析如下xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <perso ...
随机推荐
- 【分块打表】Gym - 100923K - Por Costel and the Firecracker
semipal.in / semipal.out Por Costel the pig, our programmer in-training, has recently returned from ...
- 【最短路】【spfa】小vijos P1447 Updown
小vijos P1447 Updown 背景 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道.一辆停在轨道底部的电梯.和电梯内一杆控制电梯升降的巨大 ...
- 【暴力】洛谷 P2038 NOIP2014提高组 day2 T1 无线网络发射器选址
暴力枚举. #include<cstdio> #include<algorithm> using namespace std; ][],d,n,x,y,z,num,ans=-; ...
- 5.2类集(java学习笔记)Map,Set接口
一.Map接口 Map接口中存储数据是通过key->value的方式成对存储的,可以通过key找到value. 二.Map接口常用子类 1.HashMap HashMap是无序存放的,key不允 ...
- Problem M: 第几天——C语言初学者百题大战之十八
#include<stdio.h> int main() { int a,b,c,s; scanf("%d-%d-%d",&a,&b,&c); ...
- python3中的range函数
奇怪的现象 在paython3中 print(range(10)) 得出的结果是 range(0,10) ,而不是[0,1,2,3,4,5,6,7,8,9] ,为什么呢? 官网原话: In many ...
- MathType如何插入连乘
这个就是连乘符号,只不过看着不习惯......就在眼皮子底下.
- 重新认识JavaScript里的创建对象
一.序 面向对象有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.ECMA-262把对象定义为“无序属性的集合,其属性可以包含基本值.对象或者函数”. 使用Obje ...
- 使用apt-mirror建立局域网内的Debian/Ubuntu源镜像
转:http://forum.ubuntu.org.cn/viewtopic.php?t=41791 第一次翻译,翻译得不好还请大家见谅,多多指出错误~!:) 原文可以见如下的贴子:http://fo ...
- 获取XIB子视图的两个方法
创建了一个XIB文件 CommentCell.xib,并设置好UIImageView的tag为100,昵称UILabel的tag为101,时间的UILabel的tag为102,并制定cell为Comm ...