geotools 将 shp 文件导出成 geojson

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");
    }
}
可以使用Geotools库来读写shp文件。下面是一个简单的示例代码,可以读取shp文件并打印出其属性表信息: ```java import java.io.File; import java.io.IOException; import org.geotools.data.DataStore; import org.geotools.data.DataStoreFinder; import org.geotools.data.simple.SimpleFeatureCollection; import org.geotools.data.simple.SimpleFeatureIterator; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; public class ShpFileReader { public static void main(String[] args) throws IOException { // 读取shp文件 File file = new File("path/to/shapefile.shp"); DataStore dataStore = DataStoreFinder.getDataStore(file); String typeName = dataStore.getTypeNames()[0]; SimpleFeatureType schema = dataStore.getSchema(typeName); // 获取属性表信息 System.out.println("Feature Type: " + typeName); System.out.println("Number of attributes: " + schema.getAttributeCount()); System.out.println("Attributes: "); for (int i = 0; i < schema.getAttributeCount(); i++) { System.out.println(schema.getAttributeDescriptors().get(i).getName()); } // 获取要素信息 SimpleFeatureCollection collection = dataStore.getFeatureSource(typeName).getFeatures(); try (SimpleFeatureIterator features = collection.features()) { while (features.hasNext()) { SimpleFeature feature = features.next(); System.out.println(feature.getID() + ": " + feature.getDefaultGeometryProperty().getValue()); } } dataStore.dispose(); } } ``` 需要注意的是,需要在pom.xml中添加geotools依赖: ```xml <dependency> <groupId>org.geotools</groupId> <artifactId>gt-shapefile</artifactId> <version>24.0</version> </dependency> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值