KML(Keyhole Markup Language,Keyhole 标记语言)最初是由Google 旗下的Keyhole 公司开发和维护的一种基于XML 的标记语言,利用XML 语法格式描述地理空间数据(如点、线、面、多边形和模型等),适合网络环境下的地理信息协作与共享。

解决方案:获取到kml文件的根节点(kml),接下来获取第二级节点这里的情况目前看来只有两种节点(Document或Folder),接下来的情况就比较多了,可以为以上两种及PlaceMark以及其他的一些用户坐标点修饰的样式节点(style),其中PlaceMark节点,依次去解析这些节点下的子节点就可以获取到你所需的信息。

java解析kml文件只要使用了JAK(Java API For KML) 。JAK包可以通过https://github.com/yzjxiaoyue/JavaParseKMLForJAK/raw/master/lib/JavaAPIforKml-2.2.0.jar获取。

点:

import de.micromata.opengis.kml.v_2_2_0.Coordinate;import java.util.List;public class KmlPoint {private List<Coordinate> points;private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Coordinate> getPoints() {return points;}public void setPoints(List<Coordinate> points) {this.points = points;}
}

线:

import de.micromata.opengis.kml.v_2_2_0.Coordinate;import java.util.List;public class KmlLine {private List<Coordinate> points;private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Coordinate> getPoints() {return points;}public void setPoints(List<Coordinate> points) {this.points = points;}
}

面:

import de.micromata.opengis.kml.v_2_2_0.Coordinate;import java.util.List;/*** @program: ParseKMLForJava* @description:* @author: Mr.Yue* @create: 2018-12-04 21:12**/
public class KmlPolygon {private List<Coordinate> points;private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Coordinate> getPoints() {return points;}public void setPoints(List<Coordinate> points) {this.points = points;}
}

封装类KmlProperty :用于获取点线面。

import java.util.List;class KmlProperty {private List<KmlPoint> kmlPoints;private List<KmlLine> kmlLines;private List<KmlPolygon> kmlPolygons;public List<KmlPoint> getKmlPoints() {return kmlPoints;}public void setKmlPoints(List<KmlPoint> kmlPoints) {this.kmlPoints = kmlPoints;}public List<KmlLine> getKmlLines() {return kmlLines;}public void setKmlLines(List<KmlLine> kmlLines) {this.kmlLines = kmlLines;}public List<KmlPolygon> getKmlPolygons() {return kmlPolygons;}public void setKmlPolygons(List<KmlPolygon> kmlPolygons) {this.kmlPolygons = kmlPolygons;}
}

KML文件解析方法:

