注意:model.udbx是模型数据集,如果不是模型数据集,就需要把它转成模型数据集。
package lijiang;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import com.supermap.data.CursorType;
import com.supermap.data.DatasetVector;
import com.supermap.data.Datasource;
import com.supermap.data.DatasourceConnectionInfo;
import com.supermap.data.EngineType;
import com.supermap.data.Geometry3D;
import com.supermap.data.Point3D;
import com.supermap.data.Recordset;
import com.supermap.data.Workspace;
import com.supermap.data.processing.OSGBCacheBuilder;
import com.supermap.realspace.CacheFileType;
public class MainTest {
public static void main(String[] args) throws FileNotFoundException {
Datasource mDatasource = null;
Workspace mWorkspace = new Workspace();
DatasourceConnectionInfo info = new DatasourceConnectionInfo();
info.setEngineType(EngineType.UDBX);
info.setServer("E://LiJiangSuperMapPractice//2019_7_28//model//model.udbx");
// 获取到数据源
mDatasource = mWorkspace.getDatasources().open(info);
if (mDatasource == null) {
System.out.println("数据源打开失败");
return;
} else {
System.out.println("数据源打开成功!");
}
// 设置下结果数据输出到文本中
// PrintStream ps = new PrintStream("E://LiJiangSuperMapPractice//2019_7_28//model//log.txt");
// System.setOut(ps);
// for (int i = 0; i < mDatasource.getDatasets().getCount(); i++) {
// 获取到模型数据集
DatasetVector modelDataset = (DatasetVector) mDatasource
.getDatasets().get(0);
if (modelDataset != null) {
System.out.println("数据集不为空");
} else {
System.out.println("数据集为空");
}
String name= modelDataset.getName();
// 得到“Example”对应的所有记录集,
// isEmptyRecordset - 给定的判断是否返回空的记录集参数。为 true 时返回空记录集。为 false 时返回包含所有记录的记录集合对象。
// cursorType - 指定的游标类型,以便用户控制查询出来的记录集的属性。当游标类型为动态时,记录集可以被修改,当游标类型为静态时,记录集为只读。
Recordset recordset = modelDataset.getRecordset(false, CursorType.DYNAMIC);
Geometry3D geometry = null;
// recordset.isEOF():判断当前记录的位置是否在记录集中的最后一条记录的后面,如果是,返回 true;否则返回 false。
while (!recordset.isEOF()) {
recordset.edit();
geometry = (Geometry3D) recordset.getGeometry();
// 获取三维几何对象的相关信息
int Id = geometry.getID();
Point3D point3d = geometry.getPosition();
Double x = geometry.getRotationX();
Double y = geometry.getRotationY();
Double z = geometry.getRotationZ();
System.out.println("数据集名为:"+name+";"+"ID:" + Id + ";" + "原始坐标:" + point3d.getX()
+ "," + point3d.getY() + "," + point3d.getZ() + ";"
+ "原始旋转角度:" + x + "," + y + "," + z);
// 数据集名为:test22;ID:1;原始坐标:112.98421147177535,45.00710073887372,0.0;原始旋转角度:0.0,0.0,0.0
geometry.setPosition(new Point3D(20, 25, 20));
geometry.setRotationX(10.0);
geometry.setRotationY(10.0);
geometry.setRotationZ(10.0);
Point3D point3d1 = geometry.getPosition();
Double x1 = geometry.getRotationX();
Double y1 = geometry.getRotationY();
Double z1 = geometry.getRotationZ();
recordset.setGeometry(geometry);
recordset.update();
System.out.println("数据集名为:"+name+";"+"ID:" + Id + ";" + "新坐标:" + point3d1.getX()
+ "," + point3d1.getY() + "," + point3d1.getZ() + ";"
+ "新旋转角度:" + x1 + "," + y1 + "," + z1);
recordset.moveNext();
}
// 生成s3m缓存
DatasetVector datasetVector1 = (DatasetVector) mDatasource.getDatasets().get("test22");
String outputFolder1="E://LiJiangSuperMapPractice//2019_7_28//model//Cache";
String cacheName1="s3mCache";
OSGBCacheBuilder osgbCB=new OSGBCacheBuilder(datasetVector1,outputFolder1,cacheName1);
osgbCB.setFileType(CacheFileType.S3M);
osgbCB.build();
// 关闭记录集,释放几何对象、记录集
recordset.close();
geometry.dispose();
recordset.dispose();
modelDataset.close();
mDatasource.close();
}
}
运行结果:
然后在supermap desktop软件中导入数据集“s3mCache.scp”,右键该数据集“添加到新球面场景”,双击打开的场景,即可定位到模型。
对于s3m缓存,我的理解就是,用代码修改模型的空间信息和属性信息,在supermap中加载该模型后可以看到模型的属性等相关信息被修改了,而生成s3m缓存就是他们中间的一个步骤。感觉s3m缓存就是修改后的模型