作者:dongyx
一、背景
在工程实施过程中,可能会出现某个区域内建模模型的增加、修改或者移除。对模型数据集修改后我们是不是也需要重新对整个模型数据集切缓存发布服务呢?如果业务数据过于庞大,重新切缓存肯定不是一个最优的解决方案了,我们需要有某个功能或者某种实现方法来完成对修改区域的模型进行缓存更新,这样既不用重新对整个模型数据集切缓存,也不用修修改加载模型缓存的代码。下面我们来看一下使用SuperMap iObjects for Java如何对模型缓存进行更新。
二、数据准备
原始模型数据集:datasetA;
修改区域内的模型数据集:datasetB
修改过后的模型数据集:datasetAB
三、实现思路
1.对原始模型数据集切缓存
在iDesktop桌面软件中右键模型数据集datasetA–生成缓存,在生成缓存弹出框中设置好相关参数(需要记住生成缓存时设置的文件类型、模型定位点、瓦片边长等参数,在后续代码书写中需要使用)。
缓存生成结果如图:
2.使用Java组件对缓存进行更新
(1).打开工作空间获取相关数据源中的数据集
WorkspaceConnectionInfo connectionInfo = new WorkspaceConnectionInfo(wsPath);
Workspace workspace = new Workspace();
workspace.open(connectionInfo);
Datasource datasource = workspace.getDatasources().get(datasourceName);
datasetA = (DatasetVector) datasource.getDatasets().get("datasetA");
datasetB = (DatasetVector) datasource.getDatasets().get("datasetB");
datasetAB = (DatasetVector) datasource.getDatasets().get("datasetAB");
(2).获取修改数据集datasetB的范围
Rectangle2D bounds_B = datasetB.getBounds();
(3)设置模型生成缓存的相关参数
OSGBCacheBuilder builder = new OSGBCacheBuilder();
builder.setDataset(datasetAB);//设置生成缓存的数据集
builder.setOutputFolder(cachePath);//设置缓存输出路径,与原始缓存一致
builder.setCacheName(cacheName);//设置缓存名称,与原始缓存一致
builder.setFileType(CacheFileType.S3MB);//设置缓存文件类型
builder.setBounds(bounds_B);//
builder.setTileWidth(300);
builder.setPosition(new Point3D(datasetA.getBounds().getCenter().x,datasetA.getBounds().getCenter().y,0));
builder.buildWithoutConfigFile();
builder.setBounds(datasetAB.getBounds());
String config = _dataPrefix + builder.getCacheName() + "\\" +builder.getCacheName()+ ".scp";
boolean isSuccess = builder.toConfigAndIndexFile(config);
生成结果如图: