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

引入依赖

		<!--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);//设置WriterString[] 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.hqwc.cn/news/227696.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言进阶指南(12)(数组指针与二维数组)

欢迎来到博主的专栏——C语言进阶指南 博主的id&#xff1a;reverie_ly 数组指针 数组指针的标准声明如下 type &#xff08;*parr&#xff09;[num] type是指针指向的数组的类型&#xff0c;[num]是指针指向的数组的元素大小。 顾名思义&#xff0c;数组指针就是用来指向数组…

Python的换行和转义:深入理解代码排版与字符串处理

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是涛哥&#xff0c;今天为大家分享 Python的换行和转义&#xff1a;深入理解代码排版与字符串处理&#xff0c;全文2700字&#xff0c;阅读大约8分钟。 在Python编程中&#xff0c;正确使用换行和转义字符是保…

MySQL- CRUD

一、INSERT 添加 公式 INSERT INTO table_name [(column [, column...])] VALUES (value [, value...]); 示例&#xff1a; CREATE TABLE goods (id INT ,good_name VARCHAR(10),price DOUBLE ); #添加数据 INSERT INTO goods (id,good_name,price ) VALUES (20,华为手机,…

【带头学C++】----- 八、C++面向对象编程 ---- 8.5 struct结构体类型增强使用说明

目录 8.5 struct结构体类型增强使用说明 8.5.1 C结构体可以定义成员函数 8.5.2 c中定义结构体变量可以不加struct关键字 8.6 bool布尔类型关键字 8.5 struct结构体类型增强使用说明 第六章对结构体的使用、内存对齐以及数组、深拷贝和浅拷贝进行了一个详细的说明&#xff0c…

Redis队列stream,Redis多线程详解

Redis 目前最新版本为 Redis-6.2.6 &#xff0c;会以 CentOS7 下 Redis-6.2.4 版本进行讲解。 下载地址&#xff1a; https://redis.io/download 安装运行 Redis 很简单&#xff0c;在 Linux 下执行上面的 4 条命令即可 &#xff0c;同时前面的 课程已经有完整的视…

方差分析汇总

一文整理了方差分析的全部内容&#xff0c;包括方差分析的定义&#xff08;基本思想、检验统计量的计算、前提条件&#xff09;、方差分析分类&#xff08;单因素、双因素、多因素、事后多重比较、协方差分析、重复测量方差分析&#xff09;、方差分析流程&#xff08;数据格式…

HTTP/3 为什么正迅速崛起

超文本传输协议&#xff08;HTTP&#xff09;作为互联网的基石&#xff0c;一直在网页加载、视频流传输、应用获取数据等方方面面发挥重要作用。 去年&#xff0c;负责定义互联网技术的互联网工程任务组&#xff08;IETF&#xff09;将该协议的最新版本 HTTP/3 定为标准。在此…

大模型训练为什么用A100不用4090

这是一个好问题。先说结论&#xff0c;大模型的训练用 4090 是不行的&#xff0c;但推理&#xff08;inference/serving&#xff09;用 4090 不仅可行&#xff0c;在性价比上还能比 H100 稍高。4090 如果极致优化&#xff0c;性价比甚至可以达到 H100 的 2 倍。 事实上&#x…

如何控制Spring工厂创建对象的次数?详解Spring对象的声明周期!

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

SPSS生存分析:寿命表分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

15.spring源码解析-invokeBeanFactoryPostProcessors

BeanFactoryPostProcessor接口允许我们在bean正是初始化之前改变其值。此接口只有一个方法: void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory);有两种方式可以向Spring添加此对象: 通过代码的方式: context.addBeanFactoryPostProcessor 通过xml…

天鹅湖国家旅游度假区 | 展柜OLED透明屏:创新展示提升互动体验

天鹅湖国家旅游度假区 | 展柜OLED透明屏 产品&#xff1a;一块55寸OLED透明屏嵌入玻璃安装 应用场景&#xff1a;用在天鹅湖国家旅游度假区——三门峡城市文化客厅展馆中的一个透明展示柜&#xff0c;用一块55寸OLED透明屏嵌入展示柜的玻璃&#xff0c;让观众即可以看到展柜里…