纯Java实现Google地图的KMZ和KML文件的解析
目录
前言
一、关于KMZ和KML
1、KMZ是什么
2、KML是什么
二、Java解析实例
1、POM.xml引用
2、KML 基类定义
3、空间对象的定义
4、Kml解析工具类
三、KML文件的解析
1、KML解析测试
2、KMZ解析测试
四、总结
前言
今天是六.一儿童节,在这里祝各位大朋友们儿童节快乐,同时祝祖国的所有花朵们更加快乐。童年的欢乐可以治愈一切。不知道各位的儿童节是怎么度过的呀,是在陪孩子呢,还在在享受自己的欢乐时光,只愿大家都欢乐就好。这是写在最前面祝福的话,愿我们都开心快乐。
最近碰到有朋友咨询,大致的问题是,他在项目中要实现KMZ数据的解析和WebGIS的可视化。刚好他用的技术栈是Java,同时KMZ的解析在各个网站上的相关解析代码不多。有很多代码是解析KML的,但是解析KMZ的相对比较少。一时没有参考的例子,希望能结合JAVA讲一下如何进行KMZ数据的解析。其实话说回来,虽然大致了解KMZ是什么数据,但是在之前的项目过程中,接触的空间数据也基本都是shp、gdb等等,至于google的KMZ还真的是第一回接触。
本文主要讲解如何用JAVA语言,直接解析KMZ数据。文章首先介绍google地图中的KMZ和KML数据,然后使用代码的方式实现数据的解析,最后展示解析成果以及如何将数据转换成空间WKT数据。关于JAVA解析KML的博客和资料有不少,但是KMZ文件的还是比较稀少的,供各位朋友在工作中解析KMZ文件有一个参考。
一、关于KMZ和KML
在进行相关文件的解析之前,首先我们来看一下KMZ和KML这两种文件,先了解这两种文件是什么?用来做什么的,具体的文件内容是什么样的。本节主要提供这些基础知识的讲解。
1、KMZ是什么
KMZ 文件包含主 KML 文件以及0个或多个用 ZIP 格式打包成一个单元的支持文件(称为归档)。然后,KMZ 文件就可以作为单个实体进行存储和通过电子邮件发送。NetworkLink 可从网络服务器提取 KMZ 文件。将 KMZ 文件解压缩后,主 .kml 文件及其支持文件便分离成其各自的原始格式和目录结构,以及原始文件名和扩展名。除了变成归档格式外,ZIP 格式也会受到压缩,因此归档只能包含一个大型 KML 文件。根据 KML 文件的内容,此过程通常会产生10:1的压缩。10千字节的 KML 文件可以用1千字节的 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,然后用压缩文件打开。可以看到以下的文件:
总结一下,KMZ就是把KML文件,进行了一个打包。这个很重要,在后面的解析过程中,会用到这个知识点。讲完了KMZ,下面介绍一下KML。
2、KML是什么
KML 代表 钥匙孔标记语言。此 GIS 格式基于 XML,主要用于 Google 地球。KML由Keyhole Inc开发,后来被Google收购.KMZ(KML-Zipped)取代KML成为默认的Google地球地理空间格式,因为它是文件的压缩版本。KML/KMZ于2008年成为开放地理空间联盟的国际标准。经度和纬度分量(十进制度)由 1984 年世界大地测量系统 (WGS84) 定义。垂直分量(高度)以米为单位从 WGS84 EGM96 大地水准面垂直基准面开始测量。
KML (keyhole markup language)是以XML语言为基础开发的一种文件格式,用来描述和存储地理信息数据(点、线、面、图片等),是纯粹的xml文本格式,可用记事本打开编辑,所以kml文件很小。KML跟XML文件最大的不同就是KML描述的是地理信息数据。最早开发KML的是keyhole公司,2004年Goole收购keyhole并用KML开发GooleEarth。KML是原先的Keyhole客户端进行读写的文件格式,是一种XML描述语言,并且是文本格式,这种格式的文件对于Google Earth程序设计来说有极大的好处,程序员可以通过简单的几行代码读取出地标文件的内部信息,并且还可以通过程序自动生成KML文件,因此,使用KML格式的地标文件非常利于Google Earth应用程序的开发。
这里我们还是以上面的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为主体,用来存储地理空间数据。因此对KML数据的解析,其本质就是对XML文件的解析。
二、Java解析实例
本节主要以代码实战的方式介绍使用Java编程语言实现对KML语言和KMZ语言的解析。由于涉及到xml的解析,这里不采用最原始的dom解析方式。对于KML语言,有成熟的组件de.micromata.jak.JavaAPIforKml对KML的解析。这里对相关的解析组件进行介绍:
序号 | 组件名称 | 作用 |
1 | de.micromata.jak.JavaAPIforKml | KML文件解析 |
2 | org.apache.commons.commons-compress | 压缩包解压 |
3 | com.vividsolutions.jts | JTS 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>进行统一封装。针对Point、Polygon、Polyline对象,在自己的对象属性中扩展额外的属性。这里采用OOP的实现方式。网上很多的代码没有将父级类抽象出来,同时其代码只解析了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>进行统一封装* @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)三种类型。这里我们将根据需要定义不同的空间对象。下面分别给出实例代码:
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,然后根据不同的图层,将属性和空间坐标点信息赋值给不同的空间数据集合。网上有一些解析的代码,仅解析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节点* @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);}/*** 解析点线面形状的数据分别放入存储对象* @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);}}}}}/*** 保存面状数据* * @param kmlPolygonList 已有面状数据* @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);}/*** 保存线状数据* * @param kmlLineList 已有线状数据* @param coordinates 线状经纬度数据* @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);}/*** 保存点状数据* * @param kmlPointList 已有点状数据* @param coordinates 点状经纬度数据* @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);}}
在定义了上述的代码之后,基本就可以实现了纯Java对KML文件的解析。下一节将调用上面的代码进行相应文件的解析。
三、KML文件的解析
本节将重点介绍如何解析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/美军基地-地图数据(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创建一个点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中的坐标是一个数组,如果想把这些数据保存到空间数据库中,需要进行格式转换,比如从WKT字符串转为Geometry。当然,保存到空间数据库中,有很多种方法,这里我们介绍一种,基于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创建一个点
Geometry point = geoFactory.createPoint(jtCoord);
WKTWriter writer = new WKTWriter();
String wkt = writer.write(point);
在控制台中执行以上方法可以看到以下信息的输出,说明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为开发语言解析更少了。上面的方法也只实现了KML的解析,如果把文件换成KMZ,肯定会报错的。不信来试试。错误信息如下:
如果发生了以上的异常,不要急。发生这个异常的原因其实在文章的开头就讲过了。如果看到这里前面没有印象的,可以翻到前面去看一下。还是简单说明一下吧,主要是KMZ是KML的压缩包,而以上代码是KML的解析,没有对KMZ进行解压。这里有两种方法来实现,第一种是将KMZ文件进行解压,然后对解压后的文件解析,肯定没问题。第二种是在压缩包中读取,然后对压缩流信息进行解析。第一种方式会增加不必要的脏文件,第二种则不会,因为原始文件只有一个。 下面我们采用第二种实现方式,首先来定义一个处理接口(必须要):
package com.yelang.kmzcase;
import java.io.IOException;
import java.io.InputStream;
/*** kml转换类,用于实现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")) {// 如果发现.kml或.kmz文件,可以将其内容读取出来并传递给KMLParser处理kmlParser.parseKML(archiveInputStream);}}}}public static void parseKmz() throws IOException {File kmzFile = new File("C:/BaiduDownload/美军基地-地图数据(kmz)/美国全球基地.kmz");KMZParser.parseKMZFile(kmzFile, new IKMLParser() {@Overridepublic void parseKML(InputStream kmlInputStream) throws IOException {// 在这里实现你的KML解析逻辑// 例如,可以将读取的KML内容转换为字符串try (BufferedReader reader = new BufferedReader(new InputStreamReader(kmlInputStream))) {String line;StringBuffer xmlContent = new StringBuffer(1024);while ((line = reader.readLine()) != null) {// 处理每一行KML数据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创建一个点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("美军全球基地的数据是==>" + kmlData.getKmlPoints().size());}} catch (IOException e) {e.printStackTrace();}}});}
上述代码的主要逻辑是,使用compress对KMZ文件进行在线解压,然后动态拼接KML内容,最后解析KML文件,然后提取空间信息。经过上述步骤,完成信息的解析。在运行以上的代码,发现KMZ文件已经成功解析。
至此已经完成KMZ和KML文件的解析。
四、总结
以上就是本文的主要内容,本文主要讲解如何用JAVA语言,直接解析KMZ数据。文章首先介绍google地图中的KMZ和KML数据,然后使用代码的方式实现数据的解析,最后展示解析成果以及如何将数据转换成空间WKT数据。关于JAVA解析KML的博客和资料有不少,但是KMZ文件的还是比较稀少的,算是作为网文的一种补充,供各位朋友在工作中解析KMZ文件有一个参考。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激。
博文在编写过程中参考了以下博文:
1、什么是 KMZ 文件?。
2、从事地信测绘必须知道的GIS常见数据格式类型,以及数据格式和扩展名汇总。
3、地理信息地图标记KML与KMZ的区别。
4、java 生成kml 文件。
5、Java解析kml文件获取点/线段/多边形面状地图经纬度信息。
相关文章:

纯Java实现Google地图的KMZ和KML文件的解析
目录 前言 一、关于KMZ和KML 1、KMZ是什么 2、KML是什么 二、Java解析实例 1、POM.xml引用 2、KML 基类定义 3、空间对象的定义 4、Kml解析工具类 三、KML文件的解析 1、KML解析测试 2、KMZ解析测试 四、总结 前言 今天是六.一儿童节,在这里祝各位大朋友…...

k8s自定义资源你会创建吗
创建自定义资源定义 CustomResourceDefinition 当你创建新的 CustomResourceDefinition(CRD)时,Kubernetes API 服务器会为你所 指定的每一个版本生成一个 RESTful 的 资源路径。CRD 可以是名字空间作用域的,也可以是集群作用域的…...

CATIA二次开发VBA入门(4)——进程外开发环境搭建,vb.net在Visual Studio中开发,创建圆柱曲面的宏录制到二次开发案例
目录 引出vb.net和vb6.0 进程外开发环境搭建vb.net开发环境搭建《CATIA二次开发技术基础》模板 添加宏库引用 vs开发环境初步vs中的立即窗口对象浏览器 建立模板案例:创建一堆圆柱曲面第一步:录制宏第二步:代码精简第三步:for循环…...

c++字符串相关接口
c字符串相关接口 1.str2wstr(str转换wstr)2.wstr2str(str转换wstr)3.Utf8ToAsi(Utf8转换ANSI)4.AsiToUtf8(ANSI转换Utf8)5.stringformatA/stringformatW(按照指定的格式格式化字符串)6.GetStringBetween(获取cStart cEnd之间的字符串)7.Char2Int(char转int)8.Str2Bin(字符串转换…...

Maven打包错误:无效的源发行版:17
1. 报错问题 在用maven进行打包时(clean & install),报如下错误: 一开始让我很摸不着头脑,我确定我的pom.xml,还有IDEA中的Project Settings是正确的。 2. 排查 尽管确定,但还是一个个排…...

【环境栏Composer】Composer常见问题(持续更新)
1、执行composer install提示当前目录中没有 composer.lock 文件时 No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information. Composer 在执行 install 命令时会…...

塑造更智慧的AI:策略与路径探索
提升数据质量: 数据清洗:去除数据中的异常值、缺失值、噪声等干扰因素,确保数据的准确性和一致性。数据标注:为数据集提供准确的标签,以便进行有监督学习。标注的质量直接影响模型的性能。数据增强:通过图像…...

软设之快速排序
快速排序是冒泡排序的改进算法 它采用的是分治法,基本思想是把原问题分解为若干规模更小但结构与原问题相似的子问题,通过递归解决这些子问题,然后将这些子问题的解组合成原问题的解。 它的步骤是 1.在待排序的n个记录中任取一个记录&…...

从零学算法2965
2965. 找出缺失和重复的数字 给你一个下标从 0 开始的二维整数矩阵 grid,大小为 n * n ,其中的值在 [1, n2] 范围内。除了 a 出现 两次,b 缺失 之外,每个整数都 恰好出现一次 。 任务是找出重复的数字a 和缺失的数字 b 。 返回一个…...

【Mac版】Java生成二维码
软件版本 IntelliJ IDEA:2023.2 JDK:17 Tomcat:10.1.11 Maven:3.9.3 技术栈 servlet谷歌的:zxing 生成普通的黑白二维码在二维码中间添加一个小图标 github开源项目:qrcode qrcode开源项目的内部是基于z…...

ROS2自定义服务接口
ROS2自定义服务接口 在src/village_interface 下构建srv文件夹 src/village_interface/srv 下新建一个BorrowMoney.srv 遵循大小写编程规范 # 客户端请求 string name uint32 money # 中间这三个横杠很重要 不能删掉 --- # 服务端响应 bool success uint32 money接口编译 修改…...

linux /www/server/cron内log文件占用空间过大,/www/server/cron是什么内容,/www/server/cron是否可以删除
linux服务器长期使用宝塔自带计划任务,计划任务执行记录占用服务器空间过大,导致服务器根目录爆满,需要长期排查并删除 /www/server/cron 占用空间过大问题处理 /www/server/cron是什么内容?/www/server/cron是否可以删除…...

C++青少年简明教程:break语句、continue语句
C青少年简明教程:break语句、continue语句 break语句 只能用在switch语句和循环语句(for循环、while循环和do-while循环)中。作用:跳出switch语句或提前终止循环。 break语句的基本语法如下: break; break语句的示例…...

MySQL实战行转列(或称为PIVOT)实战sales的表记录了不同产品在不同月份的销售情况,进行输出
有一个sales的表,它记录了不同产品在不同月份的销售情况: productJanuaryFebruaryMarchProduct AJanuary10Product AFebruary20Product BJanuary5Product BFebruary15Product CJanuary8Product CFebruary12 客户需求展示为如下的样子: pro…...

牛客NC164 最长上升子序列(二)【困难 贪心+二分 Java/Go/PHP/C++】
题目 题目链接: https://www.nowcoder.com/practice/4af96fa010c44638a7e112abf65f7237 思路 贪心二分 所谓贪心,就是往死里贪,所以对于最大上升子序列,结尾元素越小,越有利于后面接上其他的数,也就可能变…...

电子烟开发【恒压、恒有效算法】
恒压算法 pwm是通过软件模拟的 pwm满值运行是250全占空比 #define D_TARGET_AVERAGE_VOLTAGE 3500 //R_ADC1_Vout :发热丝两端AD值 //R_ADC_FVR :电池电压AD值 //FVR_VOLTAGE :电池AD参考电压 满电值AD //R_Smk1Duty :最后…...

基于Open3D的点云处理22-非阻塞可视化/动态可视化
官网测试用例:examples/python/visualization/non_blocking_visualization.py 非阻塞可视化,即实时更新点云数据; 如下,动态可视化ICP的匹配过程: import open3d as o3d import numpy as npif __name__ == "__main__":o3d.utility.set_verbosity_level(o3d.ut…...

C++面试题其一
C和C的区别 C和C都是广泛使用的编程语言,但它们有显著的区别: 语言范式: C:是一种过程化编程语言,强调过程和函数的使用。C:是一种多范式编程语言,支持面向对象编程、泛型编程和过程化编程。 …...

CentOS7某天的samba服务搭建操作记录(还没成功)
#CentOS7 yum软件仓库阿里云 samba服务器配置失败 sensors成功了 (花了200元组装H61测试机,75元的主板只有一块能用,垃圾板但又不完全能用) 2024.5月的某天记录如下: https://blog.csdn.net/dszgf5717/article/details/53732182 …...

Qt Demo:基于TCP协议的视频传输Demo
目录 1.设计思路 2.Pro文件配置 3.头文件引入 4.界面设计 5.初始化设备函数 6.发起视频链接函数 7.初始化定时器模块函数 8.TCP链接模块函数 9.处理接收的数据线程函数 10.实现功能展示 设计思路 基于TCP协议的视频传输Demo,设计要实现的功能主要是TCP传输还有视频&…...

内存管理【C++】
内存分布 C中的内存区域主要有以下5种 栈(堆栈):存放非静态局部变量/函数参数/函数返回值等等,栈是向下增长的【地址越高越先被使用】。栈区内存的开辟和销毁由系统自动执行 堆:用于程序运行时动态内存分配ÿ…...

D3D 顶点格式学习
之前D3D画三角形的代码中有这一句, device.VertexFormat CustomVertex.TransformedColored.Format; 这是设置顶点格式; 画出的三角形如下, 顶点格式是描述一个三维模型的顶点信息的格式;可以包含以下内容, 位置…...

gmssl vs2010编译
1、虚拟机win10 x64,离线安装vs2010和2010sp1补丁; 2、安装ActivePerl_v5.28.1.0000和nasm-2.16.03-installer-x64均是默认完整安装; nasm官网下载: Index of /pub/nasm/releasebuilds/2.16.03/win64https://www.nasm.us/pub/nas…...

容器化部署gitlab、jenkins,jenkins应用示例
一、容器化部署docker和docker conpose安装 Docker&Docker-compose的安装及部署_docker 20 使用什么版本docker-compose-CSDN博客 1.docker 安装脚本 cat >01_docker.sh<<EOF #!/bin/bash yum remove docker \docker-client \docker-client-latest \docker-co…...

基于STM32的轻量级Web服务器设计
文章目录 一、前言1.1 开发背景1.2 实现的功能1.3 硬件模块组成1.4 ENC28J60网卡介绍1.5 UIP协议栈【1】目标与特点【2】核心组件【3】应用与优势 1.6 添加UIP协议栈实现创建WEB服务器步骤1.7 ENC28J60添加UIP协议栈实现创建WEB客户端1.8 ENC28J60移植UIP协议并编写服务器测试示…...

用r语言处理 Excel数据当中的缺失值方法
以下是使用 R 编程语言处理 Excel 缺失数据的一些常见方法示例代码:(无需循环) 读取包含缺失数据的 Excel 文件 data <- read.csv(“your_file.csv”) 查看数据中是否有缺失值 sum(is.na(data)) 用平均值填充缺失值 data c o l u m …...

AWS 高防和阿里云高防深度对比
随着网络攻击的不断增加,企业对于网络安全的需求也越来越高。在这种情况下,高防护服务成为了企业网络安全的重要组成部分。AWS和阿里云作为全球领先的云计算服务提供商,都提供了高防护服务,但它们之间存在着一些差异。我们九河云一…...

ctfshow web 月饼杯II
web签到 <?php //Author:H3h3QAQ include "flag.php"; highlight_file(__FILE__); error_reporting(0); if (isset($_GET["YBB"])) {if (hash("md5", $_GET["YBB"]) $_GET["YBB"]) {echo "小伙子不错嘛ÿ…...

「前端+鸿蒙」核心技术HTML5+CSS3(二)
1、开发者文档 开发者文档通常由浏览器厂商或技术社区提供,包含有关Web技术(如HTML、CSS、JavaScript)的详细信息,API文档,以及最佳实践。例如,MDN Web Docs是一个广泛认可的开发者资源。 2、块级元素与行列元素 块级元素:在页面上占据整行的元素,如<div>、<…...

unity接入live2d
在bilibili上找到一个教程,首先注意一点,你直接导入那个sdk,并且打开示例,显示的模型是有问题的,你需要调整模型上脚本的一个枚举值,调整它的渲染顺序是front z to我看教程时候,很多老师都没有提…...