使用 geotools 对shp文件转为 geojson

/**
     * 描述:把shp的边界线转换为geojson
     *
     * @param file
     * @return File
     */
    public static void shpTranGeoJsonFile(File file, File tarFile) throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("url", file.toURI().toURL());// 必须是URL类型
        DataStore dataStore = DataStoreFinder.getDataStore(map);
        //字符转码,防止中文乱码
        ((ShapefileDataStore) dataStore).setCharset(Charset.forName("utf8"));
        String typeName = dataStore.getTypeNames()[0];
        FeatureSource<SimpleFeatureType, SimpleFeature> source = dataStore.getFeatureSource(typeName);

        FeatureCollection<SimpleFeatureType, SimpleFeature> collection = source.getFeatures();
        FeatureIterator<SimpleFeature> features = collection.features();
        // 根据几何图形创建要素列表
        List<SimpleFeature> featureList = new ArrayList<>();
        SimpleFeatureTypeBuilder typeBuilder = new SimpleFeatureTypeBuilder();
        typeBuilder.setName("GeometryFeature");
        // 创建要素类型
        SimpleFeatureType featureType = typeBuilder.buildFeatureType();

        while (features.hasNext()) {
            // 迭代提取属性
            SimpleFeatureImpl feature = (SimpleFeatureImpl) features.next();

            CoordinateReferenceSystem sourceCRS = feature.getFeatureType().getCoordinateReferenceSystem();
            CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:4326", true);
            MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS, true);

            GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();

            Geometry sourceGeo = geometryFactory.createGeometry((Geometry) feature.getDefaultGeometry());

            Geometry targetGeo = JTS.transform(sourceGeo, transform);

            // 设置保留8位小数,否则GeometryJSON默认保留4位小数
//            GeometryJSON geometryJson = new GeometryJSON(8);

            typeBuilder = new SimpleFeatureTypeBuilder();
            typeBuilder.setName("GeometryFeature");
            typeBuilder.add("geometry", Geometry.class);

            for (Property property : feature.getValue()) {
                if (!"the_geom".equals(property.getName().toString())) {
                    typeBuilder.add(String.valueOf(property.getName()), Object.class);
                }
            }

            // 创建要素类型
            featureType = typeBuilder.buildFeatureType();
            // 创建要素生成器
            SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(featureType);

//            for (Geometry geometry : geometries) {
            // 设置几何体属性
            featureBuilder.set("geometry", targetGeo);
            // 构建功能
            SimpleFeature featureSave = featureBuilder.buildFeature(UUID.randomUUID().toString(), targetGeo);

            for (Property property : feature.getValue()) {
                if (!"the_geom".equals(property.getName().toString())) {
                    featureSave.setAttribute(String.valueOf(property.getName()), property.getValue());
                }
            }

            // 将功能添加到列表,多个才用遍历的添加
            featureList.add(featureSave);

        }

        features.close();
        // 从要素列表创建要素集合
        FeatureCollection<SimpleFeatureType, SimpleFeature> featureCollection =
                new ListFeatureCollection(featureType, featureList);

        FeatureJSON io = new FeatureJSON();

        io.writeFeatureCollection(featureCollection, new FileOutputStream(FileUtil.touch(tarFile)));
        featureList = null;
        dataStore.dispose();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值