• 超图平台(工作空间,数据源,数据集,记录集的使用)


    写在前面:
    超图平台的搭建直接按照官方文档搭建即可,而且超图是有技术支持的,有任何问题都可以直接打电话问非常的NICE。我这里只说一点特别重要,如果你同时也在使用GDAL,那么你最好弄两套JDK环境,我自己遇到过两者某些包冲突的情况,跑超图的代码启动就会马上崩溃,单独使用另一个JDK就可以解决这个问题。

    本来官网也有很多代码的例子,但是每次都要下载一个压缩包不太方便因此在这里把常用的一些操作做一下汇总。
    另外在编码的过程中使用到的对象一定要释放,我这里的例子里可能没有粘贴释放对象的代码,但是一定要记得释放对象非常重要,否则可能会发生内存溢出的问题(笔者就被坑过)。还有如果是循环操作,里面用到的对象最好定义在循环外面这样每次都是用这块空间(笔者也有惨痛的经历)。
    官方代码:http://support.supermap.com.cn/product/CodeLibrary.aspx?PRODUCT_TYPE=3#pro_name

    注:以下代码均参考子超图官网,做了部分改动。

    工作空间管理

    • 打开文件类型的工作空间
    String dirPath = "E:\\项目资料\\data\\超图工作空间.smwu";
    Workspace workspace = new Workspace();
    WorkspaceConnectionInfo info = new WorkspaceConnectionInfo();
    info.setServer(dirPath);
    info.setType(WorkspaceType.SMWU);
    boolean openRes = workspace.open(info);
    System.out.printf(String.valueOf(openRes));
    // 接着我们就可以读取工作空间中的内容
    Datasources datasources = workspace.getDatasources();
    Datasource datasource = datasources.get(0);
    Datasets datasets = datasource.getDatasets();
    // 输出result
    System.out.println(datasets.get(0).getName());
    
    • 打开数据库类型的工作空间
    Workspace workspace = new Workspace();
    WorkspaceConnectionInfo connectionInfo = new WorkspaceConnectionInfo();
    connectionInfo.setDriver("SQL SERVER");
    // connectionInfo.setDriver("PostgreSQL");
    // connectionInfo.setType(WorkspaceType.ORACLE);
    // connectionInfo.setType(WorkspaceType.PGSQL);
    connectionInfo.setType(WorkspaceType.SQL);
    connectionInfo.setServer("ip:端口");
    connectionInfo.setDatabase("dataBase");
    connectionInfo.setUser("user");
    connectionInfo.setPassword("pass");
    connectionInfo.setName("name");
    boolean open = workspace.open(connectionInfo);
    System.out.println(open);
    
    • 保存、创建和删除工作空间
      只是最后的API调用发生了变化
    workspace.create(connectionInfo);
    workspace.deleteWorkspace(connectionInfo);
    workspace.saveAs(connectionInfo);
    

    官网示例地址:
    http://support.supermap.com.cn/UploadFilesData/c17121023371846_WorkspaceManage.rar

    dataSource相关操作

    • 打开和创建数据源(通用模板)
    DatasourceConnectionInfo info = new DatasourceConnectionInfo();
    // 主要是这里设置数据类型
    info.setEngineType(EngineType.IMAGEPLUGINS);
    // 这里设置路径比如***/***/test.udbx
    info.setServer(path);
    // info.setDatabase(database) 如果数据源是数据库或者WMS需要设置这个属性
    // 如果是开源数据,这里只允许设置WMS和WFS两种类型,具体看发布的网络数据源类型info.setDatabase("WMS");
    			
    // 如果需要打开数据源直接将create换成open即可
    Datasource ds = workspace.getDatasources().create(info);
    

    另外的其它属性的设置可以参考此图
    在这里插入图片描述
    注意:官网还有很多打开其它数据源的案例http://support.supermap.com.cn/UploadFilesData/c13638082651814_DatasourceManage.rar

    • 内存数据源
      在数据量少的时候可以使用,根据我的测试应该是关闭了连接以后内存数据源就会被释放(没有深入测试,如果哪位大佬发现不是,也可一起讨论一下)。个人觉得临时空间分析的操作在数据量不大的情况下都可以用内存数据源,但是也要谨慎免得内存崩溃,总之要看具体问题具体分析。
    DatasourceConnectionInfo info = new DatasourceConnectionInfo();
    // 设置数据源位置为内存中,类型为UDB
    info.setServer(":memory:");
    info.setEngineType(EngineType.UDBX);
    

    数据集相关操作

    • 创建矢量数据集
     DatasourceConnectionInfo info = new DatasourceConnectionInfo();
    // 设置数据源位置为内存中,类型为UDB
     info.setServer(":memory:");
     info.setEngineType(EngineType.UDBX);
     Workspace workspace = new Workspace();
     Datasource datasource = workspace.getDatasources().create(info);
     DatasetVectorInfo datasetVectorInfo = new DatasetVectorInfo();
     // 这里设置数据类型
     datasetVectorInfo.setType(DatasetType.REGION);
     datasetVectorInfo.setName("test");
     // 数据存储的压缩方式,详细的说明可以看下面的链接
     datasetVectorInfo.setEncodeType(EncodeType.BYTE);
     DatasetVector datasetVector = datasource.getDatasets().create(datasetVectorInfo);
     EncodeType encodeType = datasetVector.getEncodeType();
     System.out.println(encodeType.toString());
    

    特别注意:这里如果创建的数据源已经存在了,那边创建的时候就会返回NULL。
    如果我们是根据现有的数据创建的话会更方便一点

     Workspace workspace = new Workspace();
            DatasourceConnectionInfo info = new DatasourceConnectionInfo();
            info.setEngineType(EngineType.UDBX);
            info.setAlias("永久基本农田");
            info.setServer("E:\\项目资料\\data\\永久基本农田.udbx");
            Datasource open = workspace.getDatasources().open(info);
            for (int i = 0; i < open.getDatasets().getCount(); i ++) {
                System.out.println(open.getDatasets().get(i).getName());
            }
            Dataset openDataset = open.getDatasets().get("YJJBNT");
            DatasourceConnectionInfo newInfo = new DatasourceConnectionInfo();
            newInfo.setEngineType(EngineType.UDBX);
            newInfo.setServer("E:\\项目资料\\data\\demo.udbx");
            newInfo.setAlias("data");
            // ***** 特别提醒 ****
            // ***** 这一步需要注意如果已经有了同名的UDBX那么返回结为null,就会空指针异常 ***
            Datasource saveDatasource = workspace.getDatasources().create(newInfo);
            DatasetVector demo = (DatasetVector)saveDatasource.getDatasets().createFromTemplate("demo", openDataset);
            FieldInfos fieldInfos = demo.getFieldInfos();
            for (int i = 0; i < fieldInfos.getCount(); i ++) {
                FieldInfo fieldInfo = fieldInfos.get(i);
                System.out.println(fieldInfo.getName() + " : " + fieldInfo.getDefaultValue());
            }
    
    

    通过这种方式我们新的数据立马有了现有数据的所以字段和属性。
    特别注意:我们在做数据源连接的时候一定要 info.setAlias(“永久基本农田”);设置数据源的别名如果不设置默认会有一个UntitledDatasource,注意我们在创建其它数据集也不设置这个值的话就会报下图的错误。
    在这里插入图片描述
    同时我们还可以通过DatasetVectorHelper来创建数据集,比较简单这里不再详细阐述。

    DatasetVectorHelper.createDatasetVector(Datasource datasource, String name, com.supermap.data.DatasetType dataType);
    DatasetVectorHelper.createMemoryDatasetVector();
    

    关于压缩编码可以官网的描述非常清楚:
    http://support.supermap.com.cn/DataWarehouse/WebDocHelp/iObjectsJava/ProgrammingReference/com/supermap/data/EncodeType.html
    关于EngineType可以参考这篇文章:
    http://support.supermap.com.cn/DataWarehouse/WebDocHelp/iObjectsJava/ProgrammingReference/com/supermap/data/EngineType.html

    • 创建栅格数据集
      如果栅格数据本来就存在文件中则相对简单一点。
    Workspace workspace = new Workspace();
    DatasourceConnectionInfo info = new DatasourceConnectionInfo();
    info.setAlias("永久基本农田");
    info.setServer("E:\\项目资料\\data\\永久基本农田.udbx");
    info.setEngineType(EngineType.UDBX);
    Datasource open = workspace.getDatasources().open(info);
    Datasets datasets = open.getDatasets();
    DatasetGrid datasetGrid = (DatasetGrid) datasets.get(0);
    System.out.println(datasetGrid.getPixelFormat());
    System.out.println(datasetGrid.getWidth());
    System.out.println(datasetGrid.getHeight());
    // 在获取统计结果以前先构建统计结果
    System.out.println(datasetGrid.buildStatistics().getMaxValue());
    

    如果数据没有保存到UDBX,我们可以先将数据导入UDBX得到上的数据源

    String rasterPath= "rasterDataSetPath.udbx";
    Workspace workspace = new Workspace();
    DatasourceConnectionInfo info = new DatasourceConnectionInfo();
    info.setEngineType(EngineType.UDBX);
    info.setServer(rasterPath);
    Datasource dataSource = workspace.getDatasources().create(info);
    ImportSettingTIF importSettingTIF = new ImportSettingTIF();
    importSettingTIF.setImportingAsGrid(true);
    importSettingTIF.setImportMode(ImportMode.OVERWRITE);
    
    String id = UUID.randomUUID().toString();
    importSettingTIF.setSourceFilePath(path);
    importSettingTIF.setTargetDatasetName(id);
    importSettingTIF.setTargetDatasource(dataSource);
    // 导入数据
    DataImport dataImport = new DataImport();
    dataImport.getImportSettings().add(importSettingTIF);
    ImportResult run = dataImport.run();
    
    if (run.getFailedSettings().length == 0) {
       System.out.println("导入成功!");
    }
    DatasetGrid datasetGrid = (DatasetGrid)dataSource.getDatasets().get(0);
    

    直接打开栅格数据源笔者在梳理这里的时候还没有找到很好的方法,后续在补充到这里。

    记录集相关操作

    这部分就是针对单条数据进行操作

    // 关于得到recordSet的参数可以见图
    Recordset recordset = ((DatasetVector) data).getRecordset(false, CursorType.DYNAMIC);
    

    在这里插入图片描述

    • 历记录集
      第一种方式
    Workspace workspace = new Workspace();
    DatasourceConnectionInfo info = new DatasourceConnectionInfo();
    info.setAlias("永久基本农田");
    info.setServer("E:\\项目资料\\data\\永久基本农田.udbx");
    info.setEngineType(EngineType.UDBX);
    Datasource open = workspace.getDatasources().open(info);
    Dataset data = open.getDatasets().get("YJJBNT");
    DatasetVector vector = (DatasetVector) data;
    Recordset recordset = ((DatasetVector) data).getRecordset(false, CursorType.DYNAMIC);
    int count = recordset.getRecordCount();
    System.out.println("+++++++++++++++" + count + "++++++++++++++++++");
    // 遍历要素集
    for (int i = 0; i < count; i ++) {
        int id = recordset.getID();
        System.out.println(id);
        recordset.moveNext();
    }
    

    第二种方式

    while (!recordset.isEOF()) {
    System.out.println(recordset.getCurrentIndex() + " : " + recordset.getID());
    recordset.moveNext();
    }
    
    • 编辑记录集
      单条编辑
    // 编辑几何属性和属性字段
    recordset.seekID(id);
    GeoPoint geoPoint = new GeoPoint(100, 100);
    recordset.edit();
    recordset.setFieldValue("test", "demo");
    recordset.setGeometry(geoPoint);
    recordset.update();
    
    // 另外如果是遍历几何属性
    FieldInfos fieldInfos = recordset.getFieldInfos();
    int count = fieldInfos.getCount();
    for (int i  = 0; i < count; i ++) {
    FieldInfo fieldInfo = fieldInfos.get(i);
    System.out.println(fieldInfo.getName() + " " + fieldInfo.getType()+ " " + fieldInfo.getDefaultValue());
    }
    
    • 批量编辑
    // 设置每100条会自动提交
    recordset.getBatch().setMaxRecordCount(100);
    recordset.getBatch().begin();
    while (!recordset.isEOF()) {
        // 在这里面进行属性或者几何对象的编辑
        recordset.moveNext();
    }
    // 批量更新会自动提交更新,这一步是更新最后不足100条的数据
    recordset.getBatch().update();
    

    官方示例:
    http://support.supermap.com.cn/UploadFilesData/c4877677061833_RecordsetManage.rar

    后面有时间会持续更新查询和空间分析等内容

  • 相关阅读:
    Spring Cloud Alibaba Seata AT模式工作流程
    Java程序员必看,java技术面试评语及录用建议
    【新闻稿】Solv 与 zCloak 联合开发跨境贸易场景下可编程数字凭证项目,获得新加坡、加纳两国央行支持...
    JS的8种创建对象的方法
    电脑重装系统还原0x80070005错误如何解决
    Allegro基本规则设置指导书之Same Net Spacing规则设置
    【Pytorch】一文搞懂nn.Conv2d的groups参数的作用
    MySQL性能优化顺序
    OpenAI ChatGPT API 文档之 Embedding
    monaco-editor 实现SQL编辑器
  • 原文地址:https://blog.csdn.net/qq_43259860/article/details/126871507