最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Java實現(xiàn)KMZ和KML數(shù)據(jù)的直接解析

 更新時間:2024年06月03日 09:38:44   作者:夜郎king  
本文主要講解如何用JAVA語言,直接解析KMZ數(shù)據(jù),文章首先介紹google地圖中的KMZ和KML數(shù)據(jù),然后使用代碼的方式實現(xiàn)數(shù)據(jù)的解析,最后展示解析成果以及如何將數(shù)據(jù)轉換成空間WKT數(shù)據(jù),需要的朋友可以參考下

引言

最近碰到有朋友咨詢,大致的問題是,他在項目中要實現(xiàn)KMZ數(shù)據(jù)的解析和WebGIS的可視化。剛好他用的技術棧是Java,同時KMZ的解析在各個網站上的相關解析代碼不多。有很多代碼是解析KML的,但是解析KMZ的相對比較少。一時沒有參考的例子,希望能結合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ù)轉換成空間WKT數(shù)據(jù)。關于JAVA解析KML的博客和資料有不少,但是KMZ文件的還是比較稀少的,供各位朋友在工作中解析KMZ文件有一個參考。

一、關于KMZ和KML

在進行相關文件的解析之前,首先我們來看一下KMZ和KML這兩種文件,先了解這兩種文件是什么?用來做什么的,具體的文件內容是什么樣的。本節(jié)主要提供這些基礎知識的講解。

1、KMZ是什么

KMZ 文件包含主 KML 文件以及0個或多個用 ZIP 格式打包成一個單元的支持文件(稱為歸檔)。然后,KMZ 文件就可以作為單個實體進行存儲和通過電子郵件發(fā)送。NetworkLink 可從網絡服務器提取 KMZ 文件。將 KMZ 文件解壓縮后,主 .kml 文件及其支持文件便分離成其各自的原始格式和目錄結構,以及原始文件名和擴展名。除了變成歸檔格式外,ZIP 格式也會受到壓縮,因此歸檔只能包含一個大型 KML 文件。根據(jù) KML 文件的內容,此過程通常會產生10:1的壓縮。10千字節(jié)的 KML 文件可以用1千字節(jié)的 KMZ 文件來提供。

KMZ是Google Earth默認的輸出文件格式,是一個經過ZIP格式壓縮過的KML文件,當我們從網站上下載KMZ文件的時候,Windows會把KMZ文件認成ZIP文件,所以另存的時候文件后綴會被改成.ZIP,因此需要手動將文件后綴改成.KMZ。   KMZ文件用ZIP工具軟件打開,然后解壓縮即可得到原始KML文件。當然,KMZ文件也有自己的好處,就是KMZ文件的自身可以包含影像,這樣就可以不依賴引用網絡上的截圖。   一般情況下,雙擊KMZ/KML文件即可從Google Earth中打開地標文件,但是需要注意的是,KMZ/KML地標文件名不能包含中文字符,文件存放的路徑也不能有中文字符,否則將無法在Google Earth中打開。

這里我們以漂亮國的全球基地為說明,驗證一下上述的內容。把KMZ文件的后綴名修改為zip,然后用壓縮文件打開??梢钥吹揭韵碌奈募?/p>

總結一下,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)盟的國際標準。經度和緯度分量(十進制度)由 1984 年世界大地測量系統(tǒng) (WGS84) 定義。垂直分量(高度)以米為單位從 WGS84 EGM96 大地水準面垂直基準面開始測量。

KML (keyhole markup language)是以XML語言為基礎開發(fā)的一種文件格式,用來描述和存儲地理信息數(shù)據(jù)(點、線、面、圖片等),是純粹的xml文本格式,可用記事本打開編輯,所以kml文件很小。KML跟XML文件最大的不同就是KML描述的是地理信息數(shù)據(jù)。最早開發(fā)KML的是keyhole公司,2004年Goole收購keyhole并用KML開發(fā)GooleEarth。KML是原先的Keyhole客戶端進行讀寫的文件格式,是一種XML描述語言,并且是文本格式,這種格式的文件對于Google Earth程序設計來說有極大的好處,程序員可以通過簡單的幾行代碼讀取出地標文件的內部信息,并且還可以通過程序自動生成KML文件,因此,使用KML格式的地標文件非常利于Google Earth應用程序的開發(fā)。

這里我們還是以上面的kml文件為說明,將打開的示例xml文件內容展示如下:

<?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文件的示例,其主體內容就是一個XML。它以XML為主體,用來存儲地理空間數(shù)據(jù)。因此對KML數(shù)據(jù)的解析,其本質就是對XML文件的解析。

二、Java解析實例

本節(jié)主要以代碼實戰(zhàn)的方式介紹使用Java編程語言實現(xiàn)對KML語言和KMZ語言的解析。由于涉及到xml的解析,這里不采用最原始的dom解析方式。對于KML語言,有成熟的組件de.micromata.jak.JavaAPIforKml對KML的解析。這里對相關的解析組件進行介紹:

序號組件名稱作用
1de.micromata.jak.JavaAPIforKmlKML文件解析
2org.apache.commons.commons-compress壓縮包解壓
3com.vividsolutions.jtsJTS wkt字符串構建

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)方式。網上很多的代碼沒有將父級類抽象出來,同時其代碼只解析了name。沒有解析description屬性。這里我們將描述信息同樣解析出來。關鍵代碼如下:

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的解析工具類,主要負責解析KML,然后根據(jù)不同的圖層,將屬性和空間坐標點信息賦值給不同的空間數(shù)據(jù)集合。網上有一些解析的代碼,僅解析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對象轉自定義存儲對象
	 * 
	 * @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 線狀經緯度數(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  點狀經緯度數(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é)將調用上面的代碼進行相應文件的解析。

三、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ù)庫中,需要進行格式轉換,比如從WKT字符串轉為Geometry。當然,保存到空間數(shù)據(jù)庫中,有很多種方法,這里我們介紹一種,基于JTS的方式構建WKT字符串,因為在MyBatis-Plus中,可以直接操作WKT字符串。將坐標轉換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解析測試

