小功能实现(十九)生成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);

            //设置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();
        }
    }

生成文件

在这里插入图片描述

在这里插入图片描述

### 回答1: 将SHP文件转换成CAD格式,可采取以下几种方法。 一种方法是使用GIS软件进行转换。首先需要打开一个GIS软件,如ArcGIS、QGIS等,导入SHP文件。然后选择CAD格式作为输出格式,点击转换按钮即可完成转换。这种方法相对简单,适用于不熟悉编程的用户。 另一种方法是使用Python脚本进行转换。使用Python编写脚本,导入相关的库,如geopandas、pyautocad等。通过读取SHP文件并将其转换为CAD支持的数据格式,然后调用AutoCAD的API将数据写入CAD文件中。这种方法灵活性较高,可以实现自定义的转换需求。 此外,还可以使用一些在线转换工具。在互联网上有一些免费的在线SHP转CAD转换工具,用户只需要上传SHP文件并选择输出格式,即可在线将SHP文件转换成CAD格式。这种方法简便易行,适合临时使用。 无论使用哪种方法,转换过程中需注意坐标系的转换,是否需要进行属性字段的转换等问题,以确保转换结果的准确性和完整性。 ### 回答2: Shp文件是一种地理信息系统(GIS)常用的矢量数据格式,而CAD则是一种用于设计和绘图的计算机辅助设计软件。将Shp文件转换成CAD格式可以使地理空间数据更加方便地在CAD软件中进行编辑和操作。下面是关于Shp文件转换成CAD的一些步骤和方法。 第一种方法是使用专门的转换软件。市面上有很多可以将Shp文件转换成CAD格式的软件,比如AutoCAD、ArcGIS、Global Mapper等。用户可以选择其中一种软件,根据其操作手册和教程来进行转换。通常的步骤是打开转换软件,导入Shp文件,选择输出为CAD格式,设置相应的转换参数,最后导出CAD文件。 第二种方法是使用在线转换工具。有一些在线平台可以免费实现Shp文件转换成CAD格式,如MyGeodata Converter、FME Online等。用户只需要在网页上上传Shp文件,选择CAD格式作为输出,然后点击转换按钮即可。这种方式不需要安装软件,操作简单方便,适合一次性的小规模转换需求。 无论是使用专门的转换软件还是在线转换工具,都需要注意以下几点。首先,根据具体需求选择转换后的CAD格式,如DWG、DXF等。其次,设置转换参数,如坐标系、单位、图层等。最后,进行文件导出,并在CAD软件中进行验证和调整。 总之,将Shp文件转换成CAD格式是地理空间数据处理中常见且必要的步骤。用户可以根据自己的需求选择适合的转换方法,实现文件格式的转换和数据的灵活应用。 ### 回答3: 将SHP文件转换成CAD是将矢量数据转换成CAD格式的过程。SHP文件是地理信息系统中常用的矢量数据文件格式,而CAD是计算机辅助设计软件中常用的文件格式。 要将SHP文件转换成CAD,可以使用各种GIS软件或专门的转换工具。下面是一个基本的转换过程: 1. 打开SHP文件:使用GIS软件,打开包含SHP文件的项目。 2. 导出文件:在GIS软件中,选择导出选项,并选择CAD格式作为目标文件格式。可以选择DXF或DWG等常见的CAD格式。 3. 设置导出选项:在导出选项中,可以设置导出的图层、属性、投影等信息。根据需要,可以选择性地导出SHP文件的一部分,或者保留所有图层和属性信息。 4. 进行转换:确认导出选项后,开始进行转换。转换过程可能需要一定时间,具体时间取决于SHP文件的大小和复杂性。 5. 保存CAD文件:转换完成后,将生成的CAD文件保存到指定的位置。 值得注意的是,SHP文件和CAD文件在数据模型和数据结构上有所不同。在转换过程中可能会出现一些数据损失或转换错误的情况。因此,在进行转换之前,最好先备份原始SHP文件,并进行转换结果的验证和比对,以确保数据的准确性和完整性。 此外,有些GIS软件还提供了CAD到SHP文件的反向转换功能,可以将CAD文件转换成SHP文件,从而实现SHP和CAD文件之间的互相转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值