geotools将几何相交结果输出shp,并压缩成zip

目录

一.GeoTools介绍

二.背景

三.实现代码


一.GeoTools介绍

GeoTools是一套操作和显示地图的开源Java 代码库,提供了一系列符合规范的操作地理空间数据的方法,GeoTools被许多项目使用,在地理信息领域有着广泛的应用。

二.背景

本文介绍的是如何使用GeoTools把几何相交结果输出shp,并压缩成zip。
 

三.实现代码

下面定义了一个 saveIntersectShp()方法,调用这个方法即可实现把几何相交结果输出shp,并压缩成zip。

    public static String saveIntersectShp(List<IntersectGeometryDTO> intersectGeometryList,String intersectShpName){
        String webDir = Sys.ERROR_INFO_TEMP + Sys.BACKSLASH + UuidUtil.get36UUID();
        String saveDir = FileUtils.getSavePath(webDir);
        if (!FileUtils.dirIsExist(saveDir)){
            FileUtils.creatDir(saveDir);
        }
        String webPath = webDir + Sys.BACKSLASH + intersectShpName + "_" + UuidUtil.get36UUID() + ".shp";
        String savePath = FileUtils.getSavePath(webPath);
        File file = new File(savePath);
        FileOutputStream outputStream = null;
        try {
            final SimpleFeatureType type = DataUtilities.createType(
                    "Location",
                    "the_geom:MultiPolygon:srid=4326," +
                            "name:String,"+
                            "area:String,"
            );
            ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();
            Map params = new HashMap();
            params.put("url",file.toURI().toURL());
            params.put("create spatial index", Boolean.TRUE);
            ShapefileDataStore newDataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore(params);
            newDataStore.setCharset(Charset.forName("GBK"));
            newDataStore.createSchema(type);

            List<SimpleFeature> features = new ArrayList<SimpleFeature>();
            SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(type);

            for (IntersectGeometryDTO intersectGeometryDTO:intersectGeometryList){
                Geometry geometry = intersectGeometryDTO.getGeom();
                String geometryType = geometry.getGeometryType();
                String name = intersectGeometryDTO.getName();
                String area = intersectGeometryDTO.getArea();
                if (geometryType.equals("Polygon")){
                    Polygon polygon = (Polygon) geometry;
                    featureBuilder.add(polygon);

                }else if (geometryType.equals("MultiPolygon")){
                    MultiPolygon multiPolygon = (MultiPolygon) geometry;
                    featureBuilder.add(multiPolygon);
                }else if (geometryType.equals("GeometryCollection")){
                    int numGeometries = geometry.getNumGeometries();
                    Geometry geometryChird = null;
                    String geoType = null;        
                    Geometry geometryUnion = null;
                    for (int i = 0;i < numGeometries;i++){
                        geometryChird = geometry.getGeometryN(i);
                        geoType = geometryChird.getGeometryType();
                        if (geoType.equals("Polygon") || geoType.equals("MultiPolygon")){
                            if (geometryUnion == null){
                                geometryUnion = geometryChird;
                            }else {
                                geometryUnion = geometryUnion.union(geometryChird);
                            }
                        }
                    }
                    if (geometryUnion != null){
                        if (geometryUnion.getGeometryType().equals("MultiPolygon")){
                            MultiPolygon multiPolygon = (MultiPolygon) geometryUnion;
                            featureBuilder.add(multiPolygon);
                        }else {
                            Polygon polygon = (Polygon) geometryUnion;
                            featureBuilder.add(polygon);
                        }
                    }else {
                        continue;
                    }
                }else {
                    continue;
                }
                if (StringUtil.isEmpty(name)){
                    name = "";
                }
                if (StringUtil.isEmpty(area)){
                    area = "";
                }
                featureBuilder.add(new String(name.getBytes("gbk"),"gbk"));
                featureBuilder.add(area);
                SimpleFeature feature = featureBuilder.buildFeature(null);
                features.add(feature);
            }

            SimpleFeatureSource featureSource = newDataStore.getFeatureSource();
            Transaction transaction = new DefaultTransaction("create");
            SimpleFeatureStore featureStore =(SimpleFeatureStore) featureSource;
            SimpleFeatureCollection collection = new ListFeatureCollection(type, features);
            featureStore.setTransaction(transaction);
            try {
                featureStore.addFeatures(collection);
                transaction.commit();
            } catch (Exception problem) {
                problem.printStackTrace();
                transaction.rollback();
            } finally {
                transaction.close();
            }

            File inFile = new File(saveDir);
            outputStream = new FileOutputStream(new File(saveDir + ".zip"));
            Boolean toZip = ZipUtil.toZip(inFile,outputStream,true);
            if (toZip){
                FileUtils.deleteDir(saveDir);
                return webDir + ".zip";
            }
            outputStream.flush();
            outputStream.close();
            return null;
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (outputStream != null){
                try {
                    outputStream.flush();
                    outputStream.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

会跑的小鹿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值