在簡要回顧GIS軟件和組件式GIS的發(fā)展之后,經(jīng)過對比分析,作者提出同時支持兩大主流開發(fā)平臺——.NET和Java EE是新一代GIS組件的必然選擇,然后討論可能的幾種實現(xiàn)模式,提出基于“共相”思想的C++擴(kuò)展模式是最為徹底和完美的解決方案,最后介紹在“共相”思想指導(dǎo)下的新一代組件式GIS軟件的設(shè)計和開發(fā)……
1.1 GIS新的機(jī)遇與挑戰(zhàn)
GIS的核心是GIS軟件,GIS軟件的發(fā)展和IT技術(shù),尤其是主流軟件技術(shù)的發(fā)展緊密相關(guān)。在組件技術(shù)出現(xiàn)之前,GIS軟件大多采用桌面GIS加專用二次開發(fā)語言的方式,存在用戶難學(xué)難用,擴(kuò)展困難,無法與MIS等其他系統(tǒng)集成的問題[2]。GIS僅限于測繪、土地等少數(shù)部門使用,無法為更多的領(lǐng)域行業(yè)和大眾服務(wù),GIS處于專家GIS階段。
20世紀(jì)90年代中微軟推出COM組件技術(shù),并在GIS中得到廣泛應(yīng)用,形成了組件式GIS。組件式GIS具備高效無縫集成、無須專門GIS開發(fā)語言、成本低等特點(diǎn)[2],GIS也因此開始融入IT主流,并出現(xiàn)了一批成功的組件式GIS產(chǎn)品。
近年來,軟件技術(shù)發(fā)展最突出的特點(diǎn)和趨勢是:軟件開發(fā)不僅僅靠開發(fā)語言和集成環(huán)境,而是要依賴于一個完整的開發(fā)平臺。之所以稱為“開發(fā)平臺”,具體體現(xiàn)在以下幾個方面:1)具有完備的分布式和企業(yè)級解決方案;2)具備軟件從需求到設(shè)計、開發(fā)、重構(gòu)、測試、文檔到配置管理、安裝發(fā)布部署等一整套功能;3)提供了龐大的、完整的類庫支持。
目前兩個主流開發(fā)平臺是.NET和Java EE,由于上述特點(diǎn),可以設(shè)想在不久的未來,大多數(shù)軟件產(chǎn)品和工程項目都將在這兩個主流平臺上進(jìn)行。對主流開發(fā)平臺的支持給GIS軟件帶來了新的機(jī)遇和挑戰(zhàn)。
1.2 .NET和Java EE平臺對比和選擇
.NET和Java EE平臺的分析對比已經(jīng)有很多相關(guān)研究,這里只作簡單的對比并得出結(jié)論。
根據(jù)上述比較,選擇支持哪個平臺對于具體項目而言并不困難,如果應(yīng)用只部署在Windows操作系統(tǒng)上,.NET在集成度和運(yùn)行效率、開發(fā)效率上都要略勝一籌;要支持Unix/Linux操作系統(tǒng),Java EE則是不二選擇。但對于軟件,尤其是專業(yè)開發(fā)平臺軟件,則往往是一個艱難的抉擇,因為需要關(guān)注軟件產(chǎn)業(yè)長期的發(fā)展,初期選擇失誤會帶來難以挽回的損失,而現(xiàn)在無法斷定兩個開發(fā)平臺未來競爭的結(jié)果。選擇.NET還是Java EE是許多GIS平臺軟件開發(fā)企業(yè)的兩難問題。
對于GIS軟件而言,更為現(xiàn)實的方法是同時支持J2EE和.NET。因為對于普通用戶,Windows桌面GIS更普及和容易操作;而GIS服務(wù)更傾向于使用Unix和Linux服務(wù)器,兩個不可或缺。那么GIS如何做到同時支持J2EE和.NET兩個對立的陣營呢?又如何應(yīng)對未來開發(fā)平臺的新進(jìn)展呢?下面對幾種可能的實現(xiàn)模式分別進(jìn)行分析對比。
1.3 幾種實現(xiàn)模式
1.1.1 代碼轉(zhuǎn)換模式
代碼轉(zhuǎn)換模式指的是首先用C#(任一.NET開發(fā)語言)或Java完成.NET版本或Java版本的開發(fā),然后采用代碼轉(zhuǎn)換工具把C#代碼翻譯為Java代碼,或把Java代碼翻譯為C#代碼。
代碼轉(zhuǎn)換模式看似最為徹底,在兩個平臺上都進(jìn)行了完整的實現(xiàn)。實際上卻行不通,因為兩種平臺各有自己的優(yōu)勢,這些優(yōu)勢互不相同,代碼轉(zhuǎn)換工具無法把一個平臺的優(yōu)勢智能的在另一個平臺上優(yōu)化。此外,轉(zhuǎn)換后的代碼容易存在隱患,維護(hù)升級也困難。最重要的是Java還存在運(yùn)行效率不高,無法滿足GIS大數(shù)據(jù)量、高性能運(yùn)算的要求,即不適合用于GIS平臺核心功能的開發(fā)。
1.3.1 COM擴(kuò)展模式
由于原有GIS組件幾乎都采用COM技術(shù),所以采用在現(xiàn)有COM組件的基礎(chǔ)上通過各種橋接技術(shù)提供Java和.NET接口就成為一個很自然的想法。例如可以在COM基礎(chǔ)上封裝出.NET組件,通過第三方的Java-COM橋工具提供Java接口。
COM擴(kuò)展模式可以在原有COM組件的基礎(chǔ)上快速完成Java和.NET組件的封裝,是一種比較現(xiàn)實的選擇。但這種模式存在依賴于第三方技術(shù)、開發(fā)和維護(hù)困難、增加不必要的層次和復(fù)雜度等問題。另一個問題在于其技術(shù)基礎(chǔ)COM從原理上雖然是可以跨操作系統(tǒng)的,但實際上僅在Windows操作系統(tǒng)上得到很好的實現(xiàn),最終Java GIS組件的跨操作系統(tǒng)性嚴(yán)重依賴于其它操作系統(tǒng)對COM的支持,而僅支持Windows操作系統(tǒng)的Java組件則顯得有些雞肋。COM擴(kuò)展模式可以說是為了滿足對Java和.NET的緊迫需要而采取的一種臨時性或過渡性的措施。
1.3.2 基于“共相”思想的C++擴(kuò)展模式
哲學(xué)中用“共相”和“殊相”來分別指代普遍性和個別性的概念與事物?;谀撤N開發(fā)平臺實現(xiàn)的GIS組件可以看作一個“殊相”,而具備支持任意開發(fā)平臺能力的C++擴(kuò)展模式則滲透著“共相”的思想。對于“共相”更多的分析可以參閱本期另一篇文章《哲學(xué)中的共相問題與共相式地理信息系統(tǒng)研究》。
C++擴(kuò)展模式從GIS軟件對高性能和跨平臺的要求出發(fā),充分考慮到以后對操作系統(tǒng)和開發(fā)平臺的擴(kuò)展能力,提出以標(biāo)準(zhǔn)C++構(gòu)建一套高性能和跨平臺的GIS核心類庫,并以此為基礎(chǔ),通過各種開發(fā)語言自身所具備和C++語言的交互集成能力,來封裝實現(xiàn)各個開發(fā)平臺上的GIS組件。例如可以通過JNI技術(shù)實現(xiàn)Java組件,通過C++/CLI實現(xiàn).NET組件,通過Python的C語言擴(kuò)展接口實現(xiàn)Python組件等。值得說明的是,上述這些技術(shù)都是各個開發(fā)語言/開發(fā)平臺與生俱來的,是成熟穩(wěn)定的技術(shù),并不會帶來不穩(wěn)定因素。
C++擴(kuò)展模式的優(yōu)點(diǎn)在于:1)采用標(biāo)準(zhǔn)C++作為內(nèi)核,具備高度的可移植性;2)C++的內(nèi)核帶來運(yùn)行時的高性能;3)各種開發(fā)平臺自身幾乎都提供了和C/C++集成的能力,具備無限的擴(kuò)展能力。
C++擴(kuò)展模式的缺點(diǎn)在于:1)無法使用既有的開發(fā)成果,必須從頭打造標(biāo)準(zhǔn)C++的GIS核心類庫;2)開發(fā)技術(shù)難度大,開發(fā)水平要求高。因此,這一模式的實施代價非常昂貴。但一旦實施成功,卻是最為徹底和完美的解決方案,其產(chǎn)品也將是最為穩(wěn)定和成熟的。
1.4 C++擴(kuò)展模式的實現(xiàn)技術(shù)
1.1.2 標(biāo)準(zhǔn)C++的GIS核心類庫構(gòu)建
C++擴(kuò)展模式首先需要實現(xiàn)一套用標(biāo)準(zhǔn)C++構(gòu)建的、跨平臺的GIS核心類庫,做到“一次編寫,到處編譯”。表2對開發(fā)中可能會遇到的問題及其應(yīng)對要點(diǎn)做一個總結(jié)。
1.1.3 Java組件實現(xiàn)技術(shù)
在C++類庫的基礎(chǔ)上,可以通過JNI(Java Native Interface)技術(shù)實現(xiàn)Java接口。通常來說,采用JNI技術(shù)在提升系統(tǒng)的運(yùn)行效率的同時往往會喪失Java的跨平臺特性。但由于標(biāo)準(zhǔn)C++構(gòu)建底層類庫具有“一次編寫,到處編譯”的特性,所以通過JNI技術(shù)實現(xiàn)的Java組件并沒有喪失跨平臺性。
通過JNI實現(xiàn)C++提供Java接口的步驟如圖1所示。(以輸出“Hello,World”為例。)
JNI由于涉及到Java和C/C++兩種開發(fā)語言,開發(fā)難度大,出現(xiàn)問題如果不清楚問題所在,往往會陷入被動。JNI開發(fā)中注意事項有數(shù)值類型的對應(yīng)問題和字符編碼問題等。
在用JNI技術(shù)提供Java接口之后,還應(yīng)該經(jīng)過再一次的封裝,提供面向?qū)ο蟮腏ava組件。
1.1.4 .NET組件實現(xiàn)技術(shù)
在C++類庫的基礎(chǔ)上,實現(xiàn).NET組件的最佳途徑是采用C++/CLI。C++/CLI是在著名語言設(shè)計大師Stan Lippman和Herb Sutter主導(dǎo)設(shè)計的新一代C++。C++/CLI在完全支持C++標(biāo)準(zhǔn)的前提下,引入了一些新的語法和語義,對.NET環(huán)境提供了第一流的支持,對.NET CLR提供了更加靈活的控制方式。C++/CLI改革了Manager C++拙劣的語法,增強(qiáng)了其系統(tǒng)功能,針對傳統(tǒng)C++遺留的一些問題進(jìn)行了改進(jìn),使C++更好地扮演.NET平臺上系統(tǒng)語言的角色。
C++/CLI是C++和CLI的結(jié)合體,C++被稱為最復(fù)雜的系統(tǒng)語言之一,C++/CLI 的復(fù)雜度更是有過之而無不及。在使用C++/CLI中,需要注意的事項有:區(qū)分內(nèi)部指針和頂指針,字符串處理等。
1.5 新一代SuperMap GIS組件的實現(xiàn)和特點(diǎn)
1.1.5 新一代SuperMap GIS組件的實現(xiàn)
新一代SuperMap GIS組件正是按照C++擴(kuò)展模式的思路來構(gòu)建的。首先用標(biāo)準(zhǔn)C++構(gòu)建一套完整的、與具體操作系統(tǒng)無關(guān)的GIS核心類庫――SuperMap Universal GIS Classes(簡稱UGC)。在UGC的基礎(chǔ)之上,通過JNI技術(shù)提供SuperMap Objects Java組件,用于Java開發(fā)平臺;通過C++/CLI技術(shù)提供SuperMap Objects .NET 組件,用于.NET開發(fā)平臺。
雖然SuperMap Objects Java組件和SuperMap Objects .NET組件的開發(fā)平臺不同,但兩者都基于統(tǒng)一的內(nèi)核――SuperMap UGC構(gòu)建,具有相同的對象模型和數(shù)據(jù)格式,是共相式GIS的重要組成部分。在共相式GIS框架下的新一代組件式GIS具備對開發(fā)平臺和功能模塊兩個層面上的擴(kuò)展性,例如在滿足市場需求時,可以推出針對其他開發(fā)平臺的GIS組件,如針對Python平臺的Python GIS組件等;在增加新的功能模塊時,可以增加新的功能組件。目前由四個可拆分的功能組件(程序集或Java包)組成,分別是數(shù)據(jù)訪問組件、地圖組件、分析組件和工具組件。
(1)數(shù)據(jù)組件(Data Component)
數(shù)據(jù)組件是核心組件,所有其他組件都直接或者間接的依賴于數(shù)據(jù)組件。數(shù)據(jù)組件由一系列和數(shù)據(jù)訪問相關(guān)的對象組成,數(shù)據(jù)組件通過數(shù)據(jù)組件中的工作空間對象,用戶可以輕松的訪問到系統(tǒng)中的數(shù)據(jù)源(DataSource)、數(shù)據(jù)集(Dataset)、記錄集(Recordset)和幾何對象(Geometry)等數(shù)據(jù)內(nèi)容,還可提取幾何對象的所有坐標(biāo)和屬性數(shù)據(jù)。數(shù)據(jù)組件還包括投影信息的獲取和空間坐標(biāo)系的轉(zhuǎn)換等功能。
(2)地圖組件(Map Component)
地圖組件依賴于數(shù)據(jù)組件,由地圖控件和一系列與地圖相關(guān)的對象組成。地圖組件負(fù)責(zé)地圖的顯示以及地圖上的交互式操作。地圖控件還提供了一些事件(Events),用戶可以根據(jù)自己的需求在這些事件中編寫自己的代碼,實現(xiàn)特定的功能。地圖組件還負(fù)責(zé)圖層、選擇集、跟蹤圖層和專題圖的制作與管理。地圖組件后續(xù)版本會提供地圖的交互式編輯,以及開放更多的事件。
(3)分析組件(Analyst Component)
分析組件依賴于數(shù)據(jù)組件,由一系列分析相關(guān)的對象組成。分析組件負(fù)責(zé)在數(shù)據(jù)集層次上的空間分析功能。分析組件目前提供緩沖區(qū)分析、疊置分析和網(wǎng)絡(luò)分析,后續(xù)版本會提供柵格分析、動態(tài)分段等分析功能。
(4)工具組件(Utility Component)
工具組件依賴于數(shù)據(jù)組件,由一系列實用工具對象組成。工具組件負(fù)責(zé)在GIS應(yīng)用中需要用到的一些工具性質(zhì)的功能。工具組件目前提供配準(zhǔn)和拓?fù)錁?gòu)建功能,后續(xù)版本會提供數(shù)據(jù)接邊、數(shù)據(jù)轉(zhuǎn)換等功能。
由于篇幅所限,這里僅提供Data和Map中一部分對象的結(jié)構(gòu)簡圖。完整的對象結(jié)構(gòu)簡圖可以參見SuperMap的用戶文檔。
1.1.6 新一代SuperMap組件式 GIS的特點(diǎn)
SuperMap Objects經(jīng)過多年的發(fā)展,具備了許多優(yōu)秀的特點(diǎn),如易于開發(fā)、可獨(dú)立分發(fā)運(yùn)行、功能強(qiáng)大、高度的可伸縮性、內(nèi)嵌大型空間數(shù)據(jù)庫引擎、面向?qū)ο笈c面向拓?fù)湎嘟Y(jié)合、GIS與CAD相結(jié)合、易與其它系統(tǒng)集成、適度的封裝“粒度”,大型GIS開發(fā)平臺等。這些特點(diǎn)的詳細(xì)介紹可以參閱SuperMap Objects的相關(guān)文檔。
新一代SuperMap組件式 GIS從原有SuperMap Objects繼承和發(fā)展而來,在充分繼承原有特點(diǎn)的同時,還具備以下特點(diǎn):
(1) 兼容性好
完全兼容SuperMap GIS 5的數(shù)據(jù)格式和XML工作空間。經(jīng)過多年發(fā)展,SuperMap GIS已經(jīng)得到廣泛的認(rèn)可,擁有眾多用戶,并產(chǎn)生了大量SuperMap GIS格式的數(shù)據(jù)。SuperMap Objects.NET完全兼容SuperMap GIS 5系列產(chǎn)品的數(shù)據(jù)格式以及XML工作空間,最大程度的保證了原有SuperMap用戶的投資,SuperMap GIS 5系列產(chǎn)品的用戶可以很方便的過渡到SuperMap Objects Universal下使用原有數(shù)據(jù)。
(2) 完全融入兩大主流開發(fā)平臺,開發(fā)更加便捷
SuperMap Objects.NET采用微軟即將推出的最新技術(shù)C++/CLI和開發(fā)工具Visual Studio.NET 2005開發(fā),全面支持.NET 2.0;SuperMap Objects Java采用JBuilder 2005開發(fā)。兩者的推出意味著SuperMap GIS又一次站在了IT技術(shù)發(fā)展的制高點(diǎn),SuperMap GIS和其他系統(tǒng)的融合將更加方便快捷。
(3) 更加合理的組件劃分
新一代SuperMap組件式 GIS在延續(xù)SuperMap Objects組件劃分的基礎(chǔ)上,根據(jù)用戶的實際需要,采用了更加合理的組件劃分方式,具體體現(xiàn)在:1)把數(shù)據(jù)組件從地圖組件中分離,作為一個獨(dú)立的組件,也就是說,純粹的數(shù)據(jù)訪問和處理可以不需要地圖組件;這將更加方便使用者開發(fā)各種數(shù)據(jù)處理工具;2)把工具類的功能集成在工具組件中,工具類功能和其他功能相比較,最大的特點(diǎn)在于對一個項目或一批數(shù)據(jù)只需要處理一次,如配準(zhǔn)、構(gòu)建拓?fù)?、?shù)據(jù)轉(zhuǎn)換等,工具組件分離出來;這既可以節(jié)省用戶經(jīng)濟(jì)成本,又降低了數(shù)據(jù)組件、地圖組件等的運(yùn)行負(fù)擔(dān),還便于以后功能的擴(kuò)充。
(4) 高效運(yùn)行和高效開發(fā)的完美結(jié)合
眾所周知,C++作為系統(tǒng)級開發(fā)語言,具有運(yùn)行效率高的特性,但其學(xué)習(xí)開發(fā)的難度都很大,不便于用戶的二次開發(fā)。而Java語言,包括C#語言雖然易學(xué)易用,并有很好的集成開發(fā)環(huán)境輔助開發(fā),但由于語言本身的限制,運(yùn)行效率總不及C++。新一代SuperMap 組件式GIS的內(nèi)核采用C++構(gòu)建,具有高效的運(yùn)行效率,對用戶提供Java和.NET組件,方便用戶學(xué)習(xí)使用和充分利用集成開發(fā)環(huán)境的能力,是高效運(yùn)行和高效開發(fā)的完美結(jié)合。
(5) 具有完整的解決方案
新一代SuperMap 組件式GIS是SuperMap GIS Universal(SuperMap共相式GIS)的一部分。共相式GIS是可以支持任意硬件、任意操作系統(tǒng)、任意數(shù)據(jù)庫、任意數(shù)據(jù)格式、任意開發(fā)語言、任意網(wǎng)絡(luò)結(jié)構(gòu)乃至任意GIS之間互操作的GIS軟件平臺發(fā)展的新的構(gòu)思和理念,是解決GIS復(fù)雜異構(gòu)問題的完整解決方案。SuperMap GIS已經(jīng)形成了共相式GIS的構(gòu)架,新一代SuperMap組件式GIS是這一構(gòu)架的重要組成部分。
1.6 結(jié)論
IT技術(shù),尤其是主流軟件開發(fā)技術(shù)的快速發(fā)展,要求GIS軟件必須緊跟技術(shù)發(fā)展的潮流和趨勢。本文在介紹和分析幾種可同時支持兩大主流開發(fā)平臺的實現(xiàn)模式后,提出基于共相思想的C++擴(kuò)展模式是最為徹底和完美的解決方案。并通過SuperMap Objects.NET和SuperMap Objects Java兩個新一代GIS組件的研究和開發(fā)驗證了這一解決思路的可行性。
作者簡介:
曾志明(1978-),男,湖南衡陽人。2000年畢業(yè)于北京師范大學(xué)資源與環(huán)境科學(xué)系,獲地理科學(xué)學(xué)士學(xué)位,2005年畢業(yè)于中國科學(xué)院地理科學(xué)與資源研究所,獲理學(xué)博士學(xué)位。目前工作于北京超圖地理信息技術(shù)有限公司,主要從事SuperMap GIS軟件底層技術(shù)開發(fā)。