写在前面:
超图平台的搭建直接按照官方文档搭建即可,而且超图是有技术支持的,有任何问题都可以直接打电话问非常的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);
workspace.create(connectionInfo);
workspace.deleteWorkspace(connectionInfo);
workspace.saveAs(connectionInfo);
官网示例地址:
http://support.supermap.com.cn/UploadFilesData/c17121023371846_WorkspaceManage.rar
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
后面有时间会持续更新查询和空间分析等内容