FDO Provider for SuperMap 的设计与实现

周旭,梁军,石伟伟

(1. 中国科学院地理科学与资源研究所,北京 100101;2. 中国科学院研究生院,北京 100039;3. 北京超图软件股份有限公司,北京 100085)

论文来源:计算机工程

摘要:针对在 CAD 环境中无法直接访问和编辑 GIS 系统中空间数据的问题,研究开源要素数据对象(FDO)空间数据访问引擎中的数据提供者(PDO Provider)的 4 个关键部分的实现技术:数据连接,数据模型之间的映射,坐标系统的识别以及数据的读写访问操作。设计并实现 FDO Provider for S…

关键词: 要素数据对象;空间数据引擎;超图;计算机辅助设计

1 概述

要素数据对象(Feature Data Objects, FDO)空间数据访问引擎作为开源地理空间基金会下的一个开源项目[1],已经逐步得到了越来越多的空间信息软件的支持(支持 FDO 的软件产品列表详见文献[2])。

FDO 包含应用程序接口 FDO API 和用于支持各种具体空间数据源的数据提供者(FDO Provider)2 个部分[1,3],其基本思想是通过一套统一和开放的接口 API 以一种公共的方式来获取、查询、编辑、分析和存储隐藏在后台的各种地理空间数据[3],而通过不同的数据提供者来实现针对这些不同数据格式的具体访问操作,从而使应用程序能够通过一套 FDO API 直接访问各种空间数据而不受具体存储格式的束缚。其中,FDO Provider 是 FDO API 的一个具体实现,实际上就是一个用于连接和处理特定 GIS 空间数据源的动态链接库[3]。例如,本文实现的 FDO Provider for SuperMap,就使应用程序可以通过开源的 FDO API 直接处理 SuperMap 格式的 GIS数据。

2 FDO API 接口

FDO API 为处理存储在数据库和数据文件中的地理数据提供了一个公共的抽象层。从某种意义上说,FDO API 就是这个抽象层的接口规范[1]。因此,要使应用程序可以通过 FDO API 来连接、识别、读取、编辑(修改、插入、删除)SuperMap格式的 GIS 数据并基于正确的地理坐标位置进行显示,就必须在 FDO 引擎的 SuperMap Provider 中正确实现对应的 FDO API 接口。

由于本文篇幅有限,仅讨论与以上基本的空间数据访问功能相对应的 FDO API 接口类,如表 1 所示。FDO API 类的具体函数接口可参见 FDO 源代码(http://fdo.osgeo.org)。

3 FDO Provider for SuperMap 的设计与实现

FDO 引擎的 SuperMap 数据提供者基于 SuperMap 共相式 GIS 内核(Universal GIS Core, UGC)底层开发库进行开发实现。UGC 作为超图公司新一代基础类库,全部采用标准C++开发,具有跨平台和高性能的特点。FDO 本身也支持Windows 和 Linux 操作系统[4],使用 UGC 来实现该 Provider也能保证其在 FDO 支持的各种操作系统上正确运行。

本文将论述如何在 FDO Provider中设计和实现相关FDO API 接口,使应用程序可以通过开源 FDO 引擎来完成对SuperMap 的 SDB 文件和 SDX+空间数据库的基本访问和处理功能。

3.1 数据连接的实现

由表 1 可知,实现 FDO 对 SuperMap 数据的连接需要在Provider 中利用 UGC 实现 2 个 FDO API:FDOIConnection和 FDOIConnectionInfo。具体实现过程中主要存在 2 个问题:

(1)由于文件和数据库的连接属性的差异,连接 SDB 文件只需要一个正确的文件全路径名,而连接 SDX+数据库就需要数据库引擎类型、服务器地址、数据库名、用户名、密码等多个连接属性[5]。因此,必须考虑如何在一个 Provider中以统一的方式来获取和设置这两者的连接属性。

(2)由于文件型数据源的独占性,上层软件通过 FDO 打开多个到同一 SDB 文件的连接时,将只能在第一个连接中对数据进行编辑,并且关闭其中一个连接会导致其他连接均不可用。通过在 Provider 中利用 Singleton 模式建立连接池的技术可以有效解决这一问题,同时还可以提高对数据库访问的性能。

3.1.1 统一 SDB 文件和 SDX+数据库的连接属性设置

在 FDO API中与连接属性设置相关的具体函数接口主要由 2 个:FDOIConnectionInfo:: GetConnectionProperties()和FDOIConnection::Set ConnectionString()(省略返回值和参数)。前者负责告诉 FDO 连接 SuperMap 数据源需要哪几个连接属性,后者设置具体连接参数。

为了兼容 SDB 文件和 SDX+数据库的连接属性设置,采取只要一个 FDO 连接字符串属性,然后在 Provider 内部对该字符串进行解析的方法。即在第 1 个接口中告诉 FDO 本Provider 只需要一个连接属性,在第 2 个接口中再对这一个字符串属性进行解析。这就需要对连接字符串的格式进行规定,比如,连接 C 盘根目录下的 world.sdb 数据源,连接字符串为 type=sdb;database=c:\\world.sdb;连接一个后台为 SQL Server 的 SDX+ 空间数据库,字符串格式为 type=sql; server=192.168.1.76; database=test;user=sa;password=123。 3.1.2 连接池设计

连接池的设计主要由 2 个目的:(1)避免多次打开同一SDB 文件数据源引起的并发问题。(2)提高数据库型的 SDX+ 数据源的连接使用效率,将已经打开过的 SDX+数据源保存在连接池中,如果用户需要使用之前已经打开过的数据源时,直接在连接池中取出返回即可,从而避免网络传输等带来的性能损耗。

更多内容请查看pdf