(1. 中國(guó)科學院地(dì / de)理科學與資源研究所,北京 100101;2. 中國(guó)科學院研究生院,北京 100039;3. 地圖生活(北京)信息技術有限公司,北京 100085)
論文來(lái)源:計算機工程
摘要(yào / yāo):針對在(zài) CAD 環境中無法直接訪問和(hé / huò)編輯 GIS 系統中空間數據的(de)問題,研究開源要(yào / yāo)素數據對象(FDO)空間數據訪問引擎中的(de)數據提供者(PDO Provider)的(de) 4 個(gè)關鍵部分的(de)實現技術:數據連接,數據模型之(zhī)間的(de)映射,坐标系統的(de)識别以(yǐ)及數據的(de)讀寫訪問操作。設計并實現 FDO Provider for S…
關鍵詞: 要(yào / yāo)素數據對象;空間數據引擎;超圖;計算機輔助設計
1 概述
要(yào / yāo)素數據對象(Feature Data Objects, FDO)空間數據訪問引擎作爲(wéi / wèi)開源地(dì / de)理空間基金會下的(de)一(yī / yì /yí)個(gè)開源項目[1],已經逐步得到(dào)了(le/liǎo)越來(lái)越多的(de)空間信息軟件的(de)支持(支持 FDO 的(de)軟件産品列表詳見文獻[2])。
FDO 包含應用程序接口 FDO API 和(hé / huò)用于(yú)支持各種具體空間數據源的(de)數據提供者(FDO Provider)2 個(gè)部分[1,3],其基本思想是(shì)通過一(yī / yì /yí)套統一(yī / yì /yí)和(hé / huò)開放的(de)接口 API 以(yǐ)一(yī / yì /yí)種公共的(de)方式來(lái)獲取、查詢、編輯、分析和(hé / huò)存儲隐藏在(zài)後台的(de)各種地(dì / de)理空間數據[3],而(ér)通過不(bù)同的(de)數據提供者來(lái)實現針對這(zhè)些不(bù)同數據格式的(de)具體訪問操作,從而(ér)使應用程序能夠通過一(yī / yì /yí)套 FDO API 直接訪問各種空間數據而(ér)不(bù)受具體存儲格式的(de)束縛。其中,FDO Provider 是(shì) FDO API 的(de)一(yī / yì /yí)個(gè)具體實現,實際上(shàng)就(jiù)是(shì)一(yī / yì /yí)個(gè)用于(yú)連接和(hé / huò)處理特定 GIS 空間數據源的(de)動态鏈接庫[3]。例如,本文實現的(de) FDO Provider for SuperMap,就(jiù)使應用程序可以(yǐ)通過開源的(de) FDO API 直接處理 SuperMap 格式的(de) GIS數據。
2 FDO API 接口
FDO API 爲(wéi / wèi)處理存儲在(zài)數據庫和(hé / huò)數據文件中的(de)地(dì / de)理數據提供了(le/liǎo)一(yī / yì /yí)個(gè)公共的(de)抽象層。從某種意義上(shàng)說(shuō),FDO API 就(jiù)是(shì)這(zhè)個(gè)抽象層的(de)接口規範[1]。因此,要(yào / yāo)使應用程序可以(yǐ)通過 FDO API 來(lái)連接、識别、讀取、編輯(修改、插入、删除)SuperMap格式的(de) GIS 數據并基于(yú)正确的(de)地(dì / de)理坐标位置進行顯示,就(jiù)必須在(zài) FDO 引擎的(de) SuperMap Provider 中正确實現對應的(de) FDO API 接口。
由于(yú)本文篇幅有限,僅讨論與以(yǐ)上(shàng)基本的(de)空間數據訪問功能相對應的(de) FDO API 接口類,如表 1 所示。FDO API 類的(de)具體函數接口可參見 FDO 源代碼(http://fdo.osgeo.org)。
3 FDO Provider for SuperMap 的(de)設計與實現
FDO 引擎的(de) SuperMap 數據提供者基于(yú) SuperMap 共相式 GIS 内核(Universal GIS Core, UGC)底層開發庫進行開發實現。UGC 作爲(wéi / wèi)超圖公司新一(yī / yì /yí)代基礎類庫,全部采用标準C++開發,具有跨平台和(hé / huò)高性能的(de)特點。FDO 本身也(yě)支持Windows 和(hé / huò) Linux 操作系統[4],使用 UGC 來(lái)實現該 Provider也(yě)能保證其在(zài) FDO 支持的(de)各種操作系統上(shàng)正确運行。
本文将論述如何在(zài) FDO Provider中設計和(hé / huò)實現相關FDO API 接口,使應用程序可以(yǐ)通過開源 FDO 引擎來(lái)完成對SuperMap 的(de) SDB 文件和(hé / huò) SDX+空間數據庫的(de)基本訪問和(hé / huò)處理功能。
3.1 數據連接的(de)實現
由表 1 可知,實現 FDO 對 SuperMap 數據的(de)連接需要(yào / yāo)在(zài)Provider 中利用 UGC 實現 2 個(gè) FDO API:FDOIConnection和(hé / huò) FDOIConnectionInfo。具體實現過程中主要(yào / yāo)存在(zài) 2 個(gè)問題:
(1)由于(yú)文件和(hé / huò)數據庫的(de)連接屬性的(de)差異,連接 SDB 文件隻需要(yào / yāo)一(yī / yì /yí)個(gè)正确的(de)文件全路徑名,而(ér)連接 SDX+數據庫就(jiù)需要(yào / yāo)數據庫引擎類型、服務器地(dì / de)址、數據庫名、用戶名、密碼等多個(gè)連接屬性[5]。因此,必須考慮如何在(zài)一(yī / yì /yí)個(gè) Provider中以(yǐ)統一(yī / yì /yí)的(de)方式來(lái)獲取和(hé / huò)設置這(zhè)兩者的(de)連接屬性。
(2)由于(yú)文件型數據源的(de)獨占性,上(shàng)層軟件通過 FDO 打開多個(gè)到(dào)同一(yī / yì /yí) SDB 文件的(de)連接時(shí),将隻能在(zài)第一(yī / yì /yí)個(gè)連接中對數據進行編輯,并且關閉其中一(yī / yì /yí)個(gè)連接會導緻其他(tā)連接均不(bù)可用。通過在(zài) Provider 中利用 Singleton 模式建立連接池的(de)技術可以(yǐ)有效解決這(zhè)一(yī / yì /yí)問題,同時(shí)還可以(yǐ)提高對數據庫訪問的(de)性能。
3.1.1 統一(yī / yì /yí) SDB 文件和(hé / huò) SDX+數據庫的(de)連接屬性設置
在(zài) FDO API中與連接屬性設置相關的(de)具體函數接口主要(yào / yāo)由 2 個(gè):FDOIConnectionInfo:: GetConnectionProperties()和(hé / huò)FDOIConnection::Set ConnectionString()(省略返回值和(hé / huò)參數)。前者負責告訴 FDO 連接 SuperMap 數據源需要(yào / yāo)哪幾個(gè)連接屬性,後者設置具體連接參數。
爲(wéi / wèi)了(le/liǎo)兼容 SDB 文件和(hé / huò) SDX+數據庫的(de)連接屬性設置,采取隻要(yào / yāo)一(yī / yì /yí)個(gè) FDO 連接字符串屬性,然後在(zài) Provider 内部對該字符串進行解析的(de)方法。即在(zài)第 1 個(gè)接口中告訴 FDO 本Provider 隻需要(yào / yāo)一(yī / yì /yí)個(gè)連接屬性,在(zài)第 2 個(gè)接口中再對這(zhè)一(yī / yì /yí)個(gè)字符串屬性進行解析。這(zhè)就(jiù)需要(yào / yāo)對連接字符串的(de)格式進行規定,比如,連接 C 盤根目錄下的(de) world.sdb 數據源,連接字符串爲(wéi / wèi) type=sdb;database=c:\\world.sdb;連接一(yī / yì /yí)個(gè)後台爲(wéi / wèi) SQL Server 的(de) SDX+ 空間數據庫,字符串格式爲(wéi / wèi) type=sql; server=192.168.1.76; database=test;user=sa;password=123。 3.1.2 連接池設計
連接池的(de)設計主要(yào / yāo)由 2 個(gè)目的(de):(1)避免多次打開同一(yī / yì /yí)SDB 文件數據源引起的(de)并發問題。(2)提高數據庫型的(de) SDX+ 數據源的(de)連接使用效率,将已經打開過的(de) SDX+數據源保存在(zài)連接池中,如果用戶需要(yào / yāo)使用之(zhī)前已經打開過的(de)數據源時(shí),直接在(zài)連接池中取出(chū)返回即可,從而(ér)避免網絡傳輸等帶來(lái)的(de)性能損耗。
更多内容請查看pdf