1.可扩展数据源驱动框架
GIS软件的应用通常需要面向不同的数据格式及数据模型,通用的数据访问驱动往往不能满足使用中的自定义数据模型的需要。因此,GIS组件或者软件库的设计中一般需要考虑提供多种数据源的支持以实现软件框架的扩展性。现有优秀的开源和商业GIS组件及GIS库大多提供了良好的扩展框架。
可扩展数据驱动框架一般基于提供者模式(Provider)进行设计,使用抽象的数据访问接口支持第三方的数据模型。与Provider设计模式类似的有适配器模式(Adapter)和策略模式(Strategy)。Adapter强调的是对于不同类的抽象接口的兼容和交互,实现不同的接口之间的兼容转换。Strategy是对不同实现算法上的封装,可以实现算法的独立修改,同时对使用者保持其相对的透明性。Provider使用常常使用在具有抽象出的固定方法接口,同时可以实现包括核心的方法与功能处理逻辑的解决方案的替换与修改。比如,对于不同的数据源常常具有固定的打开、关闭及迭代访问数据等接口,但是由于数据源的差异处理的逻辑往往不尽相同,一般会有不同的数据源提供方基于固定的接口实现对应数据源不同的操作及处理逻辑。Provider模式将方法接口与实现上的业务逻辑层(BLL,Business Logic Layer)及数据访问层(DAL,Data Abstraction Layer)结合,而方法接口的实现与接口本身相对独立。通常,Provider模式会结合抽象模板使用,不同Provider的抽象基类ProviderBase定义诸多Provider需要加以实现的统一的接口。
在GIS组件和软件库的设计中,通常首先对数据处理中操作数据模型加以抽象,比如使用Data Provider抽象表示对数据源的访问相关的操作,使用Data Source抽象表示单个数据源访问接口(存储GIS数据的单个或者多个文件、空间数据库以及Web Service等数据的访问接口),使用Layer(Table)抽象表示具有相同的模式或者具有相同属性的要素集合,使用Feature抽象表示空间对象的单个要素(集合对象及属性集合),Geometry抽象表示空间对象的集合模型(包含几何操作和空间参考信息),使用Spatial Reference抽象表示投影、椭球等空间参考信息定义。
大多数开源GIS组件和软件库都采用了可扩展的GIS数据源驱动框架加以设计。比如,通用开源矢量模型库OGR、开源.NET地图组件SharpMap和开源桌面GIS QGIS。通用开源矢量模型及转换库OGR对多种数据格式的支持基于数据驱动的扩展框架,通过对不同数据驱动支持驱动OGRSFDriver、OGRDataSource相关类的实现增加多种数据格式的支持。开源.NET地图组件SharpMap通过SharpMap.Data.Providers的IProvider接口中对数据源操作的方法的实现提供了对包括Ogr、ShapeFile及PostGIS等诸多数据源格式的支持。对于开源桌面GIS软件QGIS,Data Provider作为一个特殊的插件加以实现,用于提供多种数据源或者针对单个数据源不同的访问能力。QGIS中中通过对QgsDataProvider派生的QgsVectorDataProvider和QgsRasterDataProvider子类的实现,使得我们可以增加QGIS对多种数据源格式的支持。图1-1中描述了QgsVectorDataProvider的继承关系。所有的Data Provider由QgsProviderRegistry单例对象加以管理,对符合条件的Provider对象提供元数据信息QgsProviderMetadata,当需要使用特定的Provider对数据加以访问和操作的时候,通过调用classFactory方法进行创建。
2.MapXtreme数据源驱动框架 - 模型与接口
在商业GIS软件中,MapXtreme Java已经提供了自定义数据源的机制用于支持异构的数据源驱动,以方便MapXtreme Java获取这些异构数据源中的信息。PBBI的MapXtreme 2008 v7.0产品同样引入了可扩展数据驱动框架的设计,除了提供常用空间数据类型和使用ADO.NET访问非空间数据的能力外,还可以通过扩展满足对开发中多种数据源格式支持的需要,并实现MapXtreme核心数据访问引擎同样的功能[5]。比如,我们可以通过扩展框架实现的数据驱动提供与核心数据引擎同样的打开,读取数据源操作,元数据检索及对数据源修改等功能。MapXtreme 2008使用TableInfo类支持各种数据源,并通过TableInfoAdoNet类支持Microsoft的ADO.NET,用于处理无法直接从TableInfo数据源访问的数据。因此,通过可扩展的数据驱动框架对数据源的扩展,我们可以直接利用MapXtreme的核心访问引擎,而无需再间接通过ADO.NET对数据访问。
在MapXtreme 2008中,驱动框架使用的数据模型被抽象为几个重要的类,用以实现对数据访问和操作的支持。
1) Data Provider:Data Provider是应用程序和数据源之间访问的接口,应用程序中通过调用Data Provider建立驱动和数据源之间的联系。实现了MapXtreme在数据源之间的各种操作(比如显示、查询、编辑和分析)的交互。MapInfo组件模型中,对于数据驱动存在IDataProvider的接口,实现了两种方法OpenDataSource和OpenTable,分别用于操作存在多数据集的Data Source对象或者仅存在单数据集的Table对象。
2) Data Source:Data Source表示数据源,通常对应于DBMS,Web Service或者其他的数据引擎或者API,这些对象负责存储数据并支持对数据的访问,比如存储数据的元数据信息,以及对相关数据的查询和操作信息。对于数据源一般存在数据源信息的定义和描述,使用Data Source Definition加以定义。一般情况下,我们需要实现数据源驱动,但是一些简单数据模型可以直接映射为Table的概念,直接对应模式相同的要素集,比如MapInfo的表文件和ESRI的Shape文件。
3) Table:Table表示要素集合,要素具有同样的Schema或者属性集合。Table不需要一定具有geometry属性,但是一般来说Data Provider的一些表是具有空间列的。MapXtreme将geometry数据作为Table的属性列来处理的,就类似与普通的数据类型字符串。表的元数据描述了table中包含的元数据信息,并提供了数据访问,查询和编辑的功能。但需要注意的是,每一个要素需要一个data provider中唯一标识的ID作为key,其用在MapXtreme中实现选择,结果集以及编辑操作。
4) Cursor:Cursor用于实现要素集的遍历,通过调用Table的search方法,MapXtreme可以获取数据源中某个要素集中的单个要素。表返回的Cursor使MapXtreme可以根据约束条件,搜索指定的要素。由于Cursor的位置会不断变化,因此,Cursor仅仅可以访问当前指向的数据对象,如果Cursor发生变化,原先的对象就不能进行访问了,特别是对于FeatureGeometry的对象来说,需要设计内存重用的策略。FeatureAccessor是一种特殊类型的Cursor,用于实现通过关键字访问Feature的逻辑。
MapXtreme 2008抽象的模型与通用的模型框架如图2-1所示,通过对MapInfo.Data.Provider命名空间下提供的接口的支持,可以实现数据源的扩展。主要的数据接口包括:IDataProvider,定义了实现应用程序和数据源之间访问逻辑需要的(打开、关闭和管理数据源)接口;IDataSource,定义数据源的接口,实现对数据表访问实体;IDataSourceDefinition,定义了IDataSource实例化所必需的属性;ITable,定义表的接口,是读取、查询和在地图中显示的基本信息的容器;ITableDefinition,定义对特定数据源的ITable进行实例化所必需的属性;ITableMetadata,定义了提供表属性和支持功能的信息;IFeature,定义提供图元的属性和方法;ICursor,定义用于重复查询返回的图元列表方法和操作。
通过这些接口的实现MapXtreme 2008 可扩展数据源驱动可以支持打开表、读取表内容及关联的元数据集、使用多个方法搜索表内容以及通过插入、更新和删除操作修改表内容。
3.BeyonDB 数据库驱动模型的支持
BeyonDB数据库是面向国家空间信息基础设施建设的重大需求所研发的具有自主知识产权、企业级、跨平台、分布式、高安全的地理空间数据库管理系统平台软件。在空间数据管理方面,BeyonDB遵循ISO/IEC 13249-3: SQL/MM Part3: Spatial的设计标准,设计了具备可扩展能力的、能够综合地理空间实体及其处理方法的新型地理实体空间数据模型,构建了基于UMD-MA(按需分级动态装配)机制的模型与模块的动态可伸缩结构体系,实现了内置的抽象空间数据类型ST_Geometry、ST_Raster及相应的空间操作算子和空间分析函数。在数据库安全,BeyonDB实现了可配置内核级审计子系统,支持多策略的访问控制子系统(包括自主访问控制、强制访问控制、空间访问控制等),基于密码设备的强身份认证子系统和高效数据加密存储中间件等四项安全功能,安全性能已达到国标第三级强度。同时,BeyonDB为数据库管理者提供了空间属性一体化、矢栅一体化的集成管理,能够在统一的数据库集成管理平台上进行空间数据、属性数据的一体化管理,对矢量数据、栅格数据进行一体化空间展现与处理。
通过使用BeyonDB .NET Provider和OpenAPI接口,我们基于MapXtreme 2008的可扩展驱动模型实现了BeyonDB的访问支持。通过扩展BeyonDB相关定义实现了IDataProvider的单例接口。通过读取系统元数据表st_geometry_columns和st_spatial_reference_systems获取了IDataSourceDefinition和ITableMetaData、ITableDefinition接口。由于空间数据库有多空间要素表组成,这通过IDataSource接口加以实现。另外,通过对ICursor和IFeatureAccessor的访问获取BeyonDB数据要素的信息。通过实现可选接口ITableModifyProcessor增加了数据要素修改的能力。通过图3-1中相关类的定义与实现,实现了MapXtreme使用核心引擎直接访问和操作BeyonDB数据源的能力。同时,为了让 MapXtreme 的会话初始化期间使用PersistenceProviderCollection.AddFromFolder 方法将BeyonDB Data Provider作为内置数据源驱动加载,实现对BeyonDB数据的原生访问能力。我们基于AbstractMxpPersistenceProvider实现了SupportsDataProvider SupportsEntityName SupportsSchemaNamespace方法供MapXtreme识别BeyonDB驱动识别为内置数据源驱动。
MapXtreme的内置BeyonDB空间数据库驱动支持BeyonDB空间数据的高效检索与修改,数据库中数据的组织和MapXtreme中对数据的支持如图3-2和3-3所示,对应的同时可以将原有的部分基于MapXtreme的计算逻辑使用空间数据库服务端空间分析和处理的能力替换。增加了使用MapXtreme组件在行业开发中的与空间数据库的兼容性和扩展性。
4.结束语
MapXtreme 2008的可扩展数据驱动模型提供了多种数据的扩展支持,通过对BeyonDB数据库的MapXtreme的驱动模型的接口类实现,为MapXtreme提供了基于内嵌式空间数据库高效可扩展的开发、访问、管理和操作数据的能力,也为基于MapXtreme和空间数据库系统进行应用开发提供了更好的扩展性与适用性。(作者:颜勋 陈荣国 中国科学院地理科学与资源研究所)
{{item.content}}