有哪個網(wǎng)站做正品港貨知乎推廣公司
目錄
前言
一、關(guān)于KMZ和KML
1、KMZ是什么
2、KML是什么
二、Java解析實例
1、POM.xml引用
2、KML?基類定義
3、空間對象的定義
4、Kml解析工具類
三、KML文件的解析
1、KML解析測試
2、KMZ解析測試
四、總結(jié)
前言
????????今天是六.一兒童節(jié),在這里祝各位大朋友們兒童節(jié)快樂,同時祝祖國的所有花朵們更加快樂。童年的歡樂可以治愈一切。不知道各位的兒童節(jié)是怎么度過的呀,是在陪孩子呢,還在在享受自己的歡樂時光,只愿大家都歡樂就好。這是寫在最前面祝福的話,愿我們都開心快樂。
? ? ? ? 最近碰到有朋友咨詢,大致的問題是,他在項目中要實現(xiàn)KMZ數(shù)據(jù)的解析和WebGIS的可視化。剛好他用的技術(shù)棧是Java,同時KMZ的解析在各個網(wǎng)站上的相關(guān)解析代碼不多。有很多代碼是解析KML的,但是解析KMZ的相對比較少。一時沒有參考的例子,希望能結(jié)合JAVA講一下如何進行KMZ數(shù)據(jù)的解析。其實話說回來,雖然大致了解KMZ是什么數(shù)據(jù),但是在之前的項目過程中,接觸的空間數(shù)據(jù)也基本都是shp、gdb等等,至于google的KMZ還真的是第一回接觸。
????????本文主要講解如何用JAVA語言,直接解析KMZ數(shù)據(jù)。文章首先介紹google地圖中的KMZ和KML數(shù)據(jù),然后使用代碼的方式實現(xiàn)數(shù)據(jù)的解析,最后展示解析成果以及如何將數(shù)據(jù)轉(zhuǎn)換成空間WKT數(shù)據(jù)。關(guān)于JAVA解析KML的博客和資料有不少,但是KMZ文件的還是比較稀少的,供各位朋友在工作中解析KMZ文件有一個參考。
一、關(guān)于KMZ和KML
????????在進行相關(guān)文件的解析之前,首先我們來看一下KMZ和KML這兩種文件,先了解這兩種文件是什么?用來做什么的,具體的文件內(nèi)容是什么樣的。本節(jié)主要提供這些基礎(chǔ)知識的講解。
1、KMZ是什么
????????KMZ 文件包含主 KML 文件以及0個或多個用?ZIP 格式打包成一個單元的支持文件(稱為歸檔)。然后,KMZ 文件就可以作為單個實體進行存儲和通過電子郵件發(fā)送。NetworkLink 可從網(wǎng)絡(luò)服務(wù)器提取 KMZ 文件。將 KMZ 文件解壓縮后,主 .kml 文件及其支持文件便分離成其各自的原始格式和目錄結(jié)構(gòu),以及原始文件名和擴展名。除了變成歸檔格式外,ZIP 格式也會受到壓縮,因此歸檔只能包含一個大型 KML 文件。根據(jù) KML 文件的內(nèi)容,此過程通常會產(chǎn)生10:1的壓縮。10千字節(jié)的 KML 文件可以用1千字節(jié)的 KMZ 文件來提供。
????????KMZ是Google Earth默認的輸出文件格式,是一個經(jīng)過ZIP格式壓縮過的KML文件,當(dāng)我們從網(wǎng)站上下載KMZ文件的時候,Windows會把KMZ文件認成ZIP文件,所以另存的時候文件后綴會被改成.ZIP,因此需要手動將文件后綴改成.KMZ。 ? KMZ文件用ZIP工具軟件打開,然后解壓縮即可得到原始KML文件。當(dāng)然,KMZ文件也有自己的好處,就是KMZ文件的自身可以包含影像,這樣就可以不依賴引用網(wǎng)絡(luò)上的截圖。 ? 一般情況下,雙擊KMZ/KML文件即可從Google Earth中打開地標文件,但是需要注意的是,KMZ/KML地標文件名不能包含中文字符,文件存放的路徑也不能有中文字符,否則將無法在Google Earth中打開。
????????這里我們以漂亮國的全球基地為說明,驗證一下上述的內(nèi)容。把KMZ文件的后綴名修改為zip,然后用壓縮文件打開。可以看到以下的文件:
????????總結(jié)一下,KMZ就是把KML文件,進行了一個打包。這個很重要,在后面的解析過程中,會用到這個知識點。講完了KMZ,下面介紹一下KML。
2、KML是什么
????????KML 代表 鑰匙孔標記語言。此 GIS 格式基于 XML,主要用于 Google 地球。KML由Keyhole Inc開發(fā),后來被Google收購.KMZ(KML-Zipped)取代KML成為默認的Google地球地理空間格式,因為它是文件的壓縮版本。KML/KMZ于2008年成為開放地理空間聯(lián)盟的國際標準。經(jīng)度和緯度分量(十進制度)由 1984 年世界大地測量系統(tǒng) (WGS84) 定義。垂直分量(高度)以米為單位從 WGS84 EGM96 大地水準面垂直基準面開始測量。
????????KML (keyhole markup language)是以XML語言為基礎(chǔ)開發(fā)的一種文件格式,用來描述和存儲地理信息數(shù)據(jù)(點、線、面、圖片等),是純粹的xml文本格式,可用記事本打開編輯,所以kml文件很小。KML跟XML文件最大的不同就是KML描述的是地理信息數(shù)據(jù)。最早開發(fā)KML的是keyhole公司,2004年Goole收購keyhole并用KML開發(fā)GooleEarth。KML是原先的Keyhole客戶端進行讀寫的文件格式,是一種XML描述語言,并且是文本格式,這種格式的文件對于Google Earth程序設(shè)計來說有極大的好處,程序員可以通過簡單的幾行代碼讀取出地標文件的內(nèi)部信息,并且還可以通過程序自動生成KML文件,因此,使用KML格式的地標文件非常利于Google Earth應(yīng)用程序的開發(fā)。
????????這里我們還是以上面的kml文件為說明,將打開的示例xml文件內(nèi)容展示如下:
<?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">
<Document><!-- Begin Style Definitions --><Folder><name>Point Features</name><description>Point Features</description><Placemark><description>Airport</description><name><![CDATA[CHARLESTON AFB/INTL 查爾斯頓空軍基地/國際機場]]></name><Point><coordinates>-80.0408900000,32.8985600000,0</coordinates></Point></Placemark><Placemark><description>Airport</description><name><![CDATA[DAVIS-MONTHAN AFB 戴維斯-蒙森空軍基地]]></name><Point><coordinates>-110.8822600000,32.1652200000,0</coordinates></Point></Placemark></Folder>
</Document>
</kml>
????????以上就是一個KML文件的示例,其主體內(nèi)容就是一個XML。它以XML為主體,用來存儲地理空間數(shù)據(jù)。因此對KML數(shù)據(jù)的解析,其本質(zhì)就是對XML文件的解析。
二、Java解析實例
????????本節(jié)主要以代碼實戰(zhàn)的方式介紹使用Java編程語言實現(xiàn)對KML語言和KMZ語言的解析。由于涉及到xml的解析,這里不采用最原始的dom解析方式。對于KML語言,有成熟的組件de.micromata.jak.JavaAPIforKml對KML的解析。這里對相關(guān)的解析組件進行介紹:
序號 | 組件名稱 | 作用 |
1 | de.micromata.jak.JavaAPIforKml | KML文件解析 |
2 | org.apache.commons.commons-compress | 壓縮包解壓 |
3 | com.vividsolutions.jts | JTS wkt字符串構(gòu)建 |
1、POM.xml引用
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.yelang</groupId><artifactId>gdal_demo1</artifactId><version>0.0.1-SNAPSHOT</version><name>gdal_demo1</name><description>試驗</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencies><!-- https://mvnrepository.com/artifact/de.micromata.jak/JavaAPIforKml --><dependency><groupId>de.micromata.jak</groupId><artifactId>JavaAPIforKml</artifactId><version>2.2.1</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.commons/commons-compress --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-compress</artifactId><version>1.21</version></dependency><dependency><groupId>com.vividsolutions</groupId><artifactId>jts</artifactId><version>1.13</version></dependency></dependencies>
</project>
2、KML?基類定義
????????這里進行kml 基類定義,將name、description、List<Coordinate>進行統(tǒng)一封裝。針對Point、Polygon、Polyline對象,在自己的對象屬性中擴展額外的屬性。這里采用OOP的實現(xiàn)方式。網(wǎng)上很多的代碼沒有將父級類抽象出來,同時其代碼只解析了name。沒有解析description屬性。這里我們將描述信息同樣解析出來。關(guān)鍵代碼如下:
package com.yelang.kmzcase;
import java.util.List;
import de.micromata.opengis.kml.v_2_2_0.Coordinate;
/*** kml 基類,將name、description、List<Coordinate>進行統(tǒng)一封裝* @author 夜郎king*/
public class KmlBaseEntity {private List<Coordinate> points;private String name;private String description;public List<Coordinate> getPoints() {return points;}public void setPoints(List<Coordinate> points) {this.points = points;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public KmlBaseEntity(List<Coordinate> points, String name, String description) {super();this.points = points;this.name = name;this.description = description;}public KmlBaseEntity() {super();}
}
3、空間對象的定義
????????空間對象常見的類型包括點(Point)、線(Polyline)、面(Polygon)三種類型。這里我們將根據(jù)需要定義不同的空間對象。下面分別給出實例代碼:
KmlPoint.java
package com.yelang.kmzcase;
import java.util.List;
import de.micromata.opengis.kml.v_2_2_0.Coordinate;
public class KmlPoint extends KmlBaseEntity{private String color;public String getColor() {return color;}public void setColor(String color) {this.color = color;}public KmlPoint(List<Coordinate> points,String name,String description,String color){super(points, name, description);this.color = color;}public KmlPoint() {super();}
}
KmlLine.java?
package com.yelang.kmzcase;
public class KmlLine extends KmlBaseEntity {private String color;private long width;public String getColor() {return color;}public void setColor(String color) {this.color = color;}public long getWidth() {return width;}public void setWidth(long width) {this.width = width;}
}
KmlPolygon.java
package com.yelang.kmzcase;
/*** @program: 面狀實體**/
public class KmlPolygon extends KmlBaseEntity {private String color;public String getColor() {return color;}public void setColor(String color) {this.color = color;}
}
4、Kml解析工具類
????????這里定義Kml的解析工具類,主要負責(zé)解析KML,然后根據(jù)不同的圖層,將屬性和空間坐標點信息賦值給不同的空間數(shù)據(jù)集合。網(wǎng)上有一些解析的代碼,僅解析name屬性。這里擴展了其它的屬性,包括描述屬性。詳細代碼如下:
package com.yelang.kmzcase;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文件解析**/
public class ParsingKmlUtil {/*** 解析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對象轉(zhuǎn)自定義存儲對象* * @param kml* @return*/public KmlData getByKml(Kml kml) {KmlData kmlData = new KmlData();kmlData.setKmlPoints(new ArrayList<>());kmlData.setKmlLines(new ArrayList<>());kmlData.setKmlPolygons(new ArrayList<>());Feature feature = kml.getFeature();parseFeature(feature, kmlData);return kmlData;}/*** 解析kml節(jié)點* @param feature* @param kmlData*/private void parseFeature(Feature feature, KmlData kmlData) {if (feature != null) {if (feature instanceof Document) {List<Feature> featureList = ((Document) feature).getFeature();featureList.forEach(documentFeature -> {if (documentFeature instanceof Placemark) {getPlaceMark((Placemark) documentFeature, kmlData);} else {parseFeature(documentFeature, kmlData);}});} else if (feature instanceof Folder) {List<Feature> featureList = ((Folder) feature).getFeature();featureList.forEach(documentFeature -> {if (documentFeature 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();placemark.getDescription();System.out.println(placemark.getDescription());if (name == null) {name = placemark.getDescription();}parseGeometry(name, geometry, kmlData);*/parseGeometry(placemark,geometry,kmlData);}/*** 解析點線面形狀的數(shù)據(jù)分別放入存儲對象* @param placemark placemark對象* @param geometry 形狀類型* @param kmlData 存儲對象*/private void parseGeometry(Placemark placemark, Geometry geometry, KmlData kmlData) {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(kmlData.getKmlPolygons(), placemark, outerBoundaryIs);}}}} else if (geometry instanceof LineString) {LineString lineString = (LineString) geometry;List<Coordinate> coordinates = lineString.getCoordinates();if (coordinates != null) {coordinates = ((LineString) geometry).getCoordinates();addLineStringToList(kmlData.getKmlLines(), coordinates, placemark);}} else if (geometry instanceof Point) {Point point = (Point) geometry;List<Coordinate> coordinates = point.getCoordinates();if (coordinates != null) {coordinates = ((Point) geometry).getCoordinates();addPointToList(kmlData.getKmlPoints(), coordinates, placemark);}} 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(kmlData.getKmlPoints(), coordinates, placemark);} else if (geometryToMult instanceof LineString) {coordinates = ((LineString) geometryToMult).getCoordinates();addLineStringToList(kmlData.getKmlLines(), coordinates, placemark);} else if (geometryToMult instanceof Polygon) {outerBoundaryIs = ((Polygon) geometryToMult).getOuterBoundaryIs();addPolygonToList(kmlData.getKmlPolygons(), placemark, outerBoundaryIs);}}}}}/*** 保存面狀數(shù)據(jù)* * @param kmlPolygonList 已有面狀數(shù)據(jù)* @param placemark placemark對象* @param outerBoundaryIs 面狀信息*/private void addPolygonToList(List<KmlPolygon> kmlPolygonList, Placemark placemark, Boundary outerBoundaryIs) {LinearRing linearRing = outerBoundaryIs.getLinearRing();// 面KmlPolygon kmlPolygon = new KmlPolygon();kmlPolygon.setPoints(linearRing.getCoordinates());kmlPolygon.setName(placemark.getName());kmlPolygon.setDescription(placemark.getDescription());kmlPolygonList.add(kmlPolygon);}/*** 保存線狀數(shù)據(jù)* * @param kmlLineList 已有線狀數(shù)據(jù)* @param coordinates 線狀經(jīng)緯度數(shù)據(jù)* @param name 線狀名稱*/private void addLineStringToList(List<KmlLine> kmlLineList, List<Coordinate> coordinates, Placemark placemark) {KmlLine kmlLine = new KmlLine();kmlLine.setPoints(coordinates);kmlLine.setName(placemark.getName());kmlLine.setDescription(placemark.getDescription());kmlLineList.add(kmlLine);}/*** 保存點狀數(shù)據(jù)* * @param kmlPointList 已有點狀數(shù)據(jù)* @param coordinates 點狀經(jīng)緯度數(shù)據(jù)* @param name 點狀名稱*/private void addPointToList(List<KmlPoint> kmlPointList, List<Coordinate> coordinates, Placemark placemark) {KmlPoint kmlPoint = new KmlPoint();kmlPoint.setName(placemark.getName());kmlPoint.setDescription(placemark.getDescription());kmlPoint.setPoints(coordinates);kmlPointList.add(kmlPoint);}}
????????在定義了上述的代碼之后,基本就可以實現(xiàn)了純Java對KML文件的解析。下一節(jié)將調(diào)用上面的代碼進行相應(yīng)文件的解析。
三、KML文件的解析
????????本節(jié)將重點介紹如何解析KML文件。
1、KML解析測試
package com.yelang.kmzcase;
import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.ArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.io.WKTWriter;
import de.micromata.opengis.kml.v_2_2_0.Coordinate;
import de.micromata.opengis.kml.v_2_2_0.Kml;
import java.io.*;
import com.vividsolutions.jts.geom.*;
public class KMZParser {public static void parseKml() throws IOException {ParsingKmlUtil parsingKmlUtil = new ParsingKmlUtil();File file = new File("C:/BaiduDownload/美軍基地-地圖數(shù)據(jù)(kmz)/美空軍基地 - 副本/US-AFB.KML"); // 文件地址自己修改KmlData kmlData = parsingKmlUtil.parseKmlByFile(file);// assert kmlData != null;if (kmlData.getKmlPoints().size() > 0) {for (KmlPoint k : kmlData.getKmlPoints()) {GeometryFactory geoFactory = new GeometryFactory();Coordinate coord = k.getPoints().get(0);com.vividsolutions.jts.geom.Coordinate jtCoord = new com.vividsolutions.jts.geom.Coordinate(coord.getLongitude(), coord.getLatitude(), coord.getAltitude());// 使用GeometryFactory創(chuàng)建一個點Geometry point = geoFactory.createPoint(jtCoord);WKTWriter writer = new WKTWriter();String wkt = writer.write(point);System.out.println(k.getPoints() + "\t"+ wkt +"\t"+ k.getDescription() + "\t " + k.getName());}}}// 使用示例public static void main(String[] args) throws IOException {KMZParser.parseKml();}
}
????????由于在XML中的坐標是一個數(shù)組,如果想把這些數(shù)據(jù)保存到空間數(shù)據(jù)庫中,需要進行格式轉(zhuǎn)換,比如從WKT字符串轉(zhuǎn)為Geometry。當(dāng)然,保存到空間數(shù)據(jù)庫中,有很多種方法,這里我們介紹一種,基于JTS的方式構(gòu)建WKT字符串,因為在MyBatis-Plus中,可以直接操作WKT字符串。將坐標轉(zhuǎn)換WKT字符串的方法如下:
com.vividsolutions.jts.geom.Coordinate jtCoord = new com.vividsolutions.jts.geom.Coordinate(coord.getLongitude(), coord.getLatitude(), coord.getAltitude());
// 使用GeometryFactory創(chuàng)建一個點
Geometry point = geoFactory.createPoint(jtCoord);
WKTWriter writer = new WKTWriter();
String wkt = writer.write(point);
????????在控制臺中執(zhí)行以上方法可以看到以下信息的輸出,說明KML文件解析成功。
[-80.04089,32.89856] POINT (-80.04089 32.89856) Airport CHARLESTON AFB/INTL 查爾斯頓空軍基地/國際機場
[-110.88226,32.16522] POINT (-110.88226 32.16522) Airport DAVIS-MONTHAN AFB 戴維斯-蒙森空軍基地
[-110.34393,31.58844] POINT (-110.34393 31.58844) Airport LIBBY AAF/SIERRA VISTA MUN 利比空軍基地/謝拉維斯塔
[-98.49243,33.98621] POINT (-98.49243 33.98621) Airport SHEPPARD AFB/WICHITA FALLS MUN 謝潑德空軍基地/威奇托福爾斯??
[-72.52899,42.19849] POINT (-72.52899 42.19849) Airport WESTOVER ARB/METROPOLITAN 韋斯特歐弗空軍基地
[-84.04541,39.82544] POINT (-84.04541 39.82544) Airport WRIGHT-PATTERSON AFB 賴特-帕特森空軍基地
[-84.07013,39.80072] POINT (-84.07013 39.80072) Airport WRIGHT-PATTERSON AFB 賴特-帕特森空軍基地
2、KMZ解析測試
????????網(wǎng)上很多博客都只講了如何解析KML,但是對于KMZ的解析介紹比較少,以JAVA為開發(fā)語言解析更少了。上面的方法也只實現(xiàn)了KML的解析,如果把文件換成KMZ,肯定會報錯的。不信來試試。錯誤信息如下:
?????????如果發(fā)生了以上的異常,不要急。發(fā)生這個異常的原因其實在文章的開頭就講過了。如果看到這里前面沒有印象的,可以翻到前面去看一下。還是簡單說明一下吧,主要是KMZ是KML的壓縮包,而以上代碼是KML的解析,沒有對KMZ進行解壓。這里有兩種方法來實現(xiàn),第一種是將KMZ文件進行解壓,然后對解壓后的文件解析,肯定沒問題。第二種是在壓縮包中讀取,然后對壓縮流信息進行解析。第一種方式會增加不必要的臟文件,第二種則不會,因為原始文件只有一個。?下面我們采用第二種實現(xiàn)方式,首先來定義一個處理接口(必須要):
package com.yelang.kmzcase;
import java.io.IOException;
import java.io.InputStream;
/*** kml轉(zhuǎn)換類,用于實現(xiàn)kml的自定義識別與讀取* @author 夜郎king*/
public interface IKMLParser {/*** @param kmlInputStream* @throws IOException*/void parseKML(InputStream kmlInputStream) throws IOException;
}
????????然后再定義針對KMZ的內(nèi)容解析代碼(基于在線解壓的方式),然后已輸入流的方式完成內(nèi)容解析,這個代碼網(wǎng)上比較少,如果需要KMZ文件解析,可以作為參考:
public static void parseKMZFile(File kmzFile, IKMLParser kmlParser) throws IOException {try (InputStream fileInputStream = new FileInputStream(kmzFile);ArchiveInputStream archiveInputStream = new ZipArchiveInputStream(fileInputStream)) {ArchiveEntry entry;while ((entry = archiveInputStream.getNextEntry()) != null) {String name = entry.getName();if (name.toLowerCase().endsWith(".kml") || name.toLowerCase().endsWith(".kmz")) {// 如果發(fā)現(xiàn).kml或.kmz文件,可以將其內(nèi)容讀取出來并傳遞給KMLParser處理kmlParser.parseKML(archiveInputStream);}}}}public static void parseKmz() throws IOException {File kmzFile = new File("C:/BaiduDownload/美軍基地-地圖數(shù)據(jù)(kmz)/美國全球基地.kmz");KMZParser.parseKMZFile(kmzFile, new IKMLParser() {@Overridepublic void parseKML(InputStream kmlInputStream) throws IOException {// 在這里實現(xiàn)你的KML解析邏輯// 例如,可以將讀取的KML內(nèi)容轉(zhuǎn)換為字符串try (BufferedReader reader = new BufferedReader(new InputStreamReader(kmlInputStream))) {String line;StringBuffer xmlContent = new StringBuffer(1024);while ((line = reader.readLine()) != null) {// 處理每一行KML數(shù)據(jù)xmlContent.append(line);}// System.out.println(xmlContent);Kml kml = Kml.unmarshal(xmlContent.toString());ParsingKmlUtil pku = new ParsingKmlUtil();KmlData kmlData = pku.getByKml(kml);if (null != kmlData.getKmlPoints()&&kmlData.getKmlPoints().size() > 0) {for (KmlPoint kp : kmlData.getKmlPoints()) {GeometryFactory geoFactory = new GeometryFactory();Coordinate coord = kp.getPoints().get(0);com.vividsolutions.jts.geom.Coordinate jtCoord = new com.vividsolutions.jts.geom.Coordinate(coord.getLongitude(), coord.getLatitude(), coord.getAltitude());// 使用GeometryFactory創(chuàng)建一個點Geometry point = geoFactory.createPoint(jtCoord);WKTWriter writer = new WKTWriter();String wkt = writer.write(point);System.out.println(kp.getPoints() + "\t"+ wkt +"\t"+ kp.getDescription() + "\t " + kp.getName());}System.out.println("美軍全球基地的數(shù)據(jù)是==>" + kmlData.getKmlPoints().size());}} catch (IOException e) {e.printStackTrace();}}});}
????????上述代碼的主要邏輯是,使用compress對KMZ文件進行在線解壓,然后動態(tài)拼接KML內(nèi)容,最后解析KML文件,然后提取空間信息。經(jīng)過上述步驟,完成信息的解析。在運行以上的代碼,發(fā)現(xiàn)KMZ文件已經(jīng)成功解析。
????????至此已經(jīng)完成KMZ和KML文件的解析。?
四、總結(jié)
????????以上就是本文的主要內(nèi)容,本文主要講解如何用JAVA語言,直接解析KMZ數(shù)據(jù)。文章首先介紹google地圖中的KMZ和KML數(shù)據(jù),然后使用代碼的方式實現(xiàn)數(shù)據(jù)的解析,最后展示解析成果以及如何將數(shù)據(jù)轉(zhuǎn)換成空間WKT數(shù)據(jù)。關(guān)于JAVA解析KML的博客和資料有不少,但是KMZ文件的還是比較稀少的,算是作為網(wǎng)文的一種補充,供各位朋友在工作中解析KMZ文件有一個參考。行文倉促,定有不足之處,歡迎各位朋友在評論區(qū)批評指正,不勝感激。
????????博文在編寫過程中參考了以下博文:
????????1、什么是 KMZ 文件?。
????????2、從事地信測繪必須知道的GIS常見數(shù)據(jù)格式類型,以及數(shù)據(jù)格式和擴展名匯總。
????????3、地理信息地圖標記KML與KMZ的區(qū)別。
????????4、java 生成kml 文件。
????????5、Java解析kml文件獲取點/線段/多邊形面狀地圖經(jīng)緯度信息。