首页 / 浏览问题 / 组件GIS / 问题详情
iobjects java 切缓存如何增量更新
twt
22EXP 2024年01月04日

版本1-数据集A:有smid1~3, 共3条记录。

版本2-数据集A:有smid2~5, 共4条记录,该版本删除了smid1的数据和新增了smid4,smid5的数据。

这种情况下如何在不重新生成整个数据集的情况下,如何做到增量更新,新增的记录集和删除对应记录集的缓存数据。

1个回答

您好,iObjects Java 11.1.1 组件提供了 OSGBCacheBuilder.append 接口用于局部更新已生成的三维切片缓存,使用 append 接口也可实现增量更新效果,接口详细说明和使用方式可参考 iObjects Java 组件帮助文档,如下图所示:

三维切片缓存更新提供了 2 种方式:

  1. 按数据范围 Bounds 更新;
  2. 根据模型 ID 更新。

对于已删除的数据,可通过按数据范围更新的方式更新三维切片缓存,即可实现删除效果;对于新增的数据,可任选以上 2 种更新方式之一,皆可达到新增三维切片缓存的效果。OSGBCacheBuilder.append 接口的详细使用方式,可参考以下代码示例:

注意:OSGBCacheBuilder 对象参数需与待更新的三维切片缓存生成参数保持一致!若不清楚具体参数值,可打开待更新的三维切片缓存配置文件 *.scp 从中获取。

// 按数据范围更新三维切片缓存
builder.setBounds(bounds);
boolean append = builder.append(UpdateType.ALL, true);

// 按模型 ID 更新三维切片缓存
UpdateObjectsInfo updateObjectsInfo = new UpdateObjectsInfo();
updateObjectsInfo.setDataset((DatasetVector) building);
updateObjectsInfo.setObjectIDs(objectIDs);
ArrayList<UpdateObjectsInfo> updateObjectsInfos = new ArrayList<>();
updateObjectsInfos.add(updateObjectsInfo);
builder.setUpdateObjectsInfoArray(updateObjectsInfos);
boolean append = builder.append(UpdateType.ALL, true);

希望可以帮到您。

2,258EXP 2024年01月04日
新增数据我能理解了,我试下。对于已删除这么理解相当于还是要重新生成一边吧?

对于已删除的数据,可通过按数据范围更新的方式更新三维切片缓存,即可实现删除效果;

这个是这么理解吗,例如版本2,已删除数据为smid1,需要把smid2~smid3重新更新一边达到删除效果?
可以这么理解哦,在更新三维切片缓存的时候,使用新数据集,但是更新范围设置为已删除的数据范围,由于新数据集中该范围没有数据,所以对三维切片缓存的更新就变成了删除效果
就是因为实际项目中生成缓存的过程太慢不想把整个数据集生成。这么说涉及删除数据的话相当于是把整个数据集重新生成了,这样的话生成效率还是一样会很慢。
局部更新不会全部重新生成,建议您仔细阅读上述回复内容哦,可以像您说的那么理解,但是不需要 smid2~smid3 的范围,只需要 smid1 的数据范围就可以实现三维切片缓存局部内容删除效果。
是这样因为数据集数据很多,每次版本更新删除的数据很少可能就几条记录集。假设版本1数据集中有smid1~smid10000.版本2更新后数据为smid5~smid10000,重新生成的话相对与是把smid5~smid10000整个要生成一遍是这样意思吧。
不是的,只需要将更新范围设置为 smid1~smid4 的数据范围即可,对于 smid5 ~ smid10000 这些没有改动的数据,无需更新

UpdateObjectsInfo updateObjectsInfo = new UpdateObjectsInfo();

updateObjectsInfo.setDataset((DatasetVector) building);

updateObjectsInfo.setObjectIDs(objectIDs);

List<Integer> objectIDss=new ArrayList<>();
objectIDss.add(1);
objectIDss.add(2);
objectIDss.add(3);
objectIDss.add(4);

相当于这句代码是吧updateObjectsInfo.setObjectIDs(objectIDs);;相当于是这个意思是吧。

不是相当于,您提供的代码加上 updateObjectsInfo.setObjectIDs(objectIDs); 这句,就是设置模型 ID 更新的逻辑

我这边测试验证会程序会崩溃报错,这是什么情况

JVM 崩溃可能有多种原因,需要根据 hs_ 开头的崩溃日志中更多的内容才能分析定位崩溃原因,建议确认下您使用的 iObjects Java 组件版本,推荐使用 iObjects Java 11.1.1 版本,看您输出的日志信息是 iServer 10.1.1 版本,若是使用 iObjects Java 10.1.1 版本的组件,建议升级到 11.1.1

控制台log是工程中用到了iServer下面的其他jar,才显示的是 iServer 10.1.1的jar;

环境变量和方法中的jar用的是11.1.1版本;

您那边能帮忙测试下吗,环境变量和jar都为11.1.1版本;我单独弄个个工程只引用了11.1.1的java组件同样的问题。
建议私信我您的联系方式,并把您的测试数据和运行崩溃项目一起发给我,我本地测试分析原因
解决方案:客户编写的代码逻辑不正确,已提供客户逻辑正确且使用客户提供的测试数据可正常运行出结果的示例代码供参考。
...