Android解析KML

KML服务有两种,一种是纯文本的XML,一种是将一个纯文本的XML文件和其他资源(如图标)进行zip压缩后形成的KMZ,本质是zip。使用Android解析KML服务需要根据情况首先判断是否需要解压缩,然后再解析XML文本。

Android Java中包含了zip压缩解压缩工具库,可以从“java.util.zip”包中进行调用。我们看一下一个KMZ如何被解压缩:

URL url = new URL(strUrl);
HttpURLConnection uc = (HttpURLConnection) url.openConnection();

InputStream isKxml = null;

ZipInputStream zipIs = new ZipInputStream(uc.getInputStream());
ZipEntry zipEntry = null;
while ((zipEntry = zipIs.getNextEntry()) != null)
{
String zipEntryName = zipEntry.getName();
if (zipEntryName.endsWith("kml"))
{
ByteArrayOutputStream os = new ByteArrayOutputStream();
byte[] b = new byte[512];
int readedByteSize = 0;
while ((readedByteSize = zipIs.read(b)) > 0)
{
os.write(b, 0, readedByteSize);
}
os.flush();
os.close();

isKxml = new ByteArrayInputStream(os.toByteArray());
}
else if (zipEntryName.endsWith("png"))
{
ByteArrayOutputStream os = new ByteArrayOutputStream();
byte[] b = new byte[512];
int readedByteSize = 0;
while ((readedByteSize = zipIs.read(b)) > 0)
{
os.write(b, 0, readedByteSize);
}
os.flush();
os.close();

InputStream isBitmap = new ByteArrayInputStream(os
.toByteArray());
Bitmap bitmap = BitmapFactory.decodeStream(isBitmap);
kml.addBitmap(zipEntryName, bitmap);
isBitmap.close();
}
}
zipIs.close();

Reader reader = new InputStreamReader(isKxml);
parseKxml(kml, reader);//解析KML文本的方法
isKxml.close();
reader.close();

好了,解压缩完成后,重点就在解析KML文本上了。鉴于移动终端的KML内容不应该很大,因此在这里使用了XmlDocument方法解析,下面看一下方法:

private static void parseKxml(Kml kml, Reader reader) throws Exception
{
KXmlParser kXmlParser = new KXmlParser();
kXmlParser.setInput(reader);
Document doc = new Document();
doc.parse(kXmlParser);

if (doc == null) return;

Element eRoot = doc.getRootElement();
……(处理XML Element)
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android解析KML文件的步骤如下: 1. 创建SAXParserFactory实例。 2. 创建SAXParser实例。 3. 创建DefaultHandler的子类实例,覆盖startElement()、characters()、endElement()等方法。 4. 调用SAXParser的parse()方法,传入KML文件的InputStream和DefaultHandler实例,开始解析。 5. 在startElement()方法中,可以获取到每个标签的名称和属性值。 6. 在characters()方法中,可以获取到每个标签中的文本内容。 7. 在endElement()方法中,可以处理当前标签的子标签和属性值。 以下是一个简单的例子,演示如何解析KML文件: ```java public class KmlParser { public static void parse(InputStream inputStream) { try { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); DefaultHandler handler = new DefaultHandler() { boolean inCoordinates = false; public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equalsIgnoreCase("coordinates")) { inCoordinates = true; } } public void characters(char[] ch, int start, int length) throws SAXException { if (inCoordinates) { String coords = new String(ch, start, length); // 坐标处理逻辑 inCoordinates = false; } } }; parser.parse(inputStream, handler); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上面的例子中,我们只处理了KML文件中的coordinates标签,读取其中的坐标信息。如果需要处理其他标签或属性,可以在DefaultHandler子类中覆盖相应的方法进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值