FDO Provider for SuperMap 的設(shè)計與實現(xiàn)

周旭,梁軍,石偉偉

(1. 中國科學(xué)院地理科學(xué)與資源研究所,北京 100101;2. 中國科學(xué)院研究生院,北京 100039;3. 北京超圖軟件股份有限公司,北京 100085)

論文來源:計算機工程

摘要:針對在 CAD 環(huán)境中無法直接訪問和編輯 GIS 系統(tǒng)中空間數(shù)據(jù)的問題,研究開源要素數(shù)據(jù)對象(FDO)空間數(shù)據(jù)訪問引擎中的數(shù)據(jù)提供者(PDO Provider)的 4 個關(guān)鍵部分的實現(xiàn)技術(shù):數(shù)據(jù)連接,數(shù)據(jù)模型之間的映射,坐標(biāo)系統(tǒng)的識別以及數(shù)據(jù)的讀寫訪問操作。設(shè)計并實現(xiàn) FDO Provider for S…

關(guān)鍵詞: 要素數(shù)據(jù)對象;空間數(shù)據(jù)引擎;超圖;計算機輔助設(shè)計

1 概述

要素數(shù)據(jù)對象(Feature Data Objects, FDO)空間數(shù)據(jù)訪問引擎作為開源地理空間基金會下的一個開源項目[1],已經(jīng)逐步得到了越來越多的空間信息軟件的支持(支持 FDO 的軟件產(chǎn)品列表詳見文獻(xiàn)[2])。

FDO 包含應(yīng)用程序接口 FDO API 和用于支持各種具體空間數(shù)據(jù)源的數(shù)據(jù)提供者(FDO Provider)2 個部分[1,3],其基本思想是通過一套統(tǒng)一和開放的接口 API 以一種公共的方式來獲取、查詢、編輯、分析和存儲隱藏在后臺的各種地理空間數(shù)據(jù)[3],而通過不同的數(shù)據(jù)提供者來實現(xiàn)針對這些不同數(shù)據(jù)格式的具體訪問操作,從而使應(yīng)用程序能夠通過一套 FDO API 直接訪問各種空間數(shù)據(jù)而不受具體存儲格式的束縛。其中,F(xiàn)DO Provider 是 FDO API 的一個具體實現(xiàn),實際上就是一個用于連接和處理特定 GIS 空間數(shù)據(jù)源的動態(tài)鏈接庫[3]。例如,本文實現(xiàn)的 FDO Provider for SuperMap,就使應(yīng)用程序可以通過開源的 FDO API 直接處理 SuperMap 格式的 GIS數(shù)據(jù)。

2 FDO API 接口

FDO API 為處理存儲在數(shù)據(jù)庫和數(shù)據(jù)文件中的地理數(shù)據(jù)提供了一個公共的抽象層。從某種意義上說,F(xiàn)DO API 就是這個抽象層的接口規(guī)范[1]。因此,要使應(yīng)用程序可以通過 FDO API 來連接、識別、讀取、編輯(修改、插入、刪除)SuperMap格式的 GIS 數(shù)據(jù)并基于正確的地理坐標(biāo)位置進(jìn)行顯示,就必須在 FDO 引擎的 SuperMap Provider 中正確實現(xiàn)對應(yīng)的 FDO API 接口。

