何淼,李旺民,丁建勋
(珠海市测绘院,广东 珠海 519000)
历史测绘地理信息数据由于多方面原因,采用了异构的地理信息生产环境,存在多语义性、多时空性和多尺度、获取手段多源性、存储格式多样性、空间基准不统一等问题,导致不同系统之间无法进行有效的互操作,这不仅加大了数据生产成本,也给数据共享带来了困难[1]。目前,地理矢量数据要素解码主流的做法是依赖AutoCAD、FME、ArcGIS等,均存在过度依赖第三方平台、兼容性差、低可扩展性、特殊要素解码不完备等缺陷。有必要研究一种不依赖第三方平台的地理信息图件与数据解码方法,以满足多源数据集成的数据访问、共享与格式转换需求。
C++语言将问题和事物抽象成对象,而很多对象都具有共性,它们的动作是相似的,只是对象的类型不同而已。C++的泛型编程,可以将“类型”参数化,模板是C++支持参数化多态的工具,采用模板技术,为类或者函数声明一种通用模式,可使代码更具通用性。各类矢量数据可视为一个对象类型,矢量数据要素由若干实体构成,每种实体又由“点、线、面、注记”等子对象构成,因此,采用C++语言的泛型编程思想开发地理矢量数据的要素解码方法,可有效提高代码的通用性与可维护性。
因此,本方法的总体技术路线是基于C++泛型编程,研究基于Teigha的地理数据要素解码算法,实现不依赖AutoCAD平台兼容CAD中数十种不同实体类型的要素解码;研究基于GDAL/OGR的地理数据要素解码算法,不依赖第三方平台,实现对矢量数据的要素解码与格式转换。从而构建多源地理矢量数据要素解码服务,支撑多源数据集成的数据访问、共享与格式转换需求与应用。地理矢量数据要素解码技术路线如图1所示。
图1 地理矢量数据要素解码技术路线
AutoCAD在测绘领域运用广泛,很多成果都是CAD格式。CAD数据的转换与解析,常用的解决方法有两个:一是使用FME,FME是万能的空间数据转换器,支持的格式广泛,用它可以轻松将CAD转换为其他格式,再进行下一步操作;二是使用CAD.net二次开发组件,较强大的方式是Lisp、AutoCAD二次开发,其学习资源丰富,开发难度低,但不能脱离AutoCAD环境,可以实现读取和编辑,但对块参照等类型的实体支持不够。上述方法都有一个共同缺憾,就是不能脱离CAD或ArcGIS环境。
ODA即Open Design Alliance,是一个面向会员的非营利性技术联盟,致力于促进开放的、工业标准的CAD数据和历史CAD数据的格式交换,使用面向对象的API实现不依赖第三方环境的CAD数据的读写操作、绘制渲染和格式转换等,与AutoCAD的兼容性非常好[2],ODA开发的用于图形应用程序的核心平台TeighaTM,Teigha支持dwg、dxf、dgn、stl、pdf等多种格式之间的数据访问与交换。支持Windows、Mac、Unix、Linux等多个平台。ODA会员可以用C++,.NET和ActiveX接口开发自己的应用程序。
Teigha框架中,一个CAD文件,其实是一个记录图形和非图形对象的数据库。在该数据库中,包括系统符号表和字典表。其中字典表(Dictionary)是存储各种CAD对象的容器,可理解为一个映射表,用户的自定义数据存放在字典表中,可以添加新的字典并且往里面添加对象,每个CAD数据库文件中有一个默认的字典(Object Dictionary),是所有数据库字典的根字典。系统符号表共有9张(如表1所示),只能向表里添加内容,但不能改变表的数量。对象如放入到正确的容器中,则属于CAD数据库文件的有效对象,否则就是无效对象(non-resident)。ODA_Database结构如图2所示。
ODA系统符号表 表1
图2 ODA_Database结构
CAD要素解码算法流程:
(1)初始化Teigha库;调用odInitialize(OdDbSystemServices* pSystemServices)函数注册Teigha支持的所有类,LoadDRXModules()函数载入需使用的模块。常用模块包括:对象捕捉模块(GripPoints)、附加命令模块(DbCommands)、核心动态块支持模块(TD_DynBlocks)、格式导出模块(TD_Tf)等等。
(2)打开DWG文件;调用ExHostAppServices模版类的readFile函数打开DWG文件,返回数据库对象智能指针OdDbDatabasePtr。
(3)读取Database中对象;ExProtocolExtension类是针对所有对象解码与操作的协议扩展类,该类初始化后,可采用迭代器对每种对象进行解码与操作。
(4)遍历对象进行解码;构建OdDbObjectIteratorPtr类迭代器指针,获取每个对象的objectId,调用openObject函数返回实体对象指针OdDbEntityPtr或其他对象指针OdDbObjectPtr,分别将其转换为OdSmartPtr
(5)执行转换与处理后,保存数据,调用OdDbDatabasePtr类的release函数关闭数据库,进入下一流程。
从而,通过C++泛型编程,实现不依赖AutoCAD平台兼容CAD中数十种不同实体类型的要素解码。
GDAL(Geospatial Data Abstraction Library)利用抽象数据模型来表达所支持的各种文件格式,是在X/MIT许可协议下的开源栅格空间数据转换库,提供对asc、tiff、img、dem等多种栅格数据的支持。OGR是GDAL项目的一个分支,功能与GDAL类似,它提供对Shapefiles、PostGIS(需要libpq库)、Oracle Spatial(需要OCI库)、Mapinfo(mid/mif、TAB)、Dxf等多种矢量数据的支持[3,4]。GDAL/OGR除默认编译的库之外,可引入第三方库增强对格式的支持,如添加FileGDB API库则可实现对ESRI FileGDB数据的支持。
Esri的ArcGIS系列、Erdas、Google Earth和跨平台的GRASS GIS、Quantunm GIS系统等很多著名的GIS类产品都使用了GDAL/OGR库。利用GDAL/OGR库,可以使地理空间数据管理系统提供对矢量和栅格文件数据的支持[3,5,6]。本文仅讨论基于OGR的矢量数据解码。
基于GDAL/OGR的地理矢量数据要素解码与转换算法流程(图3):
图3 基于GDAL/OGR的地理数据要素解码与转换
(1)根据文件类型自动选择数据驱动;
(2)由数据驱动打开数据源(Dataset);
(3)遍历Dataset中实体要素;
(4)读取要素数据信息;
(5)判断要素类型;
(6)根据要素类型调用模板函数解析要素信息;
(7)根据需求对信息进行转换与处理;
(8)进入步骤(3)。
(9)关闭数据源(Dataset),进入下一流程。
进而,基于C++泛型编程,不依赖第三方平台,实现对矢量数据的要素解码与转换。
本文提出的多源地理矢量数据要素解码方法,具有通用性、可扩展性、可维护性强的特点,有效解决了地理数据要素解码过度依赖第三方平台带来的问题,实现了不依赖第三方平台的地理信息图件与数据解码与转换。可为多源异构数据的数据转换、数据融合与共享应用提供思路。