1、maven依赖安装包
<!-- https://mvnrepository.com/artifact/uk.m0nom/javaapiforkml -->
<dependency>
<groupId>uk.m0nom</groupId>
<artifactId>javaapiforkml</artifactId>
<version>3.0.8</version>
</dependency>
备注这个项目在gitshub上不维护了,可以自己下载源码进行二次修改 在github搜索javaapiforkml即可
2、编写kmlUtl 生成kml和kmz
kmz是多个kml的集合 ,类似压缩包具体可自行百度
package com.cshf.gis.util;
import com.cshf.calculate.util.GeoTools;
import com.cshf.core.enums.ShapeTypeEnum;
import com.cshf.gis.dto.KmlPointDTO;
import de.micromata.opengis.kml.v_2_2_0.*;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Marshaller;
import lombok.SneakyThrows;
import org.glassfish.jaxb.runtime.marshaller.NamespacePrefixMapper;
import org.locationtech.jts.geom.Coordinate;
import java.io.*;
import java.util.Objects;
public class KmlUtil {
public static Kml animatedKml(KmlPointDTO kmlPointDTO) throws JAXBException {
Kml kml = new Kml();
Document document = kml.createAndSetDocument().withName(kmlPointDTO.getName());
Coordinate[] list =
kmlPointDTO.getList();
LineString lineString = document.createAndAddPlacemark()
.createAndSetLineString();
String type = kmlPointDTO.getType();
switch (Objects.requireNonNull(ShapeTypeEnum.find(type))){
case CIRCLE -> {
Coordinate coordinate = kmlPointDTO.getList()[0];
org.locationtech.jts.geom.Polygon circle
= GeoTools.createCircle(coordinate,coordinate.z, kmlPointDTO.getRadius());
for (Coordinate circleCoordinate : circle.getCoordinates()) {
if(kmlPointDTO.getFlagHeight()){
lineString.addToCoordinates(circleCoordinate.x, circleCoordinate.y,circleCoordinate.z);
}else{
lineString.addToCoordinates(circleCoordinate.x, circleCoordinate.y);
}
}
}
case LINE -> {
for (Coordinate coordinate : list) {
if(kmlPointDTO.getFlagHeight()){
lineString.addToCoordinates(coordinate.getX(),
coordinate.getY(),coordinate.getZ());
}else{
lineString.addToCoordinates(coordinate.getX(),coordinate.getY());
}
}
}
case RECTANGLE, POLYGON ->{
LinearRing andSetLinearRing = document.createAndAddPlacemark()
.createAndSetLinearRing();
for (Coordinate coordinate : list) {
if(kmlPointDTO.getFlagHeight()){
andSetLinearRing.addToCoordinates(coordinate.getX(),
coordinate.getY(),
coordinate.getZ());
}else{
andSetLinearRing.addToCoordinates(coordinate.getX(),
coordinate.getY());
}
}
}
}
return kml;
}
@SneakyThrows
public static void main(String[] args) {
KmlPointDTO kmlPointDTO = new KmlPointDTO();
// Coordinate[] coordinates = {
// new Coordinate(113.568363,22.394479,100),
// new Coordinate(113.563494,22.411957,100),
// new Coordinate(113.592099,22.406827,100)
// };
// List<Coordinate> list = Arrays.asList(coordinates);
// kmlPointDTO.setList(list);
// kmlPointDTO.setType(ShapeTypeEnum.LINE.getCode());
// kmlPointDTO.setName("Advanced Example");
// animatedUpdateExample(kmlPointDTO);
//
Coordinate[] coordinates = {
new Coordinate(113.570015,22.409087,500),
// new Coordinate(113.579666,22.385609,500),
// new Coordinate(113.564624,22.384131,500),
// new Coordinate(113.560973,22.407,500)
};
// List<Coordinate> list = Arrays.asList(coordinates);
kmlPointDTO.setList(coordinates);
kmlPointDTO.setType(ShapeTypeEnum.CIRCLE.getCode());
kmlPointDTO.setRadius(200.0);
kmlPointDTO.setFlagHeight(true);
kmlPointDTO.setName("Advanced Example");
Kml document = animatedKml(kmlPointDTO);
Marshaller marshaller = JAXBContext.newInstance(Kml.class).createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty("org.glassfish.jaxb.namespacePrefixMapper", new NamespacePrefixMapper()
{
@Override
public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix)
{
return namespaceUri.matches("http://www.w3.org/\\d{4}/Atom") ? "atom"
: (namespaceUri.matches("urn:oasis:names:tc:ciq:xsdschema:xAL:.*?") ? "xal"
: (namespaceUri.matches("http://www.google.com/kml/ext/.*?") ? "gx"
: (namespaceUri.matches("http://www.opengis.net/kml/.*?") ? ""
: (null)))
);
}
});
// marshaller.marshal(kml, file);
// marshaller.marshal(kml, System.out);
marshaller.marshal(document, System.out);
marshaller.marshal(document, new File("advancedexampl1.kml"));
// marshaller.marshal();
// animatedUpdateExample();
}
public static void download(Kml document, String fileName,HttpServletResponse response) throws Exception {
response.setHeader("Content-Disposition", "attachment;fileName=" + java.net.URLEncoder.encode(fileName, "utf-8"));
response.setContentType("multipart/form-data");
response.setCharacterEncoding("utf-8");
Marshaller marshaller = JAXBContext.newInstance(Kml.class).createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty("org.glassfish.jaxb.namespacePrefixMapper", new NamespacePrefixMapper()
{
@Override
public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix)
{
return namespaceUri.matches("http://www.w3.org/\\d{4}/Atom") ? "atom"
: (namespaceUri.matches("urn:oasis:names:tc:ciq:xsdschema:xAL:.*?") ? "xal"
: (namespaceUri.matches("http://www.google.com/kml/ext/.*?") ? "gx"
: (namespaceUri.matches("http://www.opengis.net/kml/.*?") ? ""
: (null)))
);
}
});
// marshaller.marshal(kml, file);
// marshaller.marshal(kml, System.out);
marshaller.marshal(document, System.out);
marshaller.marshal(document,response.getOutputStream());
// marshaller.marshal(document, new File("advancedexampl1.kml"));
// try (
//
// InputStream inputStream = new FileInputStream(file);
// OutputStream os = response.getOutputStream()) {
// byte[] b = new byte[2048];
// int length;
// while ((length = inputStream.read(b)) > 0) {
// os.write(b, 0, length);
// }
// } finally {
if (delete) {
//递归删除文件或目录
// delete(filePath);
}
// }
}
}
备注需要依赖 java的Geotools依赖如下:
<dependencies>
<dependency>
<groupId>com.cshf</groupId>
<artifactId>airspace-core</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-main</artifactId>
<version>32-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-api</artifactId>
<version>32-SNAPSHOT</version>
</dependency>
<dependency>
<!-- shapefile组件 -->
<groupId>org.geotools</groupId>
<artifactId>gt-shapefile</artifactId>
<version>32-SNAPSHOT</version>
</dependency>
<dependency>
<!-- geojson组件 -->
<groupId>org.geotools</groupId>
<artifactId>gt-geojson</artifactId>
<version>32-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>32-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-metadata</artifactId>
<version>32-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.geotools.xsd</groupId>
<artifactId>gt-xsd-kml</artifactId>
<version>14.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.geotools/gt-data -->
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-data</artifactId>
<version>20.0</version>
</dependency>
<dependency>
<groupId>org.geotools.xsd</groupId>
<artifactId>gt-xsd-core</artifactId>
<version>14.0</version>
</dependency>
<dependency>
<groupId>com.vividsolutions</groupId>
<artifactId>jts</artifactId>
<version>1.13</version>
</dependency>
<dependency>
<groupId>org.gavaghan</groupId>
<artifactId>geodesy</artifactId>
<version>1.1.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-math3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-math3</artifactId>
<version>3.6.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.geotools/gt-opengis -->
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-opengis</artifactId>
<version>20.0</version>
</dependency>
<dependency>
<groupId>com.vividsolutions</groupId>
<artifactId>jts</artifactId>
<version>1.13</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>osgeo</id>
<name>OSGeo Release Repository</name>
<url>https://repo.osgeo.org/repository/release/</url>
<snapshots><enabled>false</enabled></snapshots>
<releases><enabled>true</enabled></releases>
</repository>
<repository>
<id>osgeo-snapshot</id>
<name>OSGeo Snapshot Repository</name>
<url>https://repo.osgeo.org/repository/snapshot/</url>
<snapshots><enabled>true</enabled></snapshots>
<releases><enabled>false</enabled></releases>
</repository>
</repositories>