網上很多博客都只講了如何解析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轉換類,用于實現(xiàn)kml的自定義識別與讀取
 * @author 夜郎king
 */
public interface IKMLParser {
	/**
	 * @param kmlInputStream
	 * @throws IOException
	 */
	void parseKML(InputStream kmlInputStream) throws IOException;
}

然后再定義針對KMZ的內容解析代碼(基于在線解壓的方式),然后已輸入流的方式完成內容解析,這個代碼網上比較少,如果需要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文件,可以將其內容讀取出來并傳遞給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() {
			@Override
			public void parseKML(InputStream kmlInputStream) throws IOException {
				// 在這里實現(xiàn)你的KML解析邏輯
				// 例如,可以將讀取的KML內容轉換為字符串
				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內容,最后解析KML文件,然后提取空間信息。經過上述步驟,完成信息的解析。在運行以上的代碼,發(fā)現(xiàn)KMZ文件已經成功解析。

至此已經完成KMZ和KML文件的解析。 

四、總結

以上就是本文的主要內容,本文主要講解如何用JAVA語言,直接解析KMZ數(shù)據(jù)。文章首先介紹google地圖中的KMZ和KML數(shù)據(jù),然后使用代碼的方式實現(xiàn)數(shù)據(jù)的解析,最后展示解析成果以及如何將數(shù)據(jù)轉換成空間WKT數(shù)據(jù)。

到此這篇關于使用Java實現(xiàn)KMZ和KML數(shù)據(jù)的直接解析的文章就介紹到這了,更多相關Java解析KMZ和KML內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java經典設計模式之觀察者模式原理與用法詳解

    Java經典設計模式之觀察者模式原理與用法詳解

    這篇文章主要介紹了Java經典設計模式之觀察者模式,簡單分析了觀察者模式的概念、原理并結合實例形式給出了java觀察者模式的具體用法與相關注意事項,需要的朋友可以參考下
    2017-08-08
  • java中Redisson的看門狗機制的實現(xiàn)

    java中Redisson的看門狗機制的實現(xiàn)

    本文主要介紹了java中Redisson的看門狗機制的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • java實現(xiàn)簡單的小超市程序

    java實現(xiàn)簡單的小超市程序

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單的小超市程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • 解決Long類型后端到前端精度丟失問題

    解決Long類型后端到前端精度丟失問題

    文章討論了后端Long類型數(shù)據(jù)通過JSON傳遞到前端時可能出現(xiàn)的精度丟失問題,原因在于JavaScript的Number類型精度限制,提出了兩種解決方案:將Long類型序列化為String類型,或者配置全局的ObjectMapper使用ToStringSerializer,通過自定義JacksonConfig類
    2025-01-01
  • 詳解Java對象轉換神器MapStruct庫的使用

    詳解Java對象轉換神器MapStruct庫的使用

    在我們日常開發(fā)的程序中,為了各層之間解耦,一般會定義不同的對象用來在不同層之間傳遞數(shù)據(jù)。當在不同層之間傳輸數(shù)據(jù)時,不可避免地經常需要將這些對象進行相互轉換。今天給大家介紹一個對象轉換工具MapStruct,代碼簡潔安全、性能高,強烈推薦
    2022-09-09
  • java?緩沖流的概念使用方法以及實例詳解

    java?緩沖流的概念使用方法以及實例詳解

    這篇文章主要為大家介紹了java?緩沖流的概念使用方法以及實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • 使用GenericObjectPool避免泄漏設置方法

    使用GenericObjectPool避免泄漏設置方法

    這篇文章主要為大家介紹了使用GenericObjectPool避免泄漏的設置方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • hdfs集成springboot使用方法

    hdfs集成springboot使用方法

    這篇文章主要介紹了hdfs集成springboot使用,配置Configuration信息分為兩種方式,每種方式給大家介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • Springboot+Redis實現(xiàn)API接口防刷限流的項目實踐

    Springboot+Redis實現(xiàn)API接口防刷限流的項目實踐

    本文主要介紹了Springboot+Redis實現(xiàn)API接口防刷限流的項目實踐,通過限流可以讓系統(tǒng)維持在一個相對穩(wěn)定的狀態(tài),為更多的客戶提供服務,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • SpringBoot接口中如何直接返回圖片數(shù)據(jù)

    SpringBoot接口中如何直接返回圖片數(shù)據(jù)

    這篇文章主要介紹了SpringBoot接口中如何直接返回圖片數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評論

芦山县| 秦安县| 呼图壁县| 潼关县| 合江县| 保靖县| 泰和县| 台南县| 渝中区| 平江县| 哈巴河县| 稻城县| 卢龙县| 恩施市| 个旧市| 双鸭山市| 衡东县| 德昌县| 银川市| 常山县| 乳山市| 新安县| 佛冈县| 曲靖市| 禄丰县| 梁河县| 金川县| 盐津县| 合水县| 新闻| 五常市| 通化市| 石林| 晋江市| 临汾市| 新河县| 乌鲁木齐市| 广南县| 武冈市| 穆棱市| 太保市|