何淼,李旺民,丁建勛
(珠海市測(cè)繪院,廣東 珠海 519000)
歷史測(cè)繪地理信息數(shù)據(jù)由于多方面原因,采用了異構(gòu)的地理信息生產(chǎn)環(huán)境,存在多語(yǔ)義性、多時(shí)空性和多尺度、獲取手段多源性、存儲(chǔ)格式多樣性、空間基準(zhǔn)不統(tǒng)一等問(wèn)題,導(dǎo)致不同系統(tǒng)之間無(wú)法進(jìn)行有效的互操作,這不僅加大了數(shù)據(jù)生產(chǎn)成本,也給數(shù)據(jù)共享帶來(lái)了困難[1]。目前,地理矢量數(shù)據(jù)要素解碼主流的做法是依賴(lài)AutoCAD、FME、ArcGIS等,均存在過(guò)度依賴(lài)第三方平臺(tái)、兼容性差、低可擴(kuò)展性、特殊要素解碼不完備等缺陷。有必要研究一種不依賴(lài)第三方平臺(tái)的地理信息圖件與數(shù)據(jù)解碼方法,以滿(mǎn)足多源數(shù)據(jù)集成的數(shù)據(jù)訪(fǎng)問(wèn)、共享與格式轉(zhuǎn)換需求。
C++語(yǔ)言將問(wèn)題和事物抽象成對(duì)象,而很多對(duì)象都具有共性,它們的動(dòng)作是相似的,只是對(duì)象的類(lèi)型不同而已。C++的泛型編程,可以將“類(lèi)型”參數(shù)化,模板是C++支持參數(shù)化多態(tài)的工具,采用模板技術(shù),為類(lèi)或者函數(shù)聲明一種通用模式,可使代碼更具通用性。各類(lèi)矢量數(shù)據(jù)可視為一個(gè)對(duì)象類(lèi)型,矢量數(shù)據(jù)要素由若干實(shí)體構(gòu)成,每種實(shí)體又由“點(diǎn)、線(xiàn)、面、注記”等子對(duì)象構(gòu)成,因此,采用C++語(yǔ)言的泛型編程思想開(kāi)發(fā)地理矢量數(shù)據(jù)的要素解碼方法,可有效提高代碼的通用性與可維護(hù)性。
因此,本方法的總體技術(shù)路線(xiàn)是基于C++泛型編程,研究基于Teigha的地理數(shù)據(jù)要素解碼算法,實(shí)現(xiàn)不依賴(lài)AutoCAD平臺(tái)兼容CAD中數(shù)十種不同實(shí)體類(lèi)型的要素解碼;研究基于GDAL/OGR的地理數(shù)據(jù)要素解碼算法,不依賴(lài)第三方平臺(tái),實(shí)現(xiàn)對(duì)矢量數(shù)據(jù)的要素解碼與格式轉(zhuǎn)換。從而構(gòu)建多源地理矢量數(shù)據(jù)要素解碼服務(wù),支撐多源數(shù)據(jù)集成的數(shù)據(jù)訪(fǎng)問(wèn)、共享與格式轉(zhuǎn)換需求與應(yīng)用。地理矢量數(shù)據(jù)要素解碼技術(shù)路線(xiàn)如圖1所示。
圖1 地理矢量數(shù)據(jù)要素解碼技術(shù)路線(xiàn)
AutoCAD在測(cè)繪領(lǐng)域運(yùn)用廣泛,很多成果都是CAD格式。CAD數(shù)據(jù)的轉(zhuǎn)換與解析,常用的解決方法有兩個(gè):一是使用FME,F(xiàn)ME是萬(wàn)能的空間數(shù)據(jù)轉(zhuǎn)換器,支持的格式廣泛,用它可以輕松將CAD轉(zhuǎn)換為其他格式,再進(jìn)行下一步操作;二是使用CAD.net二次開(kāi)發(fā)組件,較強(qiáng)大的方式是Lisp、AutoCAD二次開(kāi)發(fā),其學(xué)習(xí)資源豐富,開(kāi)發(fā)難度低,但不能脫離AutoCAD環(huán)境,可以實(shí)現(xiàn)讀取和編輯,但對(duì)塊參照等類(lèi)型的實(shí)體支持不夠。上述方法都有一個(gè)共同缺憾,就是不能脫離CAD或ArcGIS環(huán)境。
ODA即Open Design Alliance,是一個(gè)面向會(huì)員的非營(yíng)利性技術(shù)聯(lián)盟,致力于促進(jìn)開(kāi)放的、工業(yè)標(biāo)準(zhǔn)的CAD數(shù)據(jù)和歷史CAD數(shù)據(jù)的格式交換,使用面向?qū)ο蟮腁PI實(shí)現(xiàn)不依賴(lài)第三方環(huán)境的CAD數(shù)據(jù)的讀寫(xiě)操作、繪制渲染和格式轉(zhuǎn)換等,與AutoCAD的兼容性非常好[2],ODA開(kāi)發(fā)的用于圖形應(yīng)用程序的核心平臺(tái)TeighaTM,Teigha支持dwg、dxf、dgn、stl、pdf等多種格式之間的數(shù)據(jù)訪(fǎng)問(wèn)與交換。支持Windows、Mac、Unix、Linux等多個(gè)平臺(tái)。ODA會(huì)員可以用C++,.NET和ActiveX接口開(kāi)發(fā)自己的應(yīng)用程序。
Teigha框架中,一個(gè)CAD文件,其實(shí)是一個(gè)記錄圖形和非圖形對(duì)象的數(shù)據(jù)庫(kù)。在該數(shù)據(jù)庫(kù)中,包括系統(tǒng)符號(hào)表和字典表。其中字典表(Dictionary)是存儲(chǔ)各種CAD對(duì)象的容器,可理解為一個(gè)映射表,用戶(hù)的自定義數(shù)據(jù)存放在字典表中,可以添加新的字典并且往里面添加對(duì)象,每個(gè)CAD數(shù)據(jù)庫(kù)文件中有一個(gè)默認(rèn)的字典(Object Dictionary),是所有數(shù)據(jù)庫(kù)字典的根字典。系統(tǒng)符號(hào)表共有9張(如表1所示),只能向表里添加內(nèi)容,但不能改變表的數(shù)量。對(duì)象如放入到正確的容器中,則屬于CAD數(shù)據(jù)庫(kù)文件的有效對(duì)象,否則就是無(wú)效對(duì)象(non-resident)。ODA_Database結(jié)構(gòu)如圖2所示。
ODA系統(tǒng)符號(hào)表 表1
圖2 ODA_Database結(jié)構(gòu)
CAD要素解碼算法流程:
(1)初始化Teigha庫(kù);調(diào)用odInitialize(OdDbSystemServices* pSystemServices)函數(shù)注冊(cè)Teigha支持的所有類(lèi),LoadDRXModules()函數(shù)載入需使用的模塊。常用模塊包括:對(duì)象捕捉模塊(GripPoints)、附加命令模塊(DbCommands)、核心動(dòng)態(tài)塊支持模塊(TD_DynBlocks)、格式導(dǎo)出模塊(TD_Tf)等等。
(2)打開(kāi)DWG文件;調(diào)用ExHostAppServices模版類(lèi)的readFile函數(shù)打開(kāi)DWG文件,返回?cái)?shù)據(jù)庫(kù)對(duì)象智能指針OdDbDatabasePtr。
(3)讀取Database中對(duì)象;ExProtocolExtension類(lèi)是針對(duì)所有對(duì)象解碼與操作的協(xié)議擴(kuò)展類(lèi),該類(lèi)初始化后,可采用迭代器對(duì)每種對(duì)象進(jìn)行解碼與操作。
(4)遍歷對(duì)象進(jìn)行解碼;構(gòu)建OdDbObjectIteratorPtr類(lèi)迭代器指針,獲取每個(gè)對(duì)象的objectId,調(diào)用openObject函數(shù)返回實(shí)體對(duì)象指針OdDbEntityPtr或其他對(duì)象指針OdDbObjectPtr,分別將其轉(zhuǎn)換為OdSmartPtr
(5)執(zhí)行轉(zhuǎn)換與處理后,保存數(shù)據(jù),調(diào)用OdDbDatabasePtr類(lèi)的release函數(shù)關(guān)閉數(shù)據(jù)庫(kù),進(jìn)入下一流程。
從而,通過(guò)C++泛型編程,實(shí)現(xiàn)不依賴(lài)AutoCAD平臺(tái)兼容CAD中數(shù)十種不同實(shí)體類(lèi)型的要素解碼。
GDAL(Geospatial Data Abstraction Library)利用抽象數(shù)據(jù)模型來(lái)表達(dá)所支持的各種文件格式,是在X/MIT許可協(xié)議下的開(kāi)源柵格空間數(shù)據(jù)轉(zhuǎn)換庫(kù),提供對(duì)asc、tiff、img、dem等多種柵格數(shù)據(jù)的支持。OGR是GDAL項(xiàng)目的一個(gè)分支,功能與GDAL類(lèi)似,它提供對(duì)Shapefiles、PostGIS(需要libpq庫(kù))、Oracle Spatial(需要OCI庫(kù))、Mapinfo(mid/mif、TAB)、Dxf等多種矢量數(shù)據(jù)的支持[3,4]。GDAL/OGR除默認(rèn)編譯的庫(kù)之外,可引入第三方庫(kù)增強(qiáng)對(duì)格式的支持,如添加FileGDB API庫(kù)則可實(shí)現(xiàn)對(duì)ESRI FileGDB數(shù)據(jù)的支持。
Esri的ArcGIS系列、Erdas、Google Earth和跨平臺(tái)的GRASS GIS、Quantunm GIS系統(tǒng)等很多著名的GIS類(lèi)產(chǎn)品都使用了GDAL/OGR庫(kù)。利用GDAL/OGR庫(kù),可以使地理空間數(shù)據(jù)管理系統(tǒng)提供對(duì)矢量和柵格文件數(shù)據(jù)的支持[3,5,6]。本文僅討論基于OGR的矢量數(shù)據(jù)解碼。
基于GDAL/OGR的地理矢量數(shù)據(jù)要素解碼與轉(zhuǎn)換算法流程(圖3):
圖3 基于GDAL/OGR的地理數(shù)據(jù)要素解碼與轉(zhuǎn)換
(1)根據(jù)文件類(lèi)型自動(dòng)選擇數(shù)據(jù)驅(qū)動(dòng);
(2)由數(shù)據(jù)驅(qū)動(dòng)打開(kāi)數(shù)據(jù)源(Dataset);
(3)遍歷Dataset中實(shí)體要素;
(4)讀取要素?cái)?shù)據(jù)信息;
(5)判斷要素類(lèi)型;
(6)根據(jù)要素類(lèi)型調(diào)用模板函數(shù)解析要素信息;
(7)根據(jù)需求對(duì)信息進(jìn)行轉(zhuǎn)換與處理;
(8)進(jìn)入步驟(3)。
(9)關(guān)閉數(shù)據(jù)源(Dataset),進(jìn)入下一流程。
進(jìn)而,基于C++泛型編程,不依賴(lài)第三方平臺(tái),實(shí)現(xiàn)對(duì)矢量數(shù)據(jù)的要素解碼與轉(zhuǎn)換。
本文提出的多源地理矢量數(shù)據(jù)要素解碼方法,具有通用性、可擴(kuò)展性、可維護(hù)性強(qiáng)的特點(diǎn),有效解決了地理數(shù)據(jù)要素解碼過(guò)度依賴(lài)第三方平臺(tái)帶來(lái)的問(wèn)題,實(shí)現(xiàn)了不依賴(lài)第三方平臺(tái)的地理信息圖件與數(shù)據(jù)解碼與轉(zhuǎn)換??蔀槎嘣串悩?gòu)數(shù)據(jù)的數(shù)據(jù)轉(zhuǎn)換、數(shù)據(jù)融合與共享應(yīng)用提供思路。