中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

有哪個網(wǎng)站做正品港貨知乎推廣公司

有哪個網(wǎng)站做正品港貨,知乎推廣公司,開源企業(yè)cms建站系統(tǒng),城鄉(xiāng)建設(shè)廳網(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é),在這里祝各位大朋友…

目錄

前言

一、關(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)的解析組件進行介紹:

序號組件名稱作用
1de.micromata.jak.JavaAPIforKmlKML文件解析
2org.apache.commons.commons-compress壓縮包解壓
3com.vividsolutions.jtsJTS 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)緯度信息。

http://www.risenshineclean.com/news/58959.html

相關(guān)文章:

  • 網(wǎng)站必須做ssl認證淘寶店鋪推廣方式有哪些
  • 可做影視網(wǎng)站的服務(wù)器什么文案容易上熱門
  • 深圳龍華網(wǎng)站建設(shè)百度識圖搜索
  • 中糧我買網(wǎng)是哪個公司做的網(wǎng)站怎么創(chuàng)建網(wǎng)址
  • 網(wǎng)站服務(wù)器怎么做廣州seo工作
  • 網(wǎng)站底部模板淘寶一個關(guān)鍵詞要刷多久
  • 做網(wǎng)站用的什么服務(wù)器嗎廣州seo網(wǎng)站優(yōu)化培訓(xùn)
  • 找婚慶公司去什么網(wǎng)站東莞網(wǎng)絡(luò)公司代理
  • 網(wǎng)站虛擬機可以自己做嗎百度一下app下載安裝
  • 張家港做網(wǎng)站排名多少關(guān)鍵詞排名優(yōu)化軟件
  • 編程貓官方網(wǎng)站入口免費自建網(wǎng)站有哪些
  • 在哪個網(wǎng)站做網(wǎng)上兼職靠譜市場調(diào)研的基本流程
  • 用網(wǎng)上的文章做網(wǎng)站行嗎如何增加網(wǎng)站的外鏈
  • 教育主管部門建設(shè)的專題資源網(wǎng)站是友情鏈接怎么設(shè)置
  • wordpress聯(lián)系我插件seo關(guān)鍵詞排名
  • 前端網(wǎng)站開發(fā)實例視頻杭州排名優(yōu)化公司
  • 筑業(yè)網(wǎng)seo網(wǎng)站有哪些
  • 泰安飛訊網(wǎng)絡(luò)有限公司東莞seo建站排名
  • 做服務(wù)網(wǎng)站自媒體怎么做
  • 網(wǎng)站域名是什么南寧seo排名收費
  • 華寧網(wǎng)站建設(shè)百度大搜
  • 網(wǎng)站建設(shè)空間使用標準外貿(mào)獨立站推廣
  • 別墅裝修設(shè)計公司哪家好網(wǎng)站怎么優(yōu)化搜索
  • 上海做網(wǎng)站建設(shè)的公司免費建站哪個網(wǎng)站最好
  • 中國建設(shè)局網(wǎng)站招聘怎么做線上推廣
  • 網(wǎng)站的素材做logoseo推廣一年要多少錢
  • wordpress 客戶端源碼分析甘肅搜索引擎網(wǎng)絡(luò)優(yōu)化
  • 個人網(wǎng)站可以做推廣嗎網(wǎng)站建設(shè)網(wǎng)絡(luò)公司
  • 網(wǎng)站建設(shè)管理關(guān)于友誼的連接
  • 網(wǎng)站怎么才能吸引人seo優(yōu)化步驟