進(jìn)行ARCIMS的二次開發(fā),必須首先理解ArcIMS的原理: ArcIMS是一個基于B/S結(jié)構(gòu)的服務(wù),它與我們常常談?wù)摰腁rcMap等程序完全不同。在安裝完IMS后,我們必須先使用Author設(shè)計一個要發(fā)布 的地圖,在這個工具里面可以引入數(shù)據(jù),進(jìn)行著色,標(biāo)注,顯示提示文本等信息,它建構(gòu)的地圖將會在將來的地圖發(fā)布中出現(xiàn)。當(dāng)我們完成一幅地圖的設(shè)計后,將把 它保存為一個AXL文件,這是一個ArcXML文件,它里面保存在許多地圖的原始信息,比如數(shù)據(jù)的來源,范圍,如何著色等等。
生成了AXL文件以后,我們就需要建立數(shù)據(jù)服務(wù),即想辦法讓這個數(shù)據(jù)可以在網(wǎng)絡(luò)上發(fā)布。建立服務(wù)的工作是在管理器中完成的,服務(wù)有多種形式,如矢量、柵格
和ArcMap服務(wù)等。服務(wù)是運行在內(nèi)存中的一段進(jìn)程,我們可以將它理解為一個運行在后臺而沒有界面管理的程序——這種程序很多,MYSQL、
ORACLE都是服務(wù),我們不打開他們的管理界面程序照樣可以使用這些服務(wù)。對這些服務(wù),我們需要做的是監(jiān)聽它們的默認(rèn)端口,看看它接收和返回什么信息。 建立了一個數(shù)據(jù)服務(wù)后,在服務(wù)器上要干的事情都完成了一大半。接下來的工作就是產(chǎn)生一個WEB站點,用于監(jiān)聽端口以實現(xiàn)電子地圖的效果。這個工作我們即可 以自己從頭編寫代碼(這就是二次開發(fā)),也可以使用IMS自己帶的設(shè)計器來設(shè)計一個站點。設(shè)計器可以使用HTML/javaSCRIPT和java兩種方法來建構(gòu)一個站點,但無論如何,這個站點都是用于監(jiān)聽相應(yīng)的服務(wù)的。 以HTML/javaSCRIPT站點為例,它是如何工作的呢。我們知道,HTML中無論如何也出現(xiàn)不了什么“動態(tài)”的效果,只有使用javaSCRIPT配合,才能有點DHTML的效果出現(xiàn),勉強出現(xiàn)一點“動”。當(dāng)我們在一個WEB站點上看地圖的時候,比如放大地圖,絕對不是說有一個特殊的控件使得地圖在縮放,而是前后出現(xiàn)了兩張不同的圖片,由于間隔時間短,使得我們有了這個“動態(tài)”的感覺。 當(dāng)我們使用放大工具在圖片上拖曳的時候,頁面會調(diào)用一個javaSCRIPT 函數(shù),產(chǎn)生一個ArcXML請求,這個請求包含了相關(guān)的信息,如希望出現(xiàn)的新圖片的范圍,數(shù)據(jù)等等。這個請求被一個表單發(fā)送到相應(yīng)的服務(wù),服務(wù)接收到請求 后,會進(jìn)行處理,它除了產(chǎn)生一張圖片,還會沿反向路徑傳遞出ArcXML響應(yīng),而我們的頁面程序,在接收到響應(yīng)后,需要對這個響應(yīng)進(jìn)行解析,如果是查看地 圖,就是解析出新圖片的地址,然后將它傳給一個圖片對象,這樣,圖片就改變了,我們看起來地圖就被放大了。 上面簡要介紹的這些,就是XML的基本原理。實際上,XML的請求有多種,而解析方法也有很多形式,特別是所謂的“連接器”也有不同的類型,使得進(jìn)行二次開發(fā)擁有多種方式,但總體而言,使用HTML/javaSCRIPT是最簡單的,也是最麻煩的。 ArcGIS Server的編程模型 使用ArcGIS Server編程,實際上就是利用運行在服務(wù)器上的ArcObjects編程。原來在桌面系統(tǒng)上開發(fā)ArcObjects應(yīng)用的開發(fā)人員能夠在學(xué)習(xí)遠(yuǎn)程ArcObjects編程的規(guī)則和編程模式之后進(jìn)行ArcGIS Server的應(yīng)用開發(fā)。熟悉ArcObjects編程模型的開發(fā)人員只需要使用框架(ASP.NET 和JAVA)進(jìn)行Internet 編程的知識。 ArcGIS Server有三種API:Server API,.NET Web Controls以及Java Web Controls。 Server API就是ArcObjects的對象庫。遠(yuǎn)程ArcObjects編程與在桌面應(yīng)用中ArcObjects編程基本是一致的,需要的更多編程細(xì)節(jié)和規(guī)則是:
(1) 如何連接到服務(wù)器;
(2) 得到運行在服務(wù)器上的服務(wù)器對象;
(3) 在服務(wù)器上創(chuàng)建新的對象;
(4) 使用遠(yuǎn)程ArcObjects編程的最佳方式。
剩下的工作就是如何使用ArcObjects的對象完成自己的工作了。ArcGIS Server對象庫包括細(xì)粒的ArcObjects對象和粗粒的ArcObjects對象,它們按功能邏輯劃分成不同的組件。具體的劃分和功能請參考軟件的聯(lián)機幫助。
其中服務(wù)器對象是粗粒的ArcObjects對象,其運行在SOM上,在9.0版本中,提供MapServer和GeocodeServer對象。服務(wù)器對象使用細(xì)粒的ArcObjects對象,應(yīng)用開發(fā)可以使用這些粗粒的服務(wù)器對象,也可以通過粗粒的服務(wù)器對象來訪問ArcObjects中細(xì)粒的對象。服務(wù)器對象可以用GIS服務(wù)器管理員提前配置生成。
使用ArcGIS Server編程時將會涉及到Server Context、Pooling、Stateful以及Stateless等概念。Server Context是服務(wù)器上下文,是運行一組服務(wù)器對象的服務(wù)器上的保留空間,由運行服務(wù)器對象的服務(wù)器管理。我們可以通過持有上下文來保持一個服務(wù)器對象活動,服務(wù)器對象就生存在服務(wù)器上下文中,通常,我們可以通過以下方式獲取一個服務(wù)器對象:
som = serverConnection.ServerObjectManager
sc = som.CreateServerContext(“
so = sc.ServerObject
釋放一個服務(wù)器對象可以通過sc.ReleaseContext來實現(xiàn)。
池式(Pooling)的服務(wù)器對象提前被構(gòu)造和初始化,它能限制實例的個數(shù),實例能被多個會話共享,用來支持更多用戶的請求。非池式的對象每次需要重新構(gòu)造和初始化,并在返回服務(wù)器時析構(gòu),它能限制最大實例數(shù),每一個會話使用一個實例 。
服務(wù)器對象可以有狀態(tài)和無狀態(tài)使用。無狀態(tài)(即只讀)使用時,可以和其他用戶、并發(fā)會話共享服務(wù)器對象。有狀態(tài)(即讀寫)使用時,不可以和其他用戶、會話共享服務(wù)器對象。因此,池式的服務(wù)器對象只能在無狀態(tài)行為中使用,非池式的服務(wù)器對象能在有狀態(tài)的行為中使用。大多數(shù)GIS Web應(yīng)用都是有狀態(tài)的,通??梢酝ㄟ^寫一個有狀態(tài)的Web應(yīng)用來調(diào)用無狀態(tài)的Web服務(wù)器對象。
使用ArcGIS Server開發(fā)Web應(yīng)用之外,開發(fā)人員也可以用它來創(chuàng)建GIS Web Services。和Web應(yīng)用不一樣的地方是,Web Services是提供給其它應(yīng)用程序使用,而不是最終用戶使用。ArcGIS Server支持兩種類型的Web Services:Application Web Services和ArcGIS Server Web Services。Application Web Services能夠用本地的Web Server上的Web Services框架來實現(xiàn),例如ASP.NET Web Service[WebMethod]或者Java Web Service[Axis]等,此時,我們需要使用本地或應(yīng)用程序自身的數(shù)據(jù)類型作為參數(shù)或返回值來傳遞。ArcGIS Server Web Services是處理和執(zhí)行運行在GIS Server上的MapServer和GeocodeServer對象,這兩個對象具有SOAP接口,能夠處理SOAP請求。ArcGIS Server Web Services能夠使用所有的ArcObjects對象類型,例如ArcObjects Geometry類型。 型。 |
|