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