華東師范大學地理信息系統教育部重點實驗室 張 弟 吳健平
近年來GIS開源軟件發展很快,DotSpatial是眾多GIS開源軟件中功能比較全面、擴展性比較好的一款,它提供空間數據的處理、分析、投影等功能。目前已有很多其他開源GIS軟件使用DotSpatial提供的功能,但是DotSpatial存在著與其它開源軟件相同的不足之處,比如官方開發文檔及幫助資料少,對GIS數據格式的支持不夠全面等。而傳統的GIS商業軟件雖然開發文檔齊全,支持多種GIS數據格式,但是授權昂貴,并且安裝占用大量的磁盤空間。由于商業因素,商業GIS軟件源代碼和關鍵算法受到嚴格保護,不利于學術研究。因此研究和完善開源GIS軟件在學術和商業方面都有著重要意義,而DotSpatial是一個比較新的開源類庫,目前對其研究的文章還很少。綜合上述因素,本文介紹了DotSpatial的架構,深入研究了其提供的擴展機制,最后利用官方提供的模版擴展實現了DotSpatial對NetCDF數據的讀取與渲染。這種擴展方法具有一定的通用性,可以用來實現讓DotSpatial支持更多種類的GIS數據。
DotSpatial是一套基于.Net Framework 4.0平臺開發的開源GIS類庫,整套類庫是使用C#語言編寫完成,以GNU LGPL授權(GNU Library General Public License)形式開放源代碼,目前整個項目由幾十個開發者共同維護,并且不斷地有新的開發人員參其中。DotSpatial官方網址為http://dotspatial.codeplex.com,網站主要包括源代碼、類庫、說明文檔、討論區、主要開發者、授權文檔等幾個部分。
DotSpatial的類庫可供其他程序直接調用,Mapwindow 6、Hydrodesktop、Mad、Area of Review、Marine Life等開源GIS軟件使用了DotSpatial的類庫提供的功能。為了讓開發者迅速熟悉這套類庫,官網提供了一個已經編譯好的簡易示例程序。該程序支持Shapefile文件,實現了縮放、平移等常見GIS操作,并且支持擴展。
目前DotSpatial整個類庫實現的功能包括:
①顯示地圖;②支持Shapefile,Bgd,以及其它常用的柵格數據和遙感影像數據;③渲染符號和標簽;④支持動態投影和投影變換,WGS84為默認投影方式;⑤支持屬性數據的編輯和顯示;⑥支持空間分析,包括疊加分析、緩沖區分析、差值分析、空間統計等。⑦支持GPS格式數據。
DotSpatial很好的實現了功能模塊化設計思想,方便開發者靈活定制程序。Dot-Spatial架構在設計時主要考慮了兩個要素。首先是將用戶界面部分與業務邏輯部分分離,其次是將各個模塊編譯到不同的DLL中,提高代碼的利用率,并且做到無需加載整個類庫就可使用部分功能。
DotSpatial提供了完善的擴展機制,允許開發者對其功能進行擴展。DotSpatial啟動時會對根目錄下的Application Extensions子目錄進行掃描,該目錄下任何實現IExtension接口的DLL都會被加載到主程序中,加載完成后就可以使用DLL中的擴展功能。IExtension主要包含Activate和Deactivate和方法。DotSpatial啟動時調用Activate方法,完成模版的初始化任務。方法Decative在卸載模版時被調用,實現卸載模版及資源清理功能。
為了方便開發人員進行擴展,DotSpatial提供了一個可以安裝的插件模版(template),下載地址為:http://visualstudiogallery.msdn.microsoft.com/92919cee-a2b0-43c6-8993-aeac965bc4b5,安裝模版后,用Visual Studio新建項目時可以選擇該模版,并在此基礎上進行擴展開發。
模版提供了實現IExtension所需的基礎代碼,其中包含一個Extension基類和一個MyPlugin子類。Extension類實現了IExtension接口中的Activate和Deactivate方法,Plugin子類繼承Extension父類,并且還有一個ButtonClick方法,可以。模版加載后會在DotSpatial的Extensions菜單中生成對應的菜單項,點擊菜單會執行ButtonClick方法,主要的擴展功能可以在該方法中實現或由該方法調用其它方法實現。
NetCDF(Network Common Data Form)網絡通用數據格式是由UCAR(University Corporation for Atmospheric Research)針對于科學數據的特點專門進行開發的一種開放的編碼標準。由于其開放性、自描述性、平臺獨立性、高可用性等特點,目前已廣泛應用于氣象學、水文學、海洋學以及地理信息系統等諸多領域。已經有很多文章在NetCDF的實際應用方面做了深入研究,但是在擴展GIS軟件實現支持NetCDF數據渲染方面的研究還不是很多。DotSpatial本身不支持NetCDF數據,我們通過前面介紹的模版編程實現DotSpatial渲染NetCDF數據。DotSpatial原生支持ESRI的Bgd柵格數據,因此可以通過在內存中將NetCDF數據轉換為Bgd的方式實現NetCDF數據的渲染。
NetCDF文件包含維(dimensions)、變量(variables)和屬性(attributes)三種描述類型,每種類型都會被分配一個名字和一個ID,這些類型共同描述了一個數據集。NetCDF庫可以同時訪問多個數據集,用ID來識別不同數據集。維表示變量維度信息,變量存儲實際數據,屬性表示變量或數據集本身的輔助信息,根據作用域可分為適用于整個文件的全局屬性和適用于特定變量的局部屬性,全局屬性則描述了數據集的基本屬性以及數據集的來源。NetCDF可在某一維進行追加,無需重新定義數據格式并復制原有數據,圖1是一個NetCDF在Time維的增長示例,圖2所示為轉換NetCDF格式。

圖1 NetCDF維增長比例

圖2 轉換NetCDF格式
UCAR提供了一系列操作NetCDF文件的庫,通過這些庫可以讀寫NetCDF文件數據或元數據信息。核心庫由C語言編寫,在此基礎上提供了C、C++、Java、Python、Perl等多種主流編程語言的API,但是還不支持C#,可以通過C#封裝NetCDF核心C庫函數的方式間接讀取NetCDF數據。
DotSpatial本身支持ESRI的Bgd柵格數據,通過實現IExtension接口,在內存中將NetCDF數據轉換為Bgd格式,DotSpatial可以顯示轉換后的數據,轉換過程如圖2所示,最終的渲染效果和其它支持NetCDF數據的軟件是一致的,這說明前面的擴展方式是可行的。
本文介紹了開源GIS軟件DotSpatial及其擴展機制,利用其官方提供的模版實現了DotSpatial對NetCDF數據的讀取與渲染,可以充分的利用DotSpatial已有的平移、縮放等功能對NetCDF數據進行常見GIS操作。這種擴展方法具有一定的通用性,可以很好的擴展DotSpatial原有功能,用來實現支持多種GIS數據格式。
[1]Li J,Liao W,Choudhary A,et al.Parallel NetCDF:A high-performance scientif ic I/O interface[C].2003 ACM/IEEE Conference.IEEE,2003:39-39.
[2]孫建偉,孫昭晨,陳軒,等.NetCDF格式數據的創建及應用[J].交通標準化,2010(226):31-34.