用supermap iobject java改变模型数据集中模型的经纬度,高度以及旋转角度,并生成S3M缓存

 

注意: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缓存就是修改后的模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值