小功能实现(十九)生成shp文件

news2024/11/18 7:43:58

引入依赖

		<!--shp文件相关工具-->
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-shapefile</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-swing</artifactId>
            <version>${geotools.version}</version>
        </dependency>

使用方法

工具类

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.geotools.data.FeatureWriter;
import org.geotools.data.Transaction;
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.shapefile.ShapefileDataStoreFactory;
import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * com.moxi.mogublog.utils
 *
 * @author yanao
 * @description shape工具类
 * @date 2023-10-24 09:41
 **/

public class ShapeUtil {

    public static final String DEF_GEOM_KEY = "the_geom";

    public static final String DEF_ENCODE = "uft-8";

    /**
     * 图形信息写入shp文件。shape文件中的geometry附带属性类型仅支持String(最大255)、Integer、Double、Boolean、Date(只包含日期,不包含时间);
     * 附带属性的name仅支持15字符,多余的自动截取。
     * @param shpPath shape文件路径,包括shp文件名称 如:D:\data\tmp\test.shp
     * @param geomType 图形信息类型 Geometry类型,如Point.class、Polygon.class等
     * @param data 图形信息集合
     */
    public static void createShp(String shpPath, Class<?> geomType, List<Map<String, ?>> data) {
        try {
            createShp(shpPath, DEF_ENCODE, geomType, data);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 图形信息写入shp文件。shape文件中的geometry附带属性类型仅支持String(最大255)、Integer、Double、Boolean、Date(只包含日期,不包含时间);
     * 附带属性的name仅支持15字符,多余的自动截取。
     * @param shpPath shape文件路径,包括shp文件名称 如:D:\data\tmp\test.shp
     * @param encode shp文件编码
     * @param geomType 图形信息类型 Geometry类型,如Point.class、Polygon.class等
     * @param data 图形信息集合
     */
    public static void createShp(String shpPath, String encode, Class<?> geomType, List<Map<String, ?>> data) {

        try {
            if (StringUtils.isEmpty(shpPath)) {
                throw new Exception("shp文件的路径不能为空,shpPath: " + shpPath);
            }

            if (StringUtils.isEmpty(encode)) {
                throw new Exception("shp文件的编码不能为空,encode: " + encode);
            }

            if (Objects.isNull(geomType)) {
                throw new Exception("shp文件的图形类型不能为空,geomType: " + geomType);
            }

            if (CollectionUtils.isEmpty(data)) {
                throw new Exception("shp文件的图形数据不能为空,data: " + data);
            }

            if (!data.get(0).containsKey(DEF_GEOM_KEY)) {
                throw new Exception("shp文件的图形数据中必须包含the_geom的属性,data: " + data);
            }

            //创建shape文件对象+
            File file = new File(shpPath);
            if (!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
            Map<String, Serializable> params = new HashMap<>();
            params.put(ShapefileDataStoreFactory.URLP.key, file.toURI().toURL());
            ShapefileDataStore ds = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params);

            //定义图形信息和属性信息
            ds.createSchema(builderFeatureType(geomType, CollectionUtils.isEmpty(data) ? null : data.get(0)));

            //设置编码
            Charset charset = Charset.forName(encode);
            ds.setCharset(charset);

            //设置Writer
            String[] typeName=ds.getTypeNames();
            FeatureWriter<SimpleFeatureType, SimpleFeature> writer = ds.getFeatureWriter(ds.getTypeNames()[0], Transaction.AUTO_COMMIT);

            for (Map<String, ?> map : data) {
                //写下一条
                SimpleFeature feature = writer.next();

                for (String key : map.keySet()) {
                    if (DEF_GEOM_KEY.equals(key)) {
                        feature.setAttribute(key, map.get(key));
                    } else {
                        feature.setAttribute(key.toUpperCase(), map.get(key));
                    }
                }
            }

            writer.write();
            writer.close();
            ds.dispose();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 构建Feature模板
     * @param geomType 图形信息类型 Geometry类型,如Point.class、Polygon.class等
     * @param data 图形信息具体的属性
     * @return featureType
     */
    public static SimpleFeatureType builderFeatureType(Class<?> geomType, Map<String, ?> data) {
        //定义图形信息和属性信息
        SimpleFeatureTypeBuilder ftb = new SimpleFeatureTypeBuilder();
        ftb.setCRS(DefaultGeographicCRS.WGS84);
        ftb.setName("shapefile");

        ftb.add(DEF_GEOM_KEY, geomType);

        if (MapUtils.isNotEmpty(data)) {
            for (String key : data.keySet()) {
                if (Objects.nonNull(data.get(key))) {
                    ftb.add(key.toUpperCase(), data.get(key).getClass());
                }
            }
        }

        return ftb.buildFeatureType();
    }

    /**
     * 压缩shape文件
     *
     * @param shpPath shape文件路径(包含shape文件名称)
     */
    public static void zipShapeFile(String shpPath) {
        try {
            File shpFile = new File(shpPath);
            String shpRoot = shpFile.getParentFile().getPath();
            String shpName = shpFile.getName().substring(0, shpFile.getName().lastIndexOf("."));

            String zipPath = shpRoot + File.separator + shpName + ".zip";
            File zipFile = new File(zipPath);
            InputStream input = null;
            ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile));
            // zip的名称为
            zipOut.setComment(shpName);
            //自行调节需要的相关文件
            String[] shpFiles = new String[]{
                    shpRoot + File.separator + shpName + ".dbf",
                    shpRoot + File.separator + shpName + ".prj",
                    shpRoot + File.separator + shpName + ".shp",
                    shpRoot + File.separator + shpName + ".shx",
                    shpRoot + File.separator + shpName + ".fix"
            };

            for (int i = 0; i < shpFiles.length; i++) {
                File file = new File(shpFiles[i]);
                input = new FileInputStream(file);
                zipOut.putNextEntry(new ZipEntry(file.getName()));
                int temp = 0;
                while ((temp = input.read()) != -1) {
                    zipOut.write(temp);
                }
                input.close();
            }
            zipOut.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

具体使用

	//返回文件流
    public void exportCornerShp(String evid,List<Map<String,String>> cornerDatas, HttpServletResponse httpServletResponse) throws Exception{
        EvGimcheckTask evGimcheckTask=evGimcheckTaskMapper.selectById(evid);
        String projectCode=evGimcheckTask.getSubProjectCode();
        String designCode=evGimcheckTask.getDesignStageCode();

        String url = "C:\\Users\\admin\\Desktop\\test\\ceshi2222.shp";
        //设置wkt文本
		String str = "LINESTRING (116.21278950384274 39.90557982319698, 116.21177234433465 39.90610963061354, 116.21106912279264 39.90264172209895, 116.21399502548638 39.902612822554126, 116.21629305278306 39.905011479365406, 116.21278950384274 39.90557982319698)";
        org.locationtech.jts.geom.Geometry geom = WKTUtil.wktToGeom(str);
        //添加参数
        Map<String, Object> m = new HashMap<>();
        m.put(ShapeUtil.DEF_GEOM_KEY, geom);
        m.put("name", evGimcheckTask.getGimName());

        List<Map<String, ?>> data = new ArrayList<>();
        data.add(m);

        //将geometry写入shape文件
        ShapeUtil.createShp(url, "utf-8", org.locationtech.jts.geom.LineString.class, data);
        //压缩shape文件
        ShapeUtil.zipShapeFile(url);
        //下载shape压缩包
        try {
            String downFile = url.replace(".shp",".zip");
            java.io.File file = new File(downFile);
            String filename = file.getName();// 获取日志文件名称
            InputStream fis = new BufferedInputStream(new FileInputStream(file));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            httpServletResponse.reset();
            // 先去掉文件名称中的空格,然后转换编码格式为utf-8,保证不出现乱码,这个文件名称用于浏览器的下载框中自动显示的文件名
            httpServletResponse.setContentType("application/x-msdownload");
            httpServletResponse.setCharacterEncoding("utf-8");
            httpServletResponse.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode("ceshi111.zip", "UTF-8"));
            OutputStream os = new BufferedOutputStream(httpServletResponse.getOutputStream());
            os.write(buffer);// 输出文件
            os.flush();
            os.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

生成文件

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1264433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

检验科LIS系统源码,LIS系统,检验数据分析,生成检验报告

检验科LIS系统源码&#xff0c;全套LIS系统商业项目源码 LIS是HIS系统的一个重要的组成部分&#xff0c;其主要功能是将检验的实验仪器传出的检验数据经分析&#xff0c;生成检验报告&#xff0c;通过网络存储在数据库中&#xff0c;这样医生能够方便、及时的看到患者的检验结果…

6、信息收集(1)

文章目录 一、DNS信息查询1、利用dig工具查询各类DNS的解析。2、使用DNS子域名爆破工具&#xff0c;针对子域名进行爆破&#xff0c;同时解析出对应的IP地址。3、利用多地Ping工具&#xff0c;查看域名真实IP。4、针对部分IP进行信息收集 二、DNS域传输实验原理方法一方法二 三…

出纳常用的月报表,熬夜做了这8份直接用!

做出纳&#xff0c;公司财务的日报表是必不可少的&#xff0c;收支了多少&#xff0c;支出了多少&#xff0c;这些都是要记录下来的&#xff01; 一份出纳日报表通常包含以下内容&#xff1a; 1. 日期&#xff1a;报告涵盖的具体日期&#xff0c;标明是哪一天的财务数据。 2. 收…

只会在终端使用Python运行代码?这些高级用法了解了解

大部分同学在终端使用Python可能只是简单的执行代码&#xff0c;但其实结合一些Python内置模块或第三方库可以实现更高级且便捷的用法&#xff0c;一起看看吧 插播&#xff0c;更多文字总结指南实用工具科技前沿动态第一时间更新在公粽号【啥都会一点的研究生】 代码Benchmar…

智能优化算法应用:基于阴阳对算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于阴阳对算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于阴阳对算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.阴阳对算法4.实验参数设定5.算法结果6.参考文献7.…

Ubuntu 环境安装 Kafka、配置运行测试 Kafka 流程笔记

Kafka 介绍 Kafka 是一个由 Apache 软件基金会开发的开源流式处理平台。它被设计用于处理大规模数据流&#xff0c;提供高可靠性、高吞吐量和低延迟的消息传递系统。Kafka 可以用于构建实时数据管道和流式应用程序&#xff0c;让不同应用、系统或者数据源之间能够高效地进行数…

CentOS 7 部署 MariaDB 的 2 种方法

有两种安装 MariaDB 服务器的方法。您可以安装 CentOS 7 存储库中可用的默认版本&#xff0c;也可以通过手动添加 MariaDB 存储库来安装最新版本。 如果安装过MariaDB或MySQL&#xff0c;使用以下命令彻底删除它们: yum remove mariadb* yum remove mysql* 方法一: 使用 Yum…

从PDF和图像中提取文本,以供大型语言模型使用

想法 大型语言模型已经席卷了互联网&#xff0c;导致更多的人没有认真关注使用这些模型最重要的部分&#xff1a;高质量的数据&#xff01;本文旨在提供一些有效从任何类型文档中提取文本的技术。 Python库 本文专注于Pytesseract、easyOCR、PyPDF2和LangChain库。实验数据是一…

如何使用企业微信 WorkTool API 开源框架快速开发企微聊天机器人(详细教程)

WorkTool 基本框架概述 WorkTool 是一个依附于企业微信来运行的无人值守群管理机器人程序&#xff0c;WorkTool 开源&#xff0c;并且永久免费。您可以使用本应用程序来自动执行一个自己企业微信里的账号&#xff08;当做机器人账号&#xff09;可通过后台调用对应的 API 来驱…

c语言-希尔排序

目录 一、插入排序 1、插入排序的概念 2、插入排序的逻辑实现 3、插入排序的实现 二、希尔排序 1、希尔排序概念 2、希尔排序逻辑实现 3、间隔值&#xff08;gap&#xff09;对排序的影响 4、希尔排序的实现 三、插入排序与希尔排序性能对比测试 结语&#xff1a; 前言…

官宣的2023年汉字小达人市级比赛的安排和重点解读

昨天&#xff0c;汉字小达人在官微发布了关于2023年汉字小达人市级比赛的安排&#xff0c;基本上把大家都关心的事项都说了。 但是有一个很关键的点&#xff0c;今年的提法和往年不一样&#xff0c;多了一句话&#xff1a;2023年《中文自修•聪明小豆丁》七八月合刊上的模拟题仅…

数据结构 / day06 作业

1.下面的代码打印在屏幕上的值是多少? /下面的代码打印在屏幕上的值是多少?#include "stdio.h"int compute_data(int arr[], unsigned int len) {long long int result 0;if(result len)return arr[0];resultcompute_data(arr,--len);printf("len%d, res…

AB|如何正确从罗克韦尔官网下载资料?

哈喽呀&#xff0c;大家好&#xff0c;我是雷工&#xff01; 作为工控行业的从业者&#xff0c;可能要和各个厂家的中控系统、PLC、触摸屏、变频器、等软硬件产品打交道。 虽然从业十余年&#xff0c;但也不可能接触使用过所有的工控产品。还有海量的产品是没有接触过的。 但很…

IntelliJ IDEA 中有什么让你相见恨晚的技巧

一、条件断点 循环中经常用到这个技巧&#xff0c;比如&#xff1a;遍历1个大List的过程中&#xff0c;想让断点停在某个特定值。 参考上图&#xff0c;在断点的位置&#xff0c;右击断点旁边的小红点&#xff0c;会出来一个界面&#xff0c;在Condition这里填入断点条件即可&…

【并发编程】ConcurrentHashMap底层结构和原理

&#x1f4eb;作者简介&#xff1a;小明Java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

Elasticsearch底层原理分析——新建、索引文档

es版本 8.1.0 重要概念回顾 Elasticsearch Node的角色 与下文流程相关的角色介绍&#xff1a; Node Roles配置主要功能说明masternode.roles: [ master ]有资格参与选举成为master节点&#xff0c;从而进行集群范围的管理工作&#xff0c;如创建或删除索引、跟踪哪些节点是…

Nacos2.x配置中心源码分析

概述 源码注释参考 git 仓库&#xff0c;对应流程图后续补充&#xff1b; 启动 nacos nacos 启动类&#xff1a; // com.alibaba.nacos.NacosSpringBootApplication(scanBasePackages "com.alibaba.nacos") ServletComponentScan EnableScheduling public class…

Django < 2.0.8 在 CommonMiddleware 中打开重定向的可能性 (CVE-2018-14574)

漏洞描述 如果django.middleware.common.CommonMiddleware和APPEND_SLASH设置都已启用&#xff0c;并且项目的 URL 模式接受任何以斜杠结尾的路径&#xff0c;则对该网站的恶意制作的 URL 的请求可能会导致重定向到另一个网站&#xff0c;从而启用网络钓鱼和其他攻击。 漏洞环…

带着GPT-4V(ision)上路,自动驾驶新探索

On the Road with GPT-4V(ision): Early Explorations of Visual-Language Model on Autonomous Driving GitHub | https://github.com/PJLab-ADG/GPT4V-AD-Exploration arXiv | https://arxiv.org/abs/2311.05332 自动驾驶技术的追求取决于对感知、决策和控制系统的复杂集成。…

第八节HarmonyOS @Component自定义组件的生命周期

在开始之前&#xff0c;我们先明确自定义组件和页面的关系&#xff1a; 1、自定义组件&#xff1a;Component装饰的UI单元&#xff0c;可以组合多个系统组件实现UI的复用。 2、页面&#xff1a;即应用的UI页面。可以由一个或者多个自定义组件组成&#xff0c;Entry装饰的自定…