kmeansjava实现(javamap获取key)
本篇文章给大家谈谈
KML(Keyhole Markup Language,Keyhole 标记语言)最初是由Google 旗下的Keyhole 公司开发和维护的一种基于XML 的标记语言,利用XML 语法格式描述地理空间数据(如点、线、面、多边形和模型等) ,可以被 Google Earth、 Google Maps、国内的奥维软件识别并显示。
如果你需要解析Kml文件并将数据保存在自己的数据库,在自己的平台展示kml的地图数据的画,那么本文为你提供了解析Kml数据的Java方式的实现。
接下去讲下使用步骤引入Kml解析依赖首先下载第三方的jar包(打开网址后还需要点下Download才会下载哦)引流推广哪些网站:https://github.com/huangtingliu/java_test/blob/master/src/main/java/com/huangtl/kml/JavaAPIforKml-2.2.0.jar
形状实体类和解析类代码接下去我们需要新建形状(点/线/多边形)实体类,和一个形状数据解析类,以及形状解析出来的数据存放对象KmlData,KmlPoint(点)import de.micromata.opengis.kml.v_2_2_0.Coordinate;
import java.util.List; publicclassKmlPoint{ 引流推广哪些网站 private String color; private List points;
private String name; public String getName(){ return name; } publicvoidsetName(String name)
{ this.name = name; } public String getColor(){ 引流推广哪些网站 return color; } public
voidsetColor(String color){ this.color = color; } public List getPoints()
{ return points; } publicvoidsetPoints(List points){ this.points = points;引流推广哪些网站 } }
KmlLine(线)import de.micromata.opengis.kml.v_2_2_0.Coordinate; import java.util.List; publicclassKmlLine
{ private String color; private List points; privatelong width; private String name;
public String getName(引流推广哪些网站){ return name; } publicvoidsetName(String name){ this
.name = name; } public String getColor(){ return color; } publicvoidsetColor
(String color){ this.color = col引流推广哪些网站or; } public List getPoints(){ return
points; } publicvoidsetPoints(List points){ this.points = points; }
publiclonggetWidth(){ return width; } publicvoidsetWidth(long引流推广哪些网站 width){ this.width = width; } }
KmlPolygon(面/多边形)import de.micromata.opengis.kml.v_2_2_0.Coordinate; import java.util.List; /** * @program
: 面状实体 **/publicclassKmlPolygon{ private String color; private List 引流推广哪些网站points;
private String name; public String getName(){ return name; } publicvoidsetName(String name)
{ this.name = name; } public String getColor(){ return color; } pub引流推广哪些网站lic
voidsetColor(String color){ this.color = color; } public List getPoints()
{ return points; } publicvoidsetPoints(List points){ this.points = points; } }
KmlData类用于存放解析Kml文件的点线面的数据im引流推广哪些网站port java.util.ArrayList; import java.util.List; publicclassKmlData {private。
List kmlPoints; private List kmlLines; private List kmlPolygons;
public List getKmlPoints() { return kmlPoints; } publicvoidsetKmlPoints(List 引流推广哪些网站kmlPoints)
{ this.kmlPoints = kmlPoints; } public List getKmlLines() { return kmlLines; }
publicvoidsetKmlLines(List kmlLines){ this.kmlLines = kmlLines; } public List getKmlPolygons() {
return引流推广哪些网站 kmlPolygons; } publicvoidsetKmlPolygons(List kmlPolygons){ this.kmlPolygons = kmlPolygons; }
public List getAllItems(){ List list = new ArrayList(); list.addAll(getKmlPoints());
list.addAll(getKmlLines()); 引流推广哪些网站 list.addAll(getKmlPolygons()); returnlist; } }ParsingKmlUtil类
最重要的解析kml文件类package com.huangtl.kml; import de.micromata.opengis.kml.v_2_2_0.*; import java.io.File; import java.io.InputStream; import java.util.ArrayList; 引流推广哪些网站 import java.util.
List; /** * @description: KML文件解析 **/publicclassParsingKmlUtil{ /** * 解析kml文件 */public
KmlData parseKmlByFile(File file) { Kml kml = Kml.unmarshal(file); return getByKml(kml); 引流推广哪些网站 }
/** * 解析kml文件流 * @param inputstream * @return */public KmlData parseKmlByInputstream(InputStream inputstream) { Kml kml = Kml.unmarshal(inputstream);
return getByKml(kml); } /** * Kml对象转自定义存储对象引流推广哪些网站 * @param kml * @return */private
KmlData getByKml(Kml kml){ KmlData kmlData = new KmlData(); kmlData.setKmlPoints(new
ArrayList<>()); kmlData.setKmlLines(new ArrayList<>()); kmlData.setKmlPolygons(n引流推广哪些网站ew ArrayList<>()); Feature feature = kml.getFeature(); parseFeature(feature, kmlData);
return kmlData; } /** * 解析kml节点 * @param feature * @param kmlData */private
void parseFeature(Feature feat引流推广哪些网站ure, KmlData kmlData) { if (feature != null) { if (feature
instanceof Document) { List featureList = ((Document) feature).getFeature(); featureList.
forEach(documentFeature -> { if (引流推广哪些网站documentFeature instanceof Placemark) { getPlaceMark((Placemark) documentFeature, kmlData); }
else { parseFeature(documentFeature, kmlData); } 引流推广哪些网站 } ); }
elseif (feature instanceof Folder) { List featureList = ((Folder) feature).getFeature(); featureList.
forEach(documentFeature -> { if (docume引流推广哪些网站ntFeature instanceof Placemark) { getPlaceMark((Placemark) documentFeature, kmlData); }
else{ parseFeature(documentFeature, kmlData); } 引流推广哪些网站 } ); } } }
private void getPlaceMark(Placemark placemark, KmlData kmlData) { Geometry geometry = placemark.getGeometry(); String name = placemark.getName();
if(name==null){ 引流推广哪些网站 name=placemark.getDescription(); } parseGeometry(name, geometry, kmlData); }
/** * 解析点线面形状的数据分别放入存储对象 * @param name 形状名称 * @param geometry 形状类型 * @param kmlData 存储对象 */
private vo引流推广哪些网站id parseGeometry(String name, Geometry geometry, KmlData kmlData) { if (geometry !=
null) { if (geometry instanceof Polygon) { Polygon polygon = (Polygon) geometry; Boundary outerBoundaryIs = polygon.getOuterBoundaryI引流推广哪些网站s();
if (outerBoundaryIs != null) { LinearRing linearRing = outerBoundaryIs.getLinearRing();
if (linearRing != null) { List coordinates = linearRing.getCoordinates();
if (coordinates != null) { outerBoundary引流推广哪些网站Is = ((Polygon) geometry).getOuterBoundaryIs(); addPolygonToList(kmlData.getKmlPolygons(), name, outerBoundaryIs); } } } }
elseif (geometry instanceof LineString引流推广哪些网站) { LineString lineString = (LineString) geometry;
List coordinates = lineString.getCoordinates(); if (coordinates != null) { coordinates = ((LineString) geometry).getCoordinates(); addLineStringTo引流推广哪些网站List(kmlData.getKmlLines(), coordinates, name); } }
elseif (geometry instanceof Point) { Point point = (Point) geometry;
List coordinates = point.getCoordinates(); if (coordinates != null) { 引流推广哪些网站 coordinates = ((Point) geometry).getCoordinates(); addPointToList(kmlData.getKmlPoints(), coordinates, name); } }
elseif (geometry instanceof MultiGeometry) { List geometries = ((MultiGeometry) ge引流推广哪些网站ometry).getGeometry();
for (Geometry geometryToMult : geometries) { Boundary outerBoundaryIs;
List coordinates; if (geometryToMult instanceof Point) { coordinates = ((Point) geometryToMult).getCoordinates(); 引流推广哪些网站 addPointToList(kmlData.getKmlPoints(), coordinates, name); }
elseif (geometryToMult instanceof LineString) { coordinates = ((LineString) geometryToMult).getCoordinates(); addLineStrin引流推广哪些网站gToList(kmlData.getKmlLines(), coordinates, name); }
elseif (geometryToMult instanceof Polygon) { outerBoundaryIs = ((Polygon) geometryToMult).getOuterBoundaryIs(); addPolygonToList(kmlData.getKmlPolygons(), n引流推广哪些网站ame, outerBoundaryIs); } } } } }
/** * 保存面状数据 * @param kmlPolygonList 已有面状数据 * @param name 面状名称 * @param outerBoundaryIs 面状信息 */
private 引流推广哪些网站void addPolygonToList(List kmlPolygonList, String name, Boundary outerBoundaryIs) { LinearRing linearRing = outerBoundaryIs.getLinearRing();
//面 KmlPolygon kmlPolygon = new KmlPolygon(); kmlPolygon.setPoints(linearRing.getCoordinates()); 引流推广哪些网站 kmlPolygon.setName(name); kmlPolygonList.add(kmlPolygon); }
/** * 保存线状数据 * @param kmlLineList 已有线状数据 * @param coordinates 线状经纬度数据 * @param name 线状名称 */
private void addLineStringToList( List kmlLineList, List引流推广哪些网站 coordinates, String name) { KmlLine kmlLine =
new KmlLine(); kmlLine.setPoints(coordinates); kmlLine.setName(name); kmlLineList.add(kmlLine); }
/** * 保存点状数据 * @param kmlPointList 已有点状数据 引流推广哪些网站* @param coordinates 点状经纬度数据 * @param name 点状名称 */
private void addPointToList(List kmlPointList, List coordinates, String name) { KmlPoint kmlPoint =
new KmlPoint(); kmlPoint.setName(name); kmlPoint.setPoints(coordinates); 引流推广哪些网站 kmlPointList.add(kmlPoint); } }
测试解析效果创建一个测试类,写一个main方法测试下package com.huangtl.kml; import java.io.File; import java.io.FileInputStream; 。
import java.io.FileNotFoundException; publicclassTest{ public static void main(String引流推广哪些网站[] args) { KmlData kmlData = getKmlData();
if (kmlData.getKmlPoints().size() > 0) { System.out.println("点===="); for (KmlPoint k : kmlData.getKmlPoints()) { System.
out.println("点【"+k.getName()+"】 ====》 "+k.ge引流推广哪些网站tPoints()); } }
if (kmlData.getKmlLines().size() > 0) { System.out.println("线===="); for (KmlLine k : kmlData.getKmlLines()) { System.
out.println("线【"+k.getName()+"】 ====》 "+k.getPoints())引流推广哪些网站; } }
if (kmlData.getKmlPolygons().size() > 0) { System.out.println("面===="); for (KmlPolygon k : kmlData.getKmlPolygons()) { System.
out.println("面【"+k.getName()+"】 ====》 "+k.getPoints());引流推广哪些网站 } } }
public static KmlData getKmlData(){ KmlData kmlData = null; ParsingKmlUtil parsingKmlUtil = new ParsingKmlUtil(); String path = Main
.class.getClassLoader().getResource("").getPath(); 引流推广哪些网站 File file = new File(path+"/test.kml"); //文件地址自己修改
try { kmlData = parsingKmlUtil.parseKmlByInputstream(new FileInputStream(file)); assert kmlData !=
null; } catch (FileNotFoundException e) { e.printStackTrace(); 引流推广哪些网站 }
return kmlData; } }注意我这里解析的kml文件是本地的test.kml文件,你需要替换成自己的文件地址。看下解析效果,可以看到点线面的经纬度点数据都打印出来了。
点数据
线数据
面/多边形数据这些经纬度你都获取到了,自己想怎么展示就怎么展示了。