首页 / 浏览问题 / 组件GIS / 问题详情
jObject java 编辑shp失败,提示数据集的数据源是只读的
5EXP 2022年03月31日

使用产品:jObject java 9D

操作系统:win10 X64

数据类型:shp

问题详细描述:

首先设置DatasourceConnectionInfo.setReadOnly(false)但并不生效;在创建数据集报错只可读;

public static void main(String[] args) {
        // 打开工作空间,得到数据源
        Workspace workspace = new Workspace();
        Datasources datasources = workspace.getDatasources();
        DatasourceConnectionInfo info = new DatasourceConnectionInfo();
        info.setEngineType(EngineType.VECTORFILE);
        info.setServer("D:\\data\\成都建筑轮廓数据\\成都.shp");
        info.setReadOnly(false);

        Datasource datasource = datasources.open(info);
        System.out.println(datasource.isReadOnly()+"---");

        //创建临时数据集
        Datasets datasets = datasource.getDatasets();

        DatasetVector datasetVector = (DatasetVector) datasets.get("成都");
        queryParameterTest(datasetVector, datasets);//快速拆分数据集

        //批量生成shp文件
        toShp(datasource,datasets);

        // 释放相关资源
        datasources.closeAll();
        info.dispose();
        workspace.close();
        workspace.dispose();
        printWithStar("程序退出");
    }

public static void queryParameterTest(DatasetVector dataset_world,Datasets datasets){

        System.out.println(datasets.getCount());
        // 进行查询
        Recordset recordset = dataset_world.getRecordset(false, CursorType.DYNAMIC);
//        for (recordset.moveFirst(); !recordset.isEOF() ; recordset.moveNext()) {
//                GeoRegion geometry = (GeoRegion) recordset.getGeometry();
//                int floor = recordset.getInt32("FLOOR");
//            recordset.setString("name","建筑名称");
//            System.out.println(recordset.getString("name"));
//        }

        // 以 dataset_world 为模板创建数据集
        DatasetVector dataset_result = (DatasetVector) datasets.
                createFromTemplate(datasets.getAvailableDatasetName("文件名称"), dataset_world);//这里报错,Exception in thread "main" java.lang.UnsupportedOperationException:createFromTemplate(String name, Dataset templateDataset)数据集的数据源是只读的

        // 将空间查询结果追加到新建的数据集中
        dataset_result.append(recordset);

        // 依次关闭所有对象
        dataset_result.close();
        recordset.dispose();
        dataset_world.close();
    }

1个回答

您好,对于 shp 类型的文件数据,无论是否设置“只读”,打开后都是只读模式,无法对数据集中的数据进行修改。建议您可以参考以下流程实现对 shp 数据的修改:

1. 通过 DataImport 类将 shp 数据导入 udbx/udb 类型数据集;

2. 对导入后的数据集进行数据更新操作;

3. 待数据相关操作全部完成后,通过 DataExport 将修改后的数据集导出为新的 shp 类型文件。

关于 DataImport 和 DataExport 类的详细接口,可在 SuperMap iObjects Java 组件安装目录/Help目录下的帮助文档中通过检索找到具体类描述,除外您也可以参考帮助文档中的“范例程序说明”中的“数据转换(DataExchange)”,示例中展示了几种数据的导入导出具体操作。

希望可以帮到您。
2,253EXP 2022年03月31日

啊哈,我感觉也是,但是在文档中看见了这个,还以为可以呢:

VECTORFILE

public static final EngineType VECTORFILE

矢量文件引擎类型,对应的枚举值为 101。针对通用矢量格式如 shp,tab,Acad等,支持矢量文件的编辑和保存,如果是FME支持的类型则需要对应的FME许可,目前没有FME许可不支持FileGDBVector格式。

您好,建议您使用 SuperMap iObjects Java 10i 最新版组件,下载地址,10i相对比9D功能更稳定,支持的功能更多,帮助文档描述更详细。

由于您使用的是 SuperMap iObjects Java 9D 组件,并不是最新版的 10i 组件,在 9D 上对 EngineType VECTORFILE 的描述可能不足够详细,在 iObjects Java 10i 的帮助文档上描述如下:

希望可以帮到您。

...