GeoTools 读取 GeoPackage (`.gpkg`) 文件转为 GeoJSON

要使用 GeoTools 读取 GeoPackage (.gpkg) 文件的第一个图层并将其转换为 GeoJSON 字符串,

可以按照以下步骤进行:

  1. 读取 GeoPackage 文件:使用 GeoTools 的 DataStore 类来访问 GeoPackage 文件。
  2. 获取第一个图层:从 DataStore 中获取图层信息。
  3. 将图层数据转换为 GeoJSON:使用 FeatureJSON 类将图层数据转换为 GeoJSON 格式的字符串。

下面是一个完整的示例代码:

import org.geotools.data.DataStore;
import org.geotools.data.DataStoreFinder;
import org.geotools.data.FeatureStore;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.geojson.feature.FeatureJSON;
import org.geotools.data.geopkg.GeoPkgDataStoreFactory;

import java.io.File;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

public final class GeoPackageUtil {

    private GeoPackageUtil() {
        throw new UnsupportedOperationException("Utility class cannot be instantiated");
    }

    /**
     * 读取GeoPackage文件的第一个图层并将其转换为GeoJSON字符串
     *
     * @param path GeoPackage文件路径
     * @return GeoJSON字符串
     * @throws Exception 如果文件不存在或数据存储创建失败
     */
    public static String geoPackageLayerToGeoJSON(String path) throws Exception {
        File file = new File(path);

        if (!file.exists()) {
            throw new IllegalArgumentException("GeoPackage file does not exist at path: " + path);
        }

        // 配置参数
        Map<String, Object> params = new HashMap<>();
        params.put(GeoPkgDataStoreFactory.DBTYPE.key, "geopkg");
        params.put(GeoPkgDataStoreFactory.DATABASE.key, file);

        DataStore dataStore = null;
        try {
            // 创建数据存储
            dataStore = DataStoreFinder.getDataStore(params);
            if (dataStore == null) {
                throw new RuntimeException("Failed to create DataStore from GeoPackage file at path: " + path);
            }

            // 获取第一个图层
            String typeName = dataStore.getTypeNames()[0];
            SimpleFeatureSource featureSource = dataStore.getFeatureSource(typeName);
            SimpleFeatureCollection featureCollection = featureSource.getFeatures();

            // 将图层数据转换为GeoJSON
            FeatureJSON featureJSON = new FeatureJSON();
            StringWriter stringWriter = new StringWriter();
            featureJSON.writeFeatureCollection(featureCollection, stringWriter);

            return stringWriter.toString();
        } finally {
            // 关闭数据存储以释放资源
            if (dataStore != null) {
                dataStore.dispose();
            }
        }
    }
}

主要步骤:

  1. 创建 File 对象:用指定路径创建 File 对象,并检查文件是否存在。
  2. 配置 DataStore 参数:设置 GeoPkgDataStoreFactory 参数,并创建 DataStore 实例。
  3. 获取第一个图层:从 DataStore 中获取第一个图层名称,并获取 SimpleFeatureSource
  4. 转换为 GeoJSON:使用 FeatureJSONSimpleFeatureCollection 转换为 GeoJSON 格式的字符串,并返回。

使用示例:

public class Main {
    public static void main(String[] args) {
        try {
            String geoJson = GeoPackageUtil.geoPackageLayerToGeoJSON("path/to/your/file.gpkg");
            System.out.println(geoJson);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
posted @ 2024-07-25 22:36  槑孒  阅读(177)  评论(0)    收藏  举报