GIS 二次開發概述
地理信息系統根據其內容可分為兩大基本類型:一是應用型地理信息系統,以某一專業、領 域或工作為主要內容,包括專題地理信息系統和區域綜合地理信息系統;二是工具型地理信息系統,也就是GIS工具軟件包,如ARC/INFO等,具有空間數據輸入、存儲、處理、分析和輸出等GIS基本功能。隨著地理信息系統應用領域的擴展,應用型GIS的開發工作日顯重要。如何針對不同的應用目標,高效地開發出既合乎需要又具有方便美觀豐富的界面形式的地理信息系統,是GIS開發者非常關心的問題。
? ? ? 1.1 GIS開發模式
獨立開發
指不依賴于任何GIS工具軟件,從空間數據的采集、編輯到數據的處理分析及結果輸出,所有的算法都由開發者獨立設計,然后選用某種程序設計語言,如Visual C++、Delphi等,在一定的操作系統平臺上編程實現。這種方式的好處在于無須依賴任何商業GIS工具軟件,減少了開發成本,但一方面對于大多數開發者來說,能力、時間、財力方面的限制使其開發出來的產品很難在功能上與商業化GIS工具軟件相比,而且在購買GIS工具軟件上省下的錢可能還抵不上開發者在開發過程中絞盡腦汁所花的代價。
宿主型二次開發
指基于GIS平臺軟件上進行應用系統開發。大多數GIS平臺軟件都提供了可供用戶進行二次開發的腳本語言,如ESRI的ArcView提供了Avenue語言,MapInfo公司的MapInfo Professional提供了MapBasic語言等等。用戶可以利用這些腳本語言,以原GIS軟件為開發平臺,開發出自己的針對不同應用對象的應用程序。這種方式省時省心,但進行二次開發的腳本語言,作為編程語言,功能極弱,用它們來開發應用程序仍然不盡如人意,并且所開發的系統不能脫離GIS平臺軟件,是解釋執行的,效率不高。
基于GIS組件的二次開發
大多數GIS軟件產商都提供商業化的GIS組件,如ESRI 公司的MapObjects、MapInfo公司的MapX等,這些組件都具備GIS的基本功能,開發人員可以基于通用軟件開發工具尤其是可視化開發工具,如Delphi、Visual C++、Visual Basic、Power Builder等為開發平臺,進行二次開發。 利用GIS工具軟件生產廠家提供的建立在OCX技術基礎上的GIS功能控件,如ESRI的MapObjects、MapInfo公司的MapX等,在Delphi等編程工具編制的應用程序中,直接將GIS功能嵌入其中,實現地理信息系統的各種功能
三種實現方式的分析與比較
由于獨立開發難度太大,單純二次開發受GIS工具提供的編程語言的限制差強人意,因此結合GIS工具軟件與當今可視化開發語言的集成二次開發方式就成為GIS應用開發的主流。它的優點是既可以充分利用GIS工具軟件對空間數據庫的管理、分析功能,又可以利用其它可視化開發語言具有的高效、方便等編程優點,集二者之所長,不僅能大大提高應用系統的開發效率,而且使用可視化軟件開發工具開發出來的應用程序具有更好的外觀效果,更強大的數據庫功能,而且
可靠性好、易于移植、便于維護。尤其是使用OCX技術利用GIS功能組件進行集成開發,更能表現出這些優勢。 由于上述優點,集成二次開發正成為應用GIS開發的主流方向。這種方法唯一的缺點是前期投入比較大,需要同時購買GIS工具軟件和可視化編程軟件,但“工欲善其事,必先利其器”,這種投資值得。 目前許多軟件公司都開發了很多ActiveX控件,合理選擇和運用現成的控件,減少了開發者的編程工作量,使開發者避開某些應用的具體編程,直接調用控件,實現這些具體應用,不僅可以縮短程序開發周期,使編程過程更簡潔,用戶界面更友好,可以使程序更加靈活、簡便。
1.2 面向對象的開發 (OOP: Object Oriented Programming)
1.2.1 面向對象程序設計模式
發明面向對象程序設計方法的主要出發點是彌補面向過程程序設計方法中的一些缺點。OOP把數據看作程序開發中的基本元素,并且不允許它們在系統中自由流動。它將數據和操作這些數據的函數緊密的連結在一起,并保護數據不會被外界的函數意外的改變。OOP允許我們將問題分解為一系列實體——這些實體被稱為對象(object),然后圍繞這些實體建立數據和函數。面向對象程序設計中的數據和函數的組織結構如圖所示。
?
1.2.2 什么是面向對象程序設計?
? ? ? ?面向對象程序設計(OOP)技術汲取了結構化程序設計中好的思想,并將這些思想與一些新的、強大的理念相結合,從而給你的程序設計工作提供了一種全新的方法。通常,在面向對象的程序設計風格中,你會將一個問題分解為一些相互關聯的子集,每個子集內部都包含了相關的數據和函數。同時,你會以某種方式將這些子集分為不同等級,而一個對象就是已定義的某個類型的變量。當你定義了一個對象,你就隱含的創建了一個新的數據類型。 1.2.3 面向對象程序設計中的基本概念 “面向對象”作為一個術語,在不同的人群中有著不同的解釋。因此,了解一些在面向對象程序設計中廣泛應用的概念是必須的。本節我們討論以下這些內容:
1、對象(Object)
2、類(Class)
?3、數據抽象(Data abstraction)
4、繼承(Inheritance)
5、動態綁定(Dynamic binding)
6、數據封裝(Data encapsulation)
7、多態性(Polymorphism)
8、消息傳遞(Message passing)
對象
在一個面向對象的系統中,對象是運行期的基本實體。它可以用來表示一個人或者說一個銀行帳戶,一張數據表格,或者其它什么需要被程序處理的東西。它也可以用來表示用戶定義的數據,例如一個向量,時間或者列表。在面向對象程序設計中,問題的分析一般以對象及對象間的自然聯系為依據。如前所述,對象在內存中占有一定空間,并且具有一個與之關聯的地址,就像Pascal中的record和C中的結構一樣。 當一個程序運行時,對象之間通過互發消息來相互作用。例如,程序中包含一個“customer”對象和一個“account”對象,而customer對象可能會向account對象發送一個消息,查詢其銀行帳目。每個對象都包含數據以及操作這些數據的代碼。即使不了解彼此的數據和代碼的細節,對象之間依然可以相互作用,所要了解的只是對象能夠接受的消息的類型,以及對象返回的響應的類型,雖然不同的人會以不同的方法實現它們。
類
我們剛才提到,對象包含數據以及操作這些數據的代碼。一個對象所包含的所有數據和代碼可以通過類來構成一個用戶定義的數據類型。事實上,對象就是類類型(class type)的變量。一旦定義了一個類,我們就可以創建這個類的多個對象,每個對象與一組數據相關,而這組數據的類型在類中定義。因此,一個類就是具有相同類型的對象的抽象。例如,芒果、蘋果和桔子都是fruit類的對象。類是用戶定義的數據類型,但在一個程序設計語言中,它和內建的數據類型行為相同。比如創建一個類對象的語法和創建一個整數對象的語法一模一樣。如果fruit被定義為一個
類,那么語句 fruit mango; 就創建了一個fruit類的對象mango。 數據抽象和封裝
把數據和函數包裝在一個單獨的單元(稱為類)的行為稱為封裝。數據封裝是類的最典型特點。數據不能被外界訪問,只能被封裝在同一個類中的函數訪問。這些函數提供了對象數據和程序之間的接口。避免數據被程序直接訪問的概念被稱為“數據隱藏”。 抽象指僅表現核心的特性而不描述背景細節的行為。類使用了抽象的概念,并且被定義為一系列抽象的屬性如尺寸、重量和價格,以及操作這些屬性的函數。類封裝了將要被創建的對象的所有核心屬性。因為類使用了數據抽象的概念,所以它們被稱為抽象數據類型(ADT)。
封裝
封裝機制將數據和代碼捆綁到一起,避免了外界的干擾和不確定性。它同樣允許創建對象。簡單的說,一個對象就是一個封裝了數據和操作這些數據的代碼的邏輯實體。 在一個對象內部,某些代碼和(或)某些數據可以是私有的,不能被外界訪問。通過這種方式,對象對內部數據提供了不同級別的保護,以防止程序中無關的部分意外的改變或錯誤的使用了對象的私有部分。
繼承
繼承是可以讓某個類型的對象獲得另一個類型的對象的屬性的方法。它支持按級分類的概念。例如,知更鳥屬于飛鳥類,也屬于鳥類。就像圖5中描繪的那樣,這種分類的原則是,每一個子類都具有父類的公共特性。
?
在OOP中,繼承的概念很好的支持了代碼的重用性(reusability),也就是說,我們可以向一個已經存在的類中添加新的特性,而不必改變這個類。這可以通過從這個已存在的類派生一個新類來實現。這個新的類將具有原來那個類的特性,以及新的特性。而繼承機制的魅力和強大就在于它允許程序員利用已經存在的類(接近需要,而不是完全符合需要的類),并且可以以某種方式修改這個類,而不會影響其它的東西。 注意,每個子類只定義那些這個類所特有的特性。而如果沒有按級分類,每類都必須顯式的定義它所有的特性。
多態
多態是OOP的另一個重要概念。多態的意思是事物具有不同形式的能力。舉個例子,對于不同的實例,某個操作可能會有不同的行為。這個行為依賴于所要操作數據的類型。比如說加法操作,如果操作的數據是數,它對兩個數求和。如果操作的數據是字符串,則它將連接兩個字符串。 圖6演示了一個函數處理不同數量、不同類型的參數。就像某個單詞在不同的上下文中具有不同的含義
?
多態機制使具有不同內部結構的對象可以共享相同的外部接口。這意味著,雖然針對不同對象的具體操作不同,但通過一個公共的類,它們(那些操作)可以通過相同的方式予以調用。多態在實現繼承的過程中被廣泛應用。 面向對象程序設計語言支持多態,術語稱之為“one interface multiple method(一個接口,多個實現)”。簡單來說,多態機制允許通過相同的接口引發一組相關但不相同的動作,通過這種方式,可以減少代碼的復雜度。在某個特定的情況下應該作出怎樣的動作,這由編譯器決定,而不需要程序員手工干預。 在多函數程序中,許多重要的數據被聲明為全局變量,這樣它們才可以被所有的函數訪問。每個函數又可以具有它自己的局部變量。全局變量很容易被某個函數不經意之間改變。而在一個大程序中,很難分辨每個函數都使用了哪些變量。如果我們需要修改某個外部數據的結構,我們就要修改所有訪問這個數據的函數。這很容易導致bug的產生
在結構化程序設計中,另一個嚴重的缺陷是不能很好的模擬真實世界的問題。這是因為函數都是面向過程的,而不是真正的對應于問題中的各個元素。 面向過程的程序設計的一些特點如下:
?強調做(算法);
?大程序被分隔為許多小程序,這些小程序稱為函數; ?大多數函數共享全局數據;
?數據開放的由一個函數流向另一個函數。函數把數據從一種形式轉換為另一種形式。 采用由上至下的程序設計方法。
動態綁定
綁定指的是將一個過程調用與相應代碼鏈接起來的行為。動態綁定的意思是,與給定的過程調用相關聯的代碼只有在運行期才可知。它與多態和繼承的聯系極為緊密。一個多態引用的函數調用決定于這個引用的動態類型。 考慮圖6中的“draw”方法。通過繼承,每個對象都具備了這個過程。但是,對于不同的對象它的算法是不同的,因此,draw過程必須在每一個類中重新定義。在運行期,當前引用對象所對應的代碼將被調用。
消息傳遞
一個面向對象的程序由許多對象組成,這些對象之間需要相互溝通。因此,在面向對象程序設計語言中,程序設計的主要步驟如下: 1、創建類,這些類定義了對象及其行為; 2、由類定義創建對象; 3、建立對象之間的通訊。 對象之間通過收發信息相互溝通,這一點類似于人與人之間的信息傳遞。信息傳遞的概念使得真實世界的直接模擬更易于和建立系統交流。 對于某個特定對象來說,消息就是請求執行某個過程,因此,消息的接收對象會調用一個函數(過程),以產生預期的結果。傳遞的消息的內容包括接收消息的對象的名字,需要調用的函數的名字,以及必要的信息。 對象就有一個生命周期。它們可以被創建和銷毀。只要對象正處于其生存期,就可以與其進行通訊。
#e#
1.2.4 OOP的優點
OOP具有許多優點,無論是對于程序設計者或者用戶來說都是如此。面向對象為軟件產品擴展和質量保證中的許多問題提供了解決辦法。這項技術能夠大大提高程序員的生產力,并可提高軟件的質量以及降低其維護費用。其主要的優點陳列于下:
1、 通過繼承,我們可以大幅減少多余的代碼,并擴展現有代碼的用途; 2、 我們可以在標準的模塊上(這里所謂的“標準”指程序員之間彼此達成的協議)構建 我們的程序,而不必一切從頭開始。這可以減少軟件開發時間并提高生產效率;
3、 數據隱藏的概念幫助程序員們保護程序免受外部代碼的侵襲;
4、 允許一個對象的多個實例同時存在,而且彼此之間不會相互干擾; 5、 允許將問題空間中的對象直接映射到程序中;
6、 基于對象的工程可以很容易的分割為獨立的部分;
7、 以數據為中心的設計方法允許我們抓住可實現模型的更多細節;
8、 面向對象的系統很容易從小到大逐步升級;
9、 對象間通訊所使用的消息傳遞技術與外部系統接口部分的描述更簡單;
10、 更便于控制軟件復雜度。
當需要將以上所說的所有特性有機的結合于一個面向對象系統中,它們之間的相對重要性就取決于工程的類型和程序員的喜好。為了獲得上述的某些優勢,必須考慮很多事情。例如,對象庫必須可以被重用。技術還在不停的發展,現有的產品也會很快的更新換代。如果重用沒有能夠實現,那么就需要進行嚴格的控制和管理。 易于使用的開發軟件往往難以編寫。面向對象程序設計工具有望解決這個問題。
1.3 組件式GIS(ComGIS)
1.3.1 組件技術
組件技術的興起
目前,在軟件開發領域,一場新的革命正在悄悄興起,這是由日趨成熟的組件技術引發的。幾年以前,當微軟公司首先使用OLE的時候,其初衷是為了增強軟件的互操作性。然而在使用過程中,人們逐漸認識到這一技術背后的實質性內容和它在軟件開發中所扮演的重要角色。組件技術以前所未有的方式提高了軟件產業的生產效率,這一點已逐步成為軟件開發人員的共識。傳統的C/S結構、群件、中間件等大型軟件系統的構成形式,都將在組件的基礎上重新構造。 組件技術使近二十年來興起的面向對象技術進入到成熟的實用化階段。在組件技術的概念模式下,軟件系統可以被視為相互協同工作的對象集合,其中每個對象都會提供特定的服務,發出特定的消息,并且以標準形式公布出來,以便其他對象了解和調用。組件間的接口通過一種與平臺無關的語言IDL(InterfaceDefineLanguage)來定義,而且是二進制兼容的,使用者可以直接調用執行模塊來獲得對象提供的服務。早期的類庫,提供的是原代碼級的重用,只適用于比較小規模的開發形式;而組件則封裝得更加徹底,更易于使用,并且不限于C++之類的語言,可以在各種開發語言和開發環境中使用。 由于組件技術的出現,軟件產業的形式也隨之發生了很大的變化。大量組件生產商涌現出來,并推出各具特色的組件產品;軟件集成商則利用適當的組件快速生產出用戶需要的某些應用系統;大而全的通用產品逐步減少;很多相對較為專業,但用途廣泛的軟件,如GIS、語音識別系統等,都以組件的形式組裝和擴散到一般的軟件產品中。
0.1.1.1 COM與DCOM
?
COM是組件式對象模型(Component Object Model)的英文縮寫,是組件之間相互接口的規范,是OLE(Object Linking & Embedding)和ActiveX共同的基礎,其作用是使各種軟件構件和應用軟件能夠用一種統一的標準方式進行交互。COM不是一種面向對象的語言,而是一種與源代碼無關的二進制標準。COM所建立的是一個軟件模塊與另一個軟件模塊之間的鏈接,當這種鏈接建立之后,模塊之間就可以通過稱之為“接口”的機制來進行通信。COM標準增加了保障系統和組件完整的安全機制,并擴展到分布式環境。它定義了軟件組件的接口
COM本質上仍然是客戶/服務器模式??蛻簦ㄍǔJ菓贸绦颍┱埱髣摻–OM對象并通過COM對象的接口操縱COM對象。服務器根據客戶的請求創建并管理COM對象??蛻艉头掌鬟@兩種角色并不是絕對的。
基于分布式環境下的COM被稱作DCOM(Distribute COM,分布式構件對象模型)。 DCOM是ActiveX的基礎,它實現了COM對象與遠程計算機上的另一個對象之間直接進行交互。DCOM規范定義了分散對象創建和對象間通信的機制,規范本身并不依賴于任何特定的編程語言和操作系統,但目前該標準只在Microsoft Windows平臺實現,這就意味著其它的操作系統平臺(如UNIX)目前還不支持ActiveX。 DCOM的實現采用了DCOM庫的形式,當DCOM客戶對象需要DCOM服務器對象的服務時,DCOM庫負責生成DCOM服務器對象并在客戶對象和服務器對象之間建立初始連接,一旦返回服務器對象指針,DCOM庫就不再參與客戶對象與服務器對象之間的工作,兩個對象之間可以自由地進行通信。
DCOM接口實際上時邏輯上和語義上相關聯的函數集。服務器對象通過DCOM接口為客戶對象提供服務,客戶對象不需了解服務器對象的內部數據表示。接口可以看成兩個軟件構件之間的一種協議,協議表明服務器對象為客戶對象提供一種且僅此一種服務。接口采用全局唯一標識符(GUID)來保證服務的唯一性。通常的DCOM構件提供多種服務,那么服務器對象為每一種服務實現一個接口。當客戶對象指針指向相應的服務器對象時,它就激活服務器對象接口的相應函數。具體過程是:客戶對象通過DCOM對象必須支持的IunKnown接口獲得其它接口的指針。客戶對象也許并不知道服務器對象的每個接口,但這并不妨礙客戶對象對服務器對象的使用,它只
用它知道的接口。當客戶對象用完服務器對象的服務時,它會通知服務器對象,服務器對象就釋放它所占有的內存。
DCOM的好處是顯而易見的。由于接口的定義和功能保持不變,DCOM構件開發者可以改變接口功能、為對象增加新功能、用更好的對象來代替原有對象,而建立在構件基礎上的應用程序幾乎不用修改,大大提高了代碼的重用性
#e#
1.3.2 組件式GIS
組件式軟件技術已經成為當今軟件技術的潮流之一,為了適應這種技術潮流,GIS軟件象其他軟件一樣,已經或正在發生著革命性的變化,即由過去廠家提供了全部系統或者具有二次開發功能的軟件,過渡到提供組件由用戶自己再開發的方向上來。無疑,組件式GIS技術將給整個GIS技術體系和應用模式帶來巨大影響。
組件式GIS
基本思想是把GIS的各大功能模塊劃分為幾個控件,每個控件完成不同的功能。各個GIS控件之間,以及GIS控件與其它非GIS控件之間,可以方便地通過可視化的軟件開發工具集成起來,形成最終的GIS應用??丶缤欢迅魇礁鳂拥姆e木,他們分別實現不同的功能(包括GIS和非GIS功能),根據需要把實現各種功能的 “積木”搭建起來,就構成應用系統。
組件式GIS系統的特點
(1) 小巧靈活、價格便宜
(2)無須專門GIS開發語言,直接嵌入MIS開發工具
(3) 開發簡捷
把GIS的功能適當抽象,以組件形式供開發者使用,將會帶來許多傳統GIS工具無法比擬的優點。
(1) 小巧靈活、價格便宜 由于傳統GIS結構的封閉性,往往使得軟件本身變得越來越龐大,不同系統的交互性差,系統的開發難度大。在組件模型下,各組件都集中地實現與自己最緊密相關的系統功能,用戶可以根據實際需要選擇所需控件,最大限度地降低了用戶的經濟負擔。。組件化的GIS平臺
集中提供空間數據管理能力,并且能以靈活的方式與數據庫系統連接。在保證功能的前提下,系統表現得小巧靈活,而其價格僅是傳統GIS開發工具的十分之一,甚至更少。這樣,用戶便能以較好的性能價格比獲得或開發GIS應用系統。
(2) 無須專門GIS開發語言,直接嵌入MIS開發工具 傳統GIS往往具有獨立的二次開發語言,對用戶和應用開發者而言存在學習上的負擔。而且使用系統所提供的二次開發語言,開發往往受到限制,難以處理復雜問題。而組件式GIS建立在嚴格的標準之上,不需要額外的GIS二次開發語言,只需實現GIS的基本功能函數,按照Microsoft的ActiveX控件標準開發接口。這有利于減輕GIS軟件開發者的負擔,而且增強了GIS軟件的可擴展性。GIS應用開發者,不必掌握額外的GIS開發語言,只需熟悉基于Windows平臺的通用集成開發環境,以及GIS各個控件的屬性、方法和事件,就可以完成應用系統的開發和集成。目前,可供選擇的開發環境很多,如Visual C++、Visual Basic、Visual FoxPro、Borland C++、Delphi、C++ Builder以及Power Builder等都可直接成為GIS或GMIS的優秀開發工具,它們各自的優點都能夠得到充分發揮。這與傳統GIS專門性開發環境相比,是一種質的飛躍。 (3)、 強大的GIS功能
新的GIS組件都是基于32位系統平臺的,采用InProc直接調用形式,所以無論是管理大數據的能力還是處理速度方面均不比傳統GIS軟件遜色。小小的GIS組件完全能提供拼接、裁剪、疊合、緩沖區等空間處理能力和豐富的空間查詢與分析能力。 (4)、 開發簡捷 由于GIS組件可以直接嵌入MIS開發工具中,對于廣大開發人員來講,就可以自由選用他們熟悉的開發工具。而且,GIS組件提供的API形式非常接近MIS工具的模式,開發人員可以像管理數據庫表一樣熟練地管理地圖等空間數據,無須對開發人員進行特殊的培訓。在GIS或GMIS的開發過程中,開發人員的素質與熟練程度是十分重要的因素。這將使大量的MIS開發人員能夠較快地過渡到GIS或GMIS的開發工作中,從而大大加速GIS的發展。
(5) 更加大眾化 組件式技術已經成為業界標準,用戶可以象使用其他ActiveX控件一樣使用GIS控件,使非專業的普通用戶也能夠開發和集成GIS應用系統,推動了GIS大眾化進程。組件式GIS 的出現使GIS不僅是專家們的專業分析工具,同時也成為普通用戶對地理相關數據進行管理的的可視化工具。
(6)組件式GIS開發平臺的結構 組件式GIS開發平臺通??稍O計為三級結構:
基礎組件
面向空間數據管理,提供基本的交互過程,并能以靈活的方式與數據庫系統連接;
高級通用組件
由基礎組件構造而成,面向通用功能,簡化用戶開發過程,如顯示工具組件、選擇工具組件、編輯工具組件、屬性瀏覽器組件等等。它們之間的協同控制消息都被封裝起來。這級組件經過封裝后,使二次開發更為簡單。如一個編輯查詢系統,若用基礎平臺開發,需要編寫大量的代碼,而利用高級通用組件,只需幾句程序就夠了。面向通用功能;
行業性組件
抽象出行業應用的特定算法,固化到組件中,進一步加速開發過程。以GPS監控為例。對于GPS應用,除了需要地圖顯示、信息查詢等一般的GIS功能外,還需要特定的應用功能,如動態目標顯示、目標鎖定、軌跡顯示等。這些GPS行業性應用功能組件被封裝起來后,開發者的工作就可簡化為設置顯示目標的圖例、軌跡顯示的顏色、鎖定的目標,以及調用、接受數據的方法等。
GIS組件的構成
GIS軟件的模型包含若干功能單元:
空間數據獲取
坐標轉換
圖形編輯
數據存儲
數據查詢
數據分析
制圖表示 ……
可以想象要把這些所有的功能放在一個控件中幾乎是不可能的,即使實現也會帶來系統效率上的低下。一般可以認為GIS構件的設計主要遵循應用領域地需求。例如ESRI地MapObjects就是以空間數據訪問、查詢、制圖為主要目標的GIS構件。
評論
查看更多