专栏首页GIS讲堂shape文件的生成与打包下载

shape文件的生成与打包下载

概述

本文讲述如何结合Geotools实现后端shp文件的生成与打包下载。

实现效果

实现

  1. shp文件生成 如何生成shp文件在前面的相关博文里面已经做过说明,本文不再赘述。
  2. shp文件打包 对与一个shp文件来说,下面四个文件是必须的:.dbf、.prj、.shp、.shx,其中: 1)*.dbf为属性文件; 2)*.prj为投影文件; 3)*.shp为空间信息存储文件; 4)*.shx为图形文件;
  3. 实现代码 1) shp生成与打包
package com.lzugis.helper;

import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point;
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 java.io.*;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ShapeHelper {

    public ShapeHelper(){
        super();

    }

    public void write2ShapeFile(String shpPath, String[] header, List data){
        try{
            //创建shape文件对象
            File file = new File(shpPath);
            Map<String, Serializable> params = new HashMap<String, Serializable>();
            params.put( ShapefileDataStoreFactory.URLP.key, file.toURI().toURL() );
            ShapefileDataStore ds = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params);
            //定义图形信息和属性信息
            SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder();
            tb.setCRS(DefaultGeographicCRS.WGS84);
            tb.setName("shapefile");
            tb.add("the_geom", Point.class);
            for(int i= 0;i<header.length;i++){
                String field = header[i];
                tb.add(field.toUpperCase(), String.class);
            }
            ds.createSchema(tb.buildFeatureType());
            //设置编码
            Charset charset = Charset.forName("GBK");
            ds.setCharset(charset);
            //设置Writer
            FeatureWriter<SimpleFeatureType, SimpleFeature> writer = ds.getFeatureWriter(ds.getTypeNames()[0], Transaction.AUTO_COMMIT);
            //写入文件信息
            for(int i=0;i<data.size();i++){
                SimpleFeature feature = writer.next();
                Map<String, Object> row = (Map)data.get(i);
                Geometry geom = new GeometryFactory().createPoint(new Coordinate((Double)row.get("x"), (Double)row.get("y")));
                feature.setAttribute("the_geom", geom);
                for (Map.Entry entry : row.entrySet()) {
                    feature.setAttribute(entry.getKey().toString().toUpperCase()
                            , entry.getValue());
                }
            }
            writer.write();
            writer.close();
            ds.dispose();

            //添加到压缩文件
            zipShapeFile(shpPath);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public void zipShapeFile(String shpPath){
        try{
            File shpFile = new File(shpPath);
            String shpRoot = shpFile.getParentFile().getPath(),
                    _shpName = shpFile.getName(),
                    shpName = _shpName.substring(0, _shpName.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",
            };
            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();
        }
    }
}

2) shp文件下载

    @RequestMapping(value="geocode/down")
    public void downGeocodePois(String type, HttpServletResponse response){
        try {
            String downFile = geoService.getDownFile(type);
            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();
            response.reset();
            // 先去掉文件名称中的空格,然后转换编码格式为utf-8,保证不出现乱码,这个文件名称用于浏览器的下载框中自动显示的文件名
            response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.replaceAll(" ", "").getBytes("utf-8"),"iso8859-1"));
            response.addHeader("Content-Length", "" + file.length());
            OutputStream os = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/octet-stream");
            os.write(buffer);// 输出文件
            os.flush();
            os.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • geotools中等值面的生成与OL3中的展示

    本文讲述如何在geotools中IDW插值生成等值面,并根据给定shp进行裁剪,并生成geojson数据,以及Openlayers3中展示。

    lzugis
  • geotools中泰森多边形的生成

    泰森多边形又叫冯洛诺伊图(Voronoi diagram),得名于Georgy Voronoi,是由一组由连接两邻点直线的垂直平分线组成的连续多边形组成。

    lzugis
  • 用GeoTools实现shp+sld导出图片

    lzugis
  • SpringBoot发送邮件

    Java团长
  • 国家重点研发计划云计算和大数据重点专项“大数据多模态交互协同关键技术”项目启动会顺利召开

    2018年1月18日,由中科院自动化所徐常胜研究员牵头的国家重点研发计划“云计算与大数据”重点专项“大数据多模态交互协同关键技术”项目启动会暨实施方案论证会在中...

    WZEARW
  • Python编程常见出错信息及原因分析(3)

    (1)不可哈希错误 演示代码: >>> x = {[1], [2]} Traceback (most recent call last): File "<p...

    Python小屋屋主
  • Arcgis Runtime sdk for android 授权

    要下载和安装 ArcGISRuntime SDK for Android,您需要注册开发者账户,进而便拥有了访问所有功能的权限,从而实现开发和测试目的。但是,这...

    水击三千
  • gateway nacos sentinel 三剑客强强组合

    spring cloud gateway 响应式网关,基于nacos实现动态网关,基于sentinel实现动态限流,sentinel基于nacos数据持久化

    边鹏 [进阶者]
  • Web应用程序遭黑客入侵的五大征兆

      大多数针对Web应用程序的攻击都非常隐蔽,不容易发现。从2015威瑞森数据泄漏调查报告来看,攻击者平均可以在网络上潜伏205天不被发现。许多组织都是从其他人...

    用户1289394
  • IBM Websphere Message Broker(MB) 教程系列-(2) 创建Broke

    Java学习123

扫码关注云+社区

领取腾讯云代金券