【JAVA+GDAL】读取gdb数据图层的字段信息


前言

前几天写了几篇gdal读写shp相关的文章,今天写下读gdb字段信息,其实思路是一样的,只不过gdb有多个图层,shp一般就一个图层。


一、GDAL和Java版本

GDAL版本为3.0.1
Java为JDK 17.0.11

二、代码实现

1.引入gdal环境(设置gdb驱动)

代码如下(示例):

import org.gdal.gdal.gdal;
import org.gdal.ogr.*;
    static {
        ogr.RegisterAll();
        gdal.AllRegister();//设置gdal环境
    }

2.读gdb字段信息

代码如下(示例):

    /**
     * 根据文件路径获取gdb数据源对象
     * @param filePath,gdb数据路径
     * @param type,0为只读,1为可写
     * @author 415411
     * @create 2024/9/7
     **/
    public static DataSource GetDataSourceByGdbFilePath(String filePath, Integer type){
        Driver driver = ogr.GetDriverByName("OpenFileGDB"); //设置驱动
        return driver.Open(filePath, type);
    }
    // 获取gdb图层个数
    public static int getGdbLayerCount(String gdbFilePath) {
        DataSource gdbSource = GetDataSourceByGdbFilePath(gdbFilePath, 0);
        return gdbSource.GetLayerCount();
    }
    // 获取gdb各个图层名称
    public static List<String> getGdbLayerNames(String gdbFilePath) {
        List<String> layerNames = new ArrayList<>();
        DataSource gdbSource = GetDataSourceByGdbFilePath(gdbFilePath, 0);
        for (int i=0; i< gdbSource.GetLayerCount(); i++) {
            Layer layer = gdbSource.GetLayer(i);
            String layerName = layer.GetName();
            layerNames.add(layerName);
        }
        gdbSource.delete();
        return layerNames;
    }
    /**
     * 根据图层名称获取对应的字段信息
     * @param layerName,图层名称
     * @param gdbFilePath,数据路径
     * @author 415411
     * @create 2024/9/7
     **/
    public static List<Map<String,String>> getAttributeByLayerName(String layerName, String gdbFilePath) {
        List<Map<String, String>> fieldMap = new ArrayList<>();
        DataSource gdbSource = GetDataSourceByGdbFilePath(gdbFilePath, 0);
        // 获取图层
        Layer layer = gdbSource.GetLayerByName(layerName);
        FeatureDefn featureDefn = layer.GetLayerDefn();
        for (int i = 0; i < featureDefn.GetFieldCount(); i++) {
            FieldDefn fieldDefn = featureDefn.GetFieldDefn(i);
            // 得到属性字段类型
            int fieldType = fieldDefn.GetFieldType();
//            System.out.println(fieldType);
            String fieldTypeName = fieldDefn.GetFieldTypeName(fieldType);
            System.out.println(fieldTypeName);
            // 得到属性字段名称
            String fieldName = fieldDefn.GetName();
            System.out.println(fieldName);
            Map<String,String> current = new HashMap<>();
            current.put(fieldTypeName, fieldName);
            fieldMap.add(current);
        }
        gdbSource.delete();
        return fieldMap;
    }

3.测试使用

代码如下(示例):

    public static void main(String[] args) {
//        System.out.println(getGdbLayerNames("D:\\work\\testdata\\gdbdata\\output\\ctest.gdb"));
//        System.out.println(getAllFeaturesFieldValueBtFieldName("mbstyle_cookbook_line", "name","D:\\work\\testdata\\gdbdata\\output\\ctest.gdb"));
        System.out.println(getGdbLayerCount("D:\\work\\testdata\\gdbdata\\output\\ctest.gdb"));
    }

总结

gdb读字段的思路与shp读字段基本一致,只不过今天是通过设置驱动的方式来打开文件,shp也可以通过这种方式打开并读取,如ogr.GetDriverByName(“ESRI Shapefile”)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

415411

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

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

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

打赏作者

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

抵扣说明:

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

余额充值