geotools 将 shp 文件导出成 geojson

本文介绍了如何使用Geotools库读取SHAPEFILE文件的字符集,并将其转换为GeoJSON格式,包括依赖配置和ShpUtil工具类的详细实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.pom 依赖

<properties>
    <geomesa.version>2.3.0</geomesa.version>
    <geotools.version>20.0</geotools.version>
    <gson.version>2.8.5</gson.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt-shapefile</artifactId>
        <version>${geotools.version}</version>
    </dependency>

    <dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt-geojson</artifactId>
        <version>${geotools.version}</version>
    </dependency>

    <dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt-epsg-hsql</artifactId>
        <version>${geotools.version}</version>
    </dependency>
</dependencies>

<repositories>
    <repository>
        <id>阿里云公共仓库</id>
        <url>https://maven.aliyun.com/repository/public</url>
    </repository>
    <repository>
        <id>osgeo</id>
        <url>https://repo.osgeo.org/repository/release/</url>
    </repository>
</repositories>

2.ShpUtil 工具类

package demo;

import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.store.ContentFeatureCollection;
import org.geotools.data.store.ContentFeatureSource;
import org.geotools.geojson.feature.FeatureJSON;
import org.opengis.feature.simple.SimpleFeature;

import java.io.*;
import java.nio.charset.Charset;

public class ShpUtil {
    private ShpUtil() {
    }

    /**
     * 读取 shp 文件编码格式,在 .cpg 结尾的文件中存储
     *
     * @param shpPath shp 文件路径
     * @return shp 文件编码
     */
    public static String readShpFileCharset(String shpPath) {
        String defaultCharset = "UTF-8";
        File file = new File(shpPath);
        String shpFileName = file.getName().substring(0, file.getName().lastIndexOf("."));
        String shpFilePath = file.getParent();

        String separator = System.getProperty("file.separator");
        String cpgFilePath = shpFilePath + separator + shpFileName + ".cpg";

        BufferedReader bufferedReader = null;
        try {
            File cpgFile = new File(cpgFilePath);
            if (!cpgFile.exists()) {
                return defaultCharset;
            }
            bufferedReader = new BufferedReader(new FileReader(cpgFile));
            String charset = bufferedReader.readLine();

            String ISOChartSet = "ISO-8859-1";
            if (ISOChartSet.equals(charset)) {
                return "GBK";
            }

            return charset;
        } catch (Exception ignored) {
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException ignored) {
                }
            }
        }

        return defaultCharset;
    }

    /**
     * shp 文件转换为 geojson
     *
     * @param shpFile        shp 文件路径
     * @param shpCharset     shp 内容编码
     * @param outputGeojson  输出 geojson 路径
     * @param geojsonCharset 输出文件内容编码
     */
    public static void shpToGeojson(String shpFile, String shpCharset, String outputGeojson, String geojsonCharset) {
        try {
            ShapefileDataStore shapefileDataStore = new ShapefileDataStore(new File(shpFile).toURI().toURL());
            shapefileDataStore.setCharset(Charset.forName(shpCharset));

            final ContentFeatureSource featureSource = shapefileDataStore.getFeatureSource();
            final ContentFeatureCollection features = featureSource.getFeatures();

            try (final OutputStream outputStream = new FileOutputStream(outputGeojson);
                 final OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, geojsonCharset);
                 final BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
                 final SimpleFeatureIterator featureIterator = features.features()) {

                // 写入第一行
                bufferedWriter.write("{\"type\":\"FeatureCollection\",\"features\":[");

                int counter = 0;
                StringBuilder stringBuilder = new StringBuilder();
                int batchSize = 100;

                boolean firstFeature = true;
                while (featureIterator.hasNext()) {
                    final SimpleFeature simpleFeature = featureIterator.next();

                    FeatureJSON featureJson = new FeatureJSON();
                    StringWriter writer = new StringWriter();
                    featureJson.writeFeature(simpleFeature, writer);
                    String featureContent = writer.toString();
                    writer.close();

                    if (!firstFeature) {
                        stringBuilder.append(",");
                    }

                    stringBuilder.append(featureContent);
                    counter++;
                    if (counter == batchSize) {
                        bufferedWriter.write(stringBuilder.toString());
                        counter = 0;
                        stringBuilder = new StringBuilder();
                    }

                    firstFeature = false;
                }

                if (counter > 0) {
                    bufferedWriter.write(stringBuilder.toString());
                }

                // 写入结尾
                bufferedWriter.write("]}");
                bufferedWriter.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.测试运行

public class Application {
    public static void main(String[] args) {
        String shpFile = "D:\\haiceng\\海城地震.shp";
        String outputGeojson = "D:\\haiceng\\output.geojson";

        ShpUtil.shpToGeojson(shpFile, "GBK", outputGeojson, "UTF-8");
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值