import de.micromata.opengis.kml.v_2_2_0.*;import java.io.File;
import java.util.ArrayList;
import java.util.List;/*** @program: my_project* @description: KML文件解析:先获取kml文件的根节点,依次遍历当前节点的子节点的信息,* 如果遇到节点属于Folder、Document则继续解析其子节点;反之则解析PlaceMark节点(主要解析LineString、Point、Polygon)。* @author: Yue* @create: 2018-12-01 12:39**/
public class ParsingKmlUtil {//以下三行都是自定义的KML类,用于获取名称name、所有点points、样式颜色colorprivate List<KmlPoint> kmlPointList = new ArrayList<>();private List<KmlLine> kmlLineList = new ArrayList<>();private List<KmlPolygon> kmlPolygonList = new ArrayList<>();private KmlProperty kmlProperty = new KmlProperty();/*** 保存kml数据到临时表** @param file 上传的文件实体* @return 自定义的KML文件实体*/public KmlProperty parseKmlForJAK(File file) {Kml kml = Kml.unmarshal(file);Feature feature = kml.getFeature();parseFeature(feature);kmlProperty.setKmlPoints(kmlPointList);kmlProperty.setKmlLines(kmlLineList);kmlProperty.setKmlPolygons(kmlPolygonList);return kmlProperty;}/*** 解析kml节点信息** @param feature 需要解析到要素信息* @return*/private void parseFeature(Feature feature) {if (feature != null) {//判断根节点是否为Documentif (feature instanceof Document) {List<Feature> featureList = ((Document) feature).getFeature();//遍历已获取的节点信息(节点信息为List),将list使用forEach进行遍历(同for、while)featureList.forEach(documentFeature -> {//判断遍历节点是否为PlaceMark,否则迭代解析if (documentFeature instanceof Placemark) {getPlaceMark((Placemark) documentFeature);} else {parseFeature(documentFeature);}});} else if (feature instanceof Folder) {//原理同上List<Feature> featureList = ((Folder) feature).getFeature();featureList.forEach(documentFeature -> {if (documentFeature instanceof Placemark) {getPlaceMark((Placemark) documentFeature);}{parseFeature(documentFeature);}});}}}/*** 解析PlaceMark节点下的信息** @return*/private void getPlaceMark(Placemark placemark) {Geometry geometry = placemark.getGeometry();String name = placemark.getName();parseGeometry(name, geometry);}/*** 解析PlaceMark节点下的信息** @return*/private void parseGeometry(String name, Geometry geometry) {if (geometry != null) {if (geometry instanceof Polygon) {Polygon polygon = (Polygon) geometry;Boundary outerBoundaryIs = polygon.getOuterBoundaryIs();if (outerBoundaryIs != null) {LinearRing linearRing = outerBoundaryIs.getLinearRing();if (linearRing != null) {List<Coordinate> coordinates = linearRing.getCoordinates();if (coordinates != null) {outerBoundaryIs = ((Polygon) geometry).getOuterBoundaryIs();addPolygonToList(kmlPolygonList, name, outerBoundaryIs);}}}} else if (geometry instanceof LineString) {LineString lineString = (LineString) geometry;List<Coordinate> coordinates = lineString.getCoordinates();if (coordinates != null) {coordinates = ((LineString) geometry).getCoordinates();addLineStringToList(kmlLineList, coordinates, name);}} else if (geometry instanceof Point) {Point point = (Point) geometry;List<Coordinate> coordinates = point.getCoordinates();if (coordinates != null) {coordinates = ((Point) geometry).getCoordinates();addPointToList(kmlPointList, coordinates, name);}} else if (geometry instanceof MultiGeometry) {List<Geometry> geometries = ((MultiGeometry) geometry).getGeometry();for (Geometry geometryToMult : geometries) {Boundary outerBoundaryIs;List<Coordinate> coordinates;if (geometryToMult instanceof Point) {coordinates = ((Point) geometryToMult).getCoordinates();addPointToList(kmlPointList, coordinates, name);} else if (geometryToMult instanceof LineString) {coordinates = ((LineString) geometryToMult).getCoordinates();addLineStringToList(kmlLineList, coordinates, name);} else if (geometryToMult instanceof Polygon) {outerBoundaryIs = ((Polygon) geometryToMult).getOuterBoundaryIs();addPolygonToList(kmlPolygonList, name, outerBoundaryIs);}}}}}/*** 将kml中所有面添加到一个list** @return*/private void addPolygonToList(List<KmlPolygon> kmlPolygonList, String name, Boundary outerBoundaryIs) {LinearRing linearRing;List<Coordinate> coordinates;linearRing = outerBoundaryIs.getLinearRing();//面coordinates = linearRing.getCoordinates();KmlPolygon kmlPolygon = new KmlPolygon();kmlPolygon.setPoints(coordinates);kmlPolygon.setName(name);kmlPolygonList.add(kmlPolygon);}/*** 将kml中所有线添加到一个list** @return*/private void addLineStringToList(List<KmlLine> kmlLineList, List<Coordinate> coordinates, String name) {KmlLine kmlLine = new KmlLine();kmlLine.setPoints(coordinates);kmlLine.setName(name);kmlLineList.add(kmlLine);}/*** 将kml中所有点添加到一个list** @return*/private void addPointToList(List<KmlPoint> kmlPointList, List<Coordinate> coordinates, String name) {KmlPoint kmlPoint = new KmlPoint();kmlPoint.setName(name);kmlPoint.setPoints(coordinates);kmlPointList.add(kmlPoint);}
}

KML解析方法调用:


import java.io.File;
public class Main {public static void main(String[] args) {KmlProperty kmlProperty;ParsingKmlUtil parsingKmlUtil =new ParsingKmlUtil();File file = new File("src/point.kml");kmlProperty = parsingKmlUtil.parseKmlForJAK(file);assert kmlProperty != null;if (kmlProperty.getKmlPoints().size() > 0) {for (KmlPoint k : kmlProperty.getKmlPoints()) {System.out.println(k.getName());}System.out.println("点");}if (kmlProperty.getKmlLines().size() > 0) {for (KmlLine k : kmlProperty.getKmlLines()) {System.out.println(k.getName());}System.out.println("线");}if (kmlProperty.getKmlPoints().size() > 0) {for (KmlPoint k : kmlProperty.getKmlPoints()) {System.out.println(k.getPoints());}System.out.println("面");}}
}

