java代码生成kml和kmz说明(解决生成有kml:问题)

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>
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stayhungerstayflush

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值