一、介绍
SuperMap iObjects Java
是面向 GIS 应用系统开发者的组件式 GIS 开发平台,具有强大的地理数据管理、编辑、显示、分析等功能,并且其具有极强的易用性和丰富的帮助资源,适宜快速开发大型 GIS 应用系统。
本篇内容将引领您深度探寻如何借助 SuperMap iObjects Java
高效实现多进程导入 GDB 数据。于本教程之中,您会逐步领略 SuperMap iObjects Java
的卓越效能,熟练掌握开启多进程的方法,进而加速 GDB 数据的导入流程。不论您身为 GIS 领域的专业人士,抑或是对地图创作满怀热忱的业余爱好者,本教程皆会为您呈上详尽的指引与极具实用性的技巧。凭借明晰的步骤与充裕的示例,您能够毫无阻碍地迅速上手,轻松导入多份 GDB 数据,有效缩减数据导入时长,全面提升项目运作的整体效能。
现在让我们一起开启 SuperMap iObjects Java
多进程导入 GDB 数据的学习之旅。
二、环境准备
2.1. 系统环境
操作系统 | 支持 | 说明 |
---|---|---|
Windows | ✔ | Windows 平台推荐硬件配置要求:处理器: 2.00 GHz以上内存要求: 2 GB硬盘容量: 100 GB |
Linux | ✔ | Linux平台最低硬件配置要求:CPU: 1.00 GHz (x86 / ARM 架构)内存: 512 MB硬盘空间: 40 GB |
2.2. 开发环境
软件 | 版本 | 下载地址 | 说明 |
---|---|---|---|
iObjects Java | 11i 及其以上版本 | iObjects Java 下载地址 | SuperMap 官方提供了 iObjects Java 组件 Maven 仓库,可直接使用 |
IDEA | 2020.3.4 及其以上版本 | IDEA 下载地址 | 一款针对 Java 语言开发的集成开发环境(IDE) |
-
配置 iObjects Java 组件环境变量
由于
SuperMap iObjects Java
组件的核心 GIS 功能实际上是基于 C++ 语言来实现的,并且是通过 Java Native Interface(JNI)进行调用。鉴于此,为了确保SuperMap iObjects Java
组件能够正常运行并发挥其强大的 GIS 功能,就需要在开发环境的机器上进行专门的配置,以搭建起 iObjects Java 组件的依赖环境。只有这样,才能够为后续的开发工作提供稳定、可靠的基础支持。操作系统 配置环境变量 Windows 在系统环境变量 PATH 中添加 SuperMap iObjects Java 安装目录\Bin 路径 Linux export LD_LIBRARY_PATH=SuperMap iObjects Java 安装目录\Binexport PATH=$LD_LIBRARY_PATH:$PATH
三、核心技术
SuperMap iObjects Java
组件提供了 DataImport 数据导入类,其可支持通过设置 ImportSettingFileGDBVector 参数来导入 GDB 数据,这一功能为相关数据处理工作提供了一种较为实用且有效的操作方式,能够在一定程度上满足用户对于 GDB 数据导入的需求,并为数据处理流程的推进提供了相应的技术手段与支持。
鉴于 DataImport 具备支持多种数据导入的特性,为确保各类数据导入时的准确性与完整性,DataImport 内部采用了串行的导入模式。然而,在面临需导入的数据量颇为庞大、数据文件数量众多的情形时,此导入过程通常会耗费大量的时间,产生较高的时间成本开销。
当面临所需导入的 GDB 数据规模极为庞大,且数据文件数量极为繁多的状况时,常规的串行导入方式效率堪忧,往往迫切需要借助多线程并行的手段来优化导入性能。但由于 SuperMap iObjects Java
组件底层出于安全性方面的考量而进行了特定设计,多线程并行方式在提升导入性能方面的效果微乎其微,难以达成显著的优化目标。故而,在此情形下,更为推荐采用多进程的方式来达成导入性能的优化目的。
Java 语言自身提供了诸如 ProcessBuilder 和 Runtime 等多种实现多进程调用的途径,这些方式均能够有效地创建多进程效果。而 SuperMap iObjects Java
组件更是充分考虑到用户的使用便利性与友好体验,别具匠心地额外封装了 MultiProcessManager 一个专门用于开启多进程的类。如此一来,那些有相关需求的用户便能够极为顺畅地开启多进程编码之旅,轻松上手,快速掌握,从而高效地运用多进程技术来处理 GDB 数据的导入工作,有效提升工作效率与数据处理的时效性。
四、业务实现
4.1. 导入 GDB 数据
-
核心接口
/** * ESRI Geodatabase 交换文件导入的参数设置类。 */ ImportSettingFileGDBVector(); /** * 设置需要导入的数据路径信息。 * @param path 需要导入的数据路径 */ ImportSettingFileGDBVector.setSourceFilePath(String path); /** * 设置导入文件的原始字符集类型。 * @param charset 导入文件的原始字符集类型 */ ImportSettingFileGDBVector.setSourceFileCharset(Charset charset); /** * 设置需要导入的数据源对象。 * @param datasource 需要导入的数据源对象 */ ImportSettingFileGDBVector.setTargetDatasource(Datasource datasource); /** * 设置目标数据集的文件名称。 * @param targetDatasetName 目标数据集的文件名称 */ ImportSettingFileGDBVector.setTargetDatasetName(String targetDatasetName); /** * 设置要生成的数据集的编码类型。 * @param type 要生成的数据集的编码类型 */ ImportSettingFileGDBVector.setTargetEncodeType(EncodeType type); /** * 设置当同名数据集存在时导入的模式。 * @param importMode 当同名数据集存在时导入的模式: * ImportMode.APPEND - 如存在名称冲突,则进行数据集的追加 * ImportMode.NONE - 如存在名称冲突,则自动修改目标对象的名称后进行导入 * ImportMode.OVERWRITE - 如存在名称冲突,则进行强制覆盖 */ ImportSettingFileGDBVector.setImportMode(ImportMode importMode); /** * 设置导入 Geodatabase 矢量格式数据时是否忽略属性信息。 * @param value 导入 Geodatabase 矢量格式数据时是否忽略属性信息 */ ImportSettingFileGDBVector.setAttributeIgnored(boolean value); /** * 设置需要导入的图层名称,没有设置的时候默认全部图层导入,设置后只导入设置的图层 设置 layerNames 为空表示清空之前的设置 * @param layerNames 需要导入的图层名称 */ ImportSettingFileGDBVector.setImportLayerName(String[] layerNames); /** * 导入数据类,通过该类可以将外部数据(文件型)导入到 SuperMap 的格式。 */ DataImport(); /** * 执行导入数据集的操作。 */ DataImport.run();
-
示例代码
// 设置导入 GDB 的参数 ImportSettingFileGDBVector importSettingFileGDBVector = new ImportSettingFileGDBVector(); importSettingFileGDBVector.setSourceFilePath(gdbFolderPath); importSettingFileGDBVector.setSourceFileCharset(Charset.UTF8); importSettingFileGDBVector.setTargetDatasource(datasource); importSettingFileGDBVector.setTargetDatasetName(datasetVectorName); importSettingFileGDBVector.setTargetEncodeType(EncodeType.NONE); importSettingFileGDBVector.setImportMode(ImportMode.APPEND); importSettingFileGDBVector.setAttributeIgnored(false); importSettingFileGDBVector.setImportLayerName(new String[]{datasetVectorName}); // 执行 GDB 数据导入 DataImport dataImport = new DataImport(); dataImport.getImportSettings().add(importSettingFileGDBVector); dataImport.run();
4.2. 启用多进程
-
核心接口
/** * 多进程管理类。 * @param object 需要在子进程执行的类对象 * @param count 需要开启的最大子进程数 */ MultiProcessManager(Object object, int count); /** * 添加子进程启动传入参数的监听事件。 * @param processBuildingListener 子进程启动传入参数的监听事件 */ MultiProcessManager.addProcessBuildingListener(ProcessBuildingListener processBuildingListener); /** * 启动子进程运行。 */ MultiProcessManager.Run();
-
示例代码
// 构建多进程管理对象 MultiProcessManager multiProcessManager = new MultiProcessManager(new ImportGDB(), nThreads); // 通过子进程构建监听事件给子进程传参 multiProcessManager.addProcessBuildingListener(new ProcessBuildingListener() { @Override public void ProcessBuilding(ProcessBuildEvent event) { if (!gdbFilesStack.empty()) { ArrayList<String> args = new ArrayList<>(); args.add(gdbFilesStack.pop()); args.add(server); args.add(databaseName); args.add(username); args.add(password); args.add(gdbLayerName); event.setActive(true); event.setArgs(args); } } }); // 启动多进程 multiProcessManager.Run();
五、总结
依照上述教程,借助 SuperMap iObjects Java
组件开展多进程导入 GDB 数据的操作之后,成功达成了如附图所示的多进程导入多份 GDB 数据的流程与成效。这一显著成果的展现,充分表明在历经严谨且细致的开发进程后,顺利实现了多份 GDB 数据的多进程高效导入。此方式极大幅度地削减了数据导入环节所耗费的时间成本,有力地为后续的数据处理与深度分析工作筑牢了稳固的根基,确保后续工作得以更为顺畅、高效地推进开展。
其具体的展现形式恰如下方图示所示,精准且详尽地呈现出多进程导入多份 GDB 数据所产生的实际效能与状况:
-
开启多进程导入多份 GDB
-
多进程导入多份 GDB 完成
最后,本教程还精心准备了依照上述教程开展开发工作所对应的 SuperMap iObjects Java 组件多进程导入多份 GDB 数据示例代码。您能够直接将该示例代码下载至本地,随后运用 IDEA 软件将其打开,进而展开编译、调试等操作,并展开深入的学习与探究。此示例代码犹如一座桥梁,为您搭建起了一个可触可感的实践场景,能够极大程度地助力您更为透彻地领悟与把控基于 SuperMap iObjects Java 组件多进程的开发流程与要点。