znlgis 博客

GIS开发与技术分享

FileGDB代码示例

1. 读取FileGDB图层

1.1 实现思路


graph TD
    A[注册OGR] --> B[设置中文路径支持]
    B --> C[打开数据驱动]
    C --> D[打开数据源]
    D --> G[获取图层]
    G --> H[读取图层信息]

1.2 代码示例


public Layer readGdbLayer(String driverName,String gdbPath,String layerName) {
        ogr.RegisterAll();
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");

        Driver driver = ogr.GetDriverByName(driverName);
        DataSource dataSource = driver.Open(gdbPath, 1);
        Layer layer = dataSource.GetLayerByName(layerName);

        for (int i = 0; i < layer.GetLayerDefn().GetFieldCount(); i++) {
            System.out.println(layer.GetLayerDefn().GetFieldDefn(i).GetName());
        }

        Feature feature = layer.GetNextFeature();
        while (feature != null) {
            for (int i = 0; i < feature.GetFieldCount(); i++) {
                System.out.println(feature.GetFieldDefnRef(i).GetName());
                System.out.println(feature.GetFieldAsString(i));
            }

            System.out.println(feature.GetGeometryRef().ExportToWkt());

            feature = layer.GetNextFeature();
        }

        return layer;
    }

2. 写入FileGDB图层

2.1 实现思路

graph TD
    A[注册OGR] --> B[设置中文路径支持]
    B --> C[打开数据驱动]
    C --> D[打开数据源或创建数据源]
    D --> G[获取图层或者创建图层]
    G --> H[向图层插入数据]
    H --> I[关闭数据源]

2.2 代码示例


public void writeGdbLayer(String driverName,String gdbPath,String featureDataset,String layerName,int wkid,String wkt) {
        ogr.RegisterAll();
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");

        Vector options = null;
        if (CharSequenceUtil.isNotBlank(featureDataset)) {
            options = new Vector();
            options.add("FEATURE_DATASET=" + featureDataset);
        }

        Driver driver = ogr.GetDriverByName(driverName);
        DataSource dataSource = driver.Open(gdbPath, 1);
        if (dataSource == null) {
            dataSource = driver.CreateDataSource(gdbPath);
        }

        Layer layer = dataSource.GetLayerByName(layerName);
        if (layer == null) {
            SpatialReference sr = new SpatialReference();
            sr.ImportFromEPSG(wkid);
            layer = dataSource.CreateLayer(layerName, sr,6, options);
        }

        FieldDefn fieldDefn = new FieldDefn("TEST", 4);
        layer.CreateField(fieldDefn);

        Feature feature = new Feature(layer.GetLayerDefn());
        feature.SetGeometry(ogr.CreateGeometryFromWkt(wkt));
        feature.SetField("TEST", "test");
        layer.CreateFeature(feature);
        
        dataSource.delete();
    }

3. 读取FileGDB数据集

3.1 实现思路


graph TD
    A[配置GDAL环境] --> B[执行GDAL命令]
    B --> C[解析返回信息]
    C --> D[读取数据集信息]

3.2 代码示例


public void readGdbDs(String gisPath){
        SystemPropsUtil.set("GDAL_FILENAME_IS_UTF8", "YES");
        SystemPropsUtil.set("SHAPE_ENCODING", "UTF-8");
        String output = RuntimeUtil.execForStr(StandardCharsets.UTF_8, "ogrinfo", "-json", gisPath);
        
        String jout = null;
        if (!JSONUtil.isTypeJSONObject(output)) {
            jout = output.substring(output.indexOf("{"));
        }

        if (!JSONUtil.isTypeJSONObject(jout)) {
            jout = output.substring(output.indexOf("{"), output.lastIndexOf("}") + 1);
        }

        JSONObject jsonObject = JSON.parseObject(jout);
        String rootGroup = jsonObject.getString("rootGroup");
        System.out.println(rootGroup);
    }