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 ...
随机推荐
- DNS隧道工具dns2tcp
DNS隧道工具dns2tcp 在很多网络环境中,防火墙会限制出站流量,主机往往只能访问外网主机有限的几个端口,如DNS的53端口.这时,就可以通过DNS请求和响应机制,建立通信隧道.Kali Li ...
- Educational Codeforces Round 10 E - Pursuit For Artifacts (强联通缩点 + 回溯)
题目链接:http://codeforces.com/contest/652/problem/E 给你n个点m个边,x和y双向连接,要是z是1表示这条边上有宝藏,0则没有,最后给你起点和终点,问你要是 ...
- POJ 3293 Rectilinear polygon(几何基础)
[题目链接] http://poj.org/problem?id=3293 [题目大意] 给出一些点,每个点只能向外引出一条平行X轴,和Y轴的边, 问能否构成一个闭多边形,如果能,返回多边形的总边长, ...
- Problem X: 零起点学算法22——华氏摄氏温度转换
#include<stdio.h> int main() { float f,c; while(scanf("%f",&f)!=EOF) c=*(f-); pr ...
- Oracle常见故障问题
1. ORA-27102: out of memory 创建pfile文件: create pfile from spfile: 修改pfile文件 修改文件/home/oracle/app/orac ...
- ProgressDialog进度条对话框
(一) 1.效果图: 2.activity_main.xml <?xml version="1.0" encoding="utf-8"?> < ...
- Debian安装VirtualBox增强工具
切换到root用户: apt-get install build-essential 或者 apt-get install gcc make apt-get install dkms apt-get ...
- activiti-explorer 流程中文乱码问题
1.activiti-cfg.xml的修改,添加activityFontName和labelFontName属性 <bean id="processEngineConfiguratio ...
- dd-wrt端口映射不出去的解决办法
本人有一个巴法络的WZR-HP-G450H系统自带的固件不好用,但是随机却带了一个官方定制的DD-WRT,于是刷了去,但是今天在做一个FTP的时候突然无论怎么样映射或是做DMZ都不会出去,终于找到解决 ...
- linux:使用comm命令比较两个文件:交集、差
linux:使用comm命令比较两个文件:交集.差 comm命令可以按行比较两个排序好的文件,输出有3列:第一列是file1独有的.第二列是file2独有的,第三列是两者都有的,简单语法如下:NAME ...