作者:zhangL
背景
很多用户在实际项目开发中对osgb数据进行倾斜入库的处理已经不局限于使用iDesktop产品了,而是需要将这个过程定制化、后台化、流程化。这里我将从iObjects java产品的角度,分两步进行过程讲解。
1.生成倾斜配置文件
对osgb生成倾斜配置文件,该过程不太熟悉的同学可以在桌面上 三维数据——倾斜摄影——数据管理——生成配置文件 先熟悉功能的使用以及参数的含义。
String rootPath = "OSGB文件路径";
String fileName = "test";//scp配置文件名
//pathData即OSGB文件路径下的Data文件夹
String pathData = rootPath + File.separator + "Data" + File.separator ;
//生成Point3D对象,用编辑器打开osgb的xml文件,在<SRSOrigin>对应一栏,里面包含了X,Y,Z坐标信息
double x = 620540;
double y = 3579599;
double z = 0;
Point3D point3D =new Point3D(x,y,z);
//命名scp格式文件
String configFileName= pathData + fileName + ".scp";
System.out.println("生成scp格式文件");
//io遍历读取osgb文件
String fileNames = pathData ;
File file = new File(fileNames);
File[] files = file.listFiles();
String[] lsStrings = new String[files.length];
for (int i = 0; i < files.length; i++) {
if(files[i].isDirectory()) {
File[] ffFiles=files[i].listFiles();
lsStrings[i]=ffFiles[0].getPath();
}
}
//设置PrjCoordSys对象的EPSG
PrjCoordSys prjCoordSys = new PrjCoordSys();
prjCoordSys.fromEPSGCode(4548);
//生成scp配置文件
boolean OSGBflat = OSGBCacheBuilder.generateConfigFile(configFileName, point3D, prjCoordSys, lsStrings);
System.out.println(OSGBflat);
2.倾斜入库
生成好scp配置文件了过后就可以根据 scp文件进行倾斜入库了。同样,对这个操作不太熟悉的建议先使用桌面的功能,三维数据——倾斜摄影——数据处理——倾斜入库。
//第一步生成的scp配置文件
String scpPath = pathData + fileName + ".scp";
//存放入库后数据的目录
String outputFolder = rootPath + File.separator + "S3M";
//倾斜摄影数据生成类
ObliquePhotogrammetryBuilder obliquePhotogrammetryBuilder =
new ObliquePhotogrammetryBuilder(new ObliqueProcessType[]{ObliqueProcessType.COMBINE_NODE,ObliqueProcessType.COMPRESS_TEXTURE});
//设置存储类型
obliquePhotogrammetryBuilder.setStorageType(StorageType.Original);
// 设置纹理压缩类型,可以查组件帮助文档TextureCompressType查看不同类型以及对应含义
obliquePhotogrammetryBuilder.setTexCompressType(TextureCompressType.TEXTURECOMPRESS_DXT);
// 设置约束类型。 软约束,裁剪边界按照原始数据计算;硬约束,裁剪边界按照新数据计算
obliquePhotogrammetryBuilder. setConstraintType(ConstraintType.SOFTCONSTRAINT);
// 设置输入的SCP名字。
obliquePhotogrammetryBuilder.setFieldName(fileName + ".scp");
//setFileType(CacheFileType fileType)
// 设置结果数据的缓存文件格式。
obliquePhotogrammetryBuilder.setFileType(CacheFileType.S3MB);
//设置中心点坐标单位
obliquePhotogrammetryBuilder.setCenterPositionUnit(DataUnit.Meter);
// 设置合并根节点的金字塔层级数。
obliquePhotogrammetryBuilder.setCombineLevel(1);
//设置目标坐标系
PrjCoordSys prj4490 = new PrjCoordSys();
prj4490.fromEPSGCode(4490);
obliquePhotogrammetryBuilder.setTargetPrjCoordSys(prj4490) ;
//设置几何压缩方式,包括不压缩、常规压缩、DRACO压缩。
obliquePhotogrammetryBuilder.setVertexOptimazationType(VertexOptimizationType.VO_NONE);
//设置线程数
int threadCount= 8;
//倾斜入库
boolean build = obliquePhotogrammetryBuilder.build(scpPath, outputFolder, threadCount);
if(build) {
System.out.println("s3mb生成成功");
}
//将结果数据加载并保存到场景进行显示
//在本地创建一个工作空间
Workspace workspace = new Workspace();
workspace.setCaption(fileName);
WorkspaceConnectionInfo workspaceConnectionInfo = new WorkspaceConnectionInfo();
workspaceConnectionInfo.setType(WorkspaceType.SXWU);
String filedir = outputFolder + File.separator +"Data" + File.separator;
String filename = fileName +".sxwu";
String fileworkspace = filedir + "/" +filename;
workspaceConnectionInfo.setServer(fileworkspace);//也可以直接复制本地磁盘绝对路径
workspace.create(workspaceConnectionInfo);
//在工作空间中新建一个场景
Scene scene =new Scene(workspace);
Layer3Ds layer3Ds = scene.getLayers();
//向三维图层集合中添加三维图层
String layer3DsScpName = rootPath+"/S3M/Combine.scp";//入库后的scp文件
Layer3D layer3d = layer3Ds.add(layer3DsScpName, Layer3DType.OSGB, true);
scene.ensureVisible(layer3d);
scene.refresh();
Scenes scenes = workspace.getScenes();
scenes.add( fileName, scene.toXML());
workspace.saveAs(workspaceConnectionInfo);
System.out.println("保存工作空间成功");