由于本文篇幅有限,僅討論與以上基本的空間數(shù)據(jù)訪問功能相對應(yīng)的 FDO API 接口類,如表 1 所示。FDO API 類的具體函數(shù)接口可參見 FDO 源代碼(http://fdo.osgeo.org)。

3 FDO Provider for SuperMap 的設(shè)計與實現(xiàn)

FDO 引擎的 SuperMap 數(shù)據(jù)提供者基于 SuperMap 共相式 GIS 內(nèi)核(Universal GIS Core, UGC)底層開發(fā)庫進(jìn)行開發(fā)實現(xiàn)。UGC 作為超圖公司新一代基礎(chǔ)類庫,全部采用標(biāo)準(zhǔn)C++開發(fā),具有跨平臺和高性能的特點。FDO 本身也支持Windows 和 Linux 操作系統(tǒng)[4],使用 UGC 來實現(xiàn)該 Provider也能保證其在 FDO 支持的各種操作系統(tǒng)上正確運行。

本文將論述如何在 FDO Provider中設(shè)計和實現(xiàn)相關(guān)FDO API 接口,使應(yīng)用程序可以通過開源 FDO 引擎來完成對SuperMap 的 SDB 文件和 SDX+空間數(shù)據(jù)庫的基本訪問和處理功能。

3.1 數(shù)據(jù)連接的實現(xiàn)

由表 1 可知,實現(xiàn) FDO 對 SuperMap 數(shù)據(jù)的連接需要在Provider 中利用 UGC 實現(xiàn) 2 個 FDO API:FDOIConnection和 FDOIConnectionInfo。具體實現(xiàn)過程中主要存在 2 個問題:

(1)由于文件和數(shù)據(jù)庫的連接屬性的差異,連接 SDB 文件只需要一個正確的文件全路徑名,而連接 SDX+數(shù)據(jù)庫就需要數(shù)據(jù)庫引擎類型、服務(wù)器地址、數(shù)據(jù)庫名、用戶名、密碼等多個連接屬性[5]。因此,必須考慮如何在一個 Provider中以統(tǒng)一的方式來獲取和設(shè)置這兩者的連接屬性。

(2)由于文件型數(shù)據(jù)源的獨占性,上層軟件通過 FDO 打開多個到同一 SDB 文件的連接時,將只能在第一個連接中對數(shù)據(jù)進(jìn)行編輯,并且關(guān)閉其中一個連接會導(dǎo)致其他連接均不可用。通過在 Provider 中利用 Singleton 模式建立連接池的技術(shù)可以有效解決這一問題,同時還可以提高對數(shù)據(jù)庫訪問的性能。

3.1.1 統(tǒng)一 SDB 文件和 SDX+數(shù)據(jù)庫的連接屬性設(shè)置

在 FDO API中與連接屬性設(shè)置相關(guān)的具體函數(shù)接口主要由 2 個:FDOIConnectionInfo:: GetConnectionProperties()和FDOIConnection::Set ConnectionString()(省略返回值和參數(shù))。前者負(fù)責(zé)告訴 FDO 連接 SuperMap 數(shù)據(jù)源需要哪幾個連接屬性,后者設(shè)置具體連接參數(shù)。

為了兼容 SDB 文件和 SDX+數(shù)據(jù)庫的連接屬性設(shè)置,采取只要一個 FDO 連接字符串屬性,然后在 Provider 內(nèi)部對該字符串進(jìn)行解析的方法。即在第 1 個接口中告訴 FDO 本Provider 只需要一個連接屬性,在第 2 個接口中再對這一個字符串屬性進(jìn)行解析。這就需要對連接字符串的格式進(jìn)行規(guī)定,比如,連接 C 盤根目錄下的 world.sdb 數(shù)據(jù)源,連接字符串為 type=sdb;database=c:\\world.sdb;連接一個后臺為 SQL Server 的 SDX+ 空間數(shù)據(jù)庫,字符串格式為 type=sql; server=192.168.1.76; database=test;user=sa;password=123。 3.1.2 連接池設(shè)計

連接池的設(shè)計主要由 2 個目的:(1)避免多次打開同一SDB 文件數(shù)據(jù)源引起的并發(fā)問題。(2)提高數(shù)據(jù)庫型的 SDX+ 數(shù)據(jù)源的連接使用效率,將已經(jīng)打開過的 SDX+數(shù)據(jù)源保存在連接池中,如果用戶需要使用之前已經(jīng)打開過的數(shù)據(jù)源時,直接在連接池中取出返回即可,從而避免網(wǎng)絡(luò)傳輸?shù)葞淼男阅軗p耗。

更多內(nèi)容請查看pdf