项目源代码:https://github.com/yzjxiaoyue/JavaParseKMLForJAK

代码参考于:https://stackoverrun.com/cn/q/4243988#47576837,之前写的使用Groovy,经过理解和修改得到以上代码。

Java解析KML文件相关推荐

  1. java 解析 csv 文件

    文章分类:JavaEye 一.貌似有bug,不行用 二.或 三. 的方法 Java代码   import java.io.BufferedReader; import java.io.FileInpu ...

  2. 用正则表达式和java解析csv文件

    用正则表达式和java解析csv文件 作者:弹着钢琴设计  来源:博客园  发布时间:2009-06-15 18:31  阅读:337 次  原文链接   [收藏]   在解析csv文件之前,先来看看 ...

  3. java解析dxf文件_浅析JVM方法解析、创建和链接

    一:前言 上周末写了一篇文章<你知道Java类是如何被加载的吗?>,分析了HotSpot是如何加载Java类的,干脆趁热打铁,本周末再来分析下Hotspot又是如何解析.创建和链接类方法的 ...

  4. java解析xml文件

    使用java解析xml文件,通过dom4j. 代码如下: package com.java.team; import java.io.File; import java.util.ArrayList; ...

  5. java解析Excel文件

    下文介绍java解析Excel文件的方案 前置准备 1.第三方jar包或者Maven配置 org.apache.poi的jar包 Maven配置如下 <groupId>org.apache ...

  6. XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点 查找校验xml文件中相同的节点属性值 java遍历文件夹解析XML

    XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点 以及查找xml文件中相同的节点属性值 项目背景:这是本人实习中所碰到的项目,当时感觉很棘手, ...

  7. JAVA解析.xlsb文件

    Java解析.Xlsb文件 pom.xml <dependency><groupId>org.apache.poi</groupId><artifactId& ...

  8. JS如何解析kml文件中的数据

    1.JS如何解析kml文件中的数据 1. 需要将文件转换为字符串 2. 再使用DOMParser().parseFromString将字符串转换为xml文档 3. 再使用@mapbox/togeojs ...

  9. java解析xml文件的几种方式(DOM解析)

    好久不用的东西,今天居然被面试官问到了.那既然这样,我们就一起回顾下java解析xml文件的几种方式吧. DOM解析 dom解析所需依赖是我们jdk自带的,所以只需要使用jdk为我们提供的接口即可上手 ...

  10. Java解析yaml文件

    Java解析yaml文件 1. 什么是yaml ? 2. 导入maven依赖 3. yaml 案例文件 4. 示例代码 5. 解析结果 1. 什么是yaml ? 参考下方链接 yaml快速入门 2. ...

最新文章

  1. 万万没想到,逛B站也能学编程了
  2. 通过ArcCatalog连接ArcGIS Server的种种问题
  3. 综合布线成数据中心建设和运营的重要课题
  4. 自学问题 zx yl
  5. 参考文献自动搜集管理完美攻略(图文版): Latex+Lyx+Zotero
  6. [转] 计算机视觉领域稍微容易中的期刊
  7. android状态栏自定义,如何自定义Android状态栏颜色
  8. 深度学习总概论(超神之路)
  9. matlab求两点的距离,matlab求两点间距离
  10. FDDB人脸库评价人脸检测模型超详细步骤
  11. 从春招到秋招,算法工程师养成记
  12. 【视野】解密腾讯完整前端技术体系
  13. 爸妈老了而我还未长大--《Coraline》观后感
  14. RedHat(RHEL)6.2 X64 Oracle11g X64 安装参考文档
  15. Python爬取京东商品评论
  16. 在电脑上图片过长,但是要截成一张图片,解决方案
  17. 安卓讲课笔记2.1Activity概述——上机操作
  18. 深度解读Coatue:向加密行业转舵的「老虎环球基金」
  19. android 验证码之短信验证(云之讯短信平台)
  20. 0-1整数规划的LINGO求解

热门文章

  1. 2019年美赛E题翻译与思路详解
  2. 手机模拟门禁卡 — 手机软件教程
  3. html页面导出pdf截断问题,vue页面生成pdf且避免分页截断处理
  4. 知网下载pdf论文的最简单方法
  5. 离散数学11:图的着色
  6. 读《反欺骗的艺术》有感
  7. 《shell脚本学习指南》学习笔记之入门 一
  8. 计算机数值方法第三版答案百度云,数值计算方法课后习题答案(李庆扬等)..doc...
  9. 无线网络安全技术基础
  10. Windows内核编程(二)-第一个内核程序