Hopes

          Start Here..

           

          淺析ArcIMS

          淺析ArcIMS

          引言

          最早使用的ArcIMS是3.5還是4.0忘記了,很久前的事情了。當(dāng)時是做一個簡單的系統(tǒng),包括地圖的 顯示,點(diǎn)擊顯示一個點(diǎn)對象的屬性信息,對這些屬性的查詢,以及添加點(diǎn)對象到一個圖層。顯示和界面的東西都不需要編程實(shí)現(xiàn),使用ArcIMS的Author 和Design就可以了,然后簡單調(diào)整一下布局和顏色,由于是內(nèi)部使用,這部分無所謂。而添加點(diǎn)對象到某個圖層,就需要使用其他方法了,當(dāng)時的做法是使用 MO封裝了一個ActiveX EXE(MO無法封裝為ActiveX DLL),然后通過ASP調(diào)用。

          這次重拾ArcIMS,安裝、試用,第一感覺是很熟悉,畢竟這么多版本以來,ArcIMS變化不大,或者說,沒有什么變化。第二是ArcIMS速度挺快,這2年也用過MapXtreme、MapServer,一直以為ArcIMS慢,這次安裝后發(fā)現(xiàn)其實(shí)挺快。因?yàn)闆]有測試數(shù)據(jù),一臺計算機(jī)也不好做測試,不過感覺上,ArcIMS占上風(fēng),這也許和其實(shí)現(xiàn)有關(guān),后面再說。

          幾個要點(diǎn):
          • ArcIMS的定位是空間數(shù)據(jù)發(fā)布系統(tǒng),雖然也可以做進(jìn)一步定制和開發(fā),但因?yàn)锳rcIMS的定位,有些事情很難或無法實(shí)現(xiàn),例如無法(很難)使用ArcIMS進(jìn)行復(fù)雜的空間分析(嗯,可以調(diào)用AO或者M(jìn)O,這個另當(dāng)別論)。
          • ArcIMS和目前的ArcGIS Server不是一個基礎(chǔ),后者基于由COM實(shí)現(xiàn)的AO,不過由于ArcIMS任務(wù)單一,所以效率較高,而且可以跨平臺(核心代碼應(yīng)該是ArcInfo時代的純C++?)。
          • Web服務(wù)器的Application Server Connector和ArcIMS的應(yīng)用服務(wù)器(Application Server)的通信是基于Servlet發(fā)送ArcXML,因此需要安裝Java環(huán)境和Servlet運(yùn)行環(huán)境。ArcIMS的Author和Design、Administrator也是基于Java實(shí)現(xiàn)。
          • ArcIMS的幾個主要部件:
            • Application Server Connectors,即ArcIMS定制開發(fā)的API,有Java、ActiveX、.net等API,但最終和Application Server通信,都需要將請求轉(zhuǎn)換為ArcXML,由Servlet Connector發(fā)送給Application Server,這也是為什么ArcIMS需要一個Servlet運(yùn)行環(huán)境的原因;
            • Application Server,應(yīng)該是基于Java實(shí)現(xiàn),主要用于維護(hù)Spatial Server的狀態(tài)及其與Web服務(wù)器的交互。
            • Spatial Server,核心的地圖渲染器,基于C++實(shí)現(xiàn)?主要用于根據(jù)請求渲染地圖,即地圖render。
          • ArcIMS的開發(fā)模式:
            • 使用Author、Designer通過可視化方式來設(shè)計地圖,發(fā)布,無須編程;
            • 使用Connectors來開發(fā),目前可以使用ASP、.net、Java等等方式來開發(fā)。
          • 閑話,記得有過ArcView IMS,MO IMS的產(chǎn)品,沒有使用過,應(yīng)該是類似MapXtreme for Windows的產(chǎn)品,這個東東是基于MapX實(shí)現(xiàn)的,而MapXtreme.net和MapXtreme for Java則是比較純粹的產(chǎn)品。
          • ArcIMS的核心是ArcXML,ArcXML是Web服務(wù)器的Application Server Connector,Application Server,Spatial Server之間的通訊協(xié)議(語言),其調(diào)用模式類似Web Service。

          ArcIMS的架構(gòu)

          ArcIMS的體系結(jié)構(gòu)如下圖所示:

           

          這個結(jié)構(gòu)應(yīng)該是在ArcIMS 3.0的時候就確定下來的,之后基本沒有什么變化。ArcIMS 3.0的發(fā)布時間是2000年,而2000年正是3-tier架構(gòu)開始成為主流的年代。

          每 層具體的說明可以查看ArcIMS的文檔,早先的文檔和資料一般把客戶端歸于表現(xiàn)層,Web Server、Application Server、Spatial Server歸于邏輯層,空間數(shù)據(jù)歸于數(shù)據(jù)層。其實(shí)與這些層次做一一對應(yīng)也無大的必要。其中的Web Server及Application Server Connectors可以部署在一臺計算機(jī);Application Server可以部署在一臺計算機(jī);而Spatial Server可以部署于多臺計算機(jī),由Application Server管理;數(shù)據(jù)則可以是文件,SDE等格式。實(shí)際中,一般把Spatial Server安裝于多臺計算機(jī),因?yàn)镾patial Server是整個系統(tǒng)中負(fù)荷最重的部分,執(zhí)行了大部分的運(yùn)算任務(wù)。

          Application Server管理Spatial Server,處理ArcXML請求,并返回ArcXML的結(jié)果,對于不同的開發(fā)接口(Connector),或者也處理這樣的XML,或者由 Connector封裝了此類請求,然后在后臺與Application Server交互。

          運(yùn)行于Application Server的地圖服務(wù)(Service)是無狀態(tài)的,也就是說他只是根據(jù)ArcXML請求,調(diào)度Spatial Server來不斷的生成圖片或者其他數(shù)據(jù),然后以ArcXML的格式返回給Web Server的Application Server Connectors。因此,用戶(地圖)的狀態(tài),例如當(dāng)前的縮放比例,位置等,或者在Web服務(wù)器端通過Seesion保留,或者在客戶端通過某種方式 保留(如表單的隱藏域,Url參數(shù)等等)。

          對于WebGIS的架構(gòu)和實(shí)現(xiàn),可以參照筆者以前寫過的幾篇文章,應(yīng)該對理解ArcIMS的架構(gòu)有用處:

          WebGIS系統(tǒng)的設(shè)計與實(shí)現(xiàn)
          http://maweifeng.cnblogs.com/articles/210080.html

          使用.net Remoting和SuperMap Object設(shè)計WebGIS系統(tǒng)
          http://maweifeng.cnblogs.com/articles/250284.html

          開發(fā)模式與運(yùn)行機(jī)制

          使 用ArcIMS的設(shè)計工具Author、Designer來編輯Axl定義文件,增加地圖服務(wù),定制Html客戶端或者Java客戶端,發(fā)布地圖服務(wù),這 種開發(fā)模式都屬于客戶端處理模式;而使用ActiveX Connector,.Net Link的方式開發(fā),則屬于服務(wù)器端處理模式。這里的處理是指處理ArcXML。

          客戶端處理模式,使用Html客戶端或者定制Html客戶端開發(fā)。系統(tǒng)的運(yùn)行機(jī)制如下:

           

          這種模式下,客戶端的請求已經(jīng)是ArcXML格式封裝的,然后由Web服務(wù)器委托Application Server Connectors處理,由于請求已經(jīng)是ArcXML格式,Connector的任務(wù)只是簡單的把請求轉(zhuǎn)發(fā)給Application Server。

          這種模式下,發(fā)送和返回請求都需要在客戶端來處理,因此,ArcIMS的Html客戶端的JS代碼行數(shù)達(dá)到萬行級別,也就不奇怪了。另外,返回和發(fā)送ArcXML,其中很多數(shù)據(jù)都是無關(guān)緊要或者不需要的,對于網(wǎng)絡(luò)通信,也是一個負(fù)擔(dān)。

          得到服務(wù)器端返回的ArcXML后,客戶端JS負(fù)責(zé)解析,然后再在服務(wù)器下載需要的圖片,顯示在客戶端。

          相 關(guān)的代碼在HtmlViewer的Javascript代碼的aimsMap.js這個文件內(nèi),一般的地圖操作設(shè)置參數(shù)后調(diào)用sendMapXML函數(shù), 然后此函數(shù)再調(diào)用sendToServer函數(shù),最后由htmlSendToServer通過表單方式發(fā)送請求(沒有使用XMLHttpRequest對 象,所有XML操作都是由JS完成)。ArcIMS文檔中的“Customizing_the_HTML_Viewer.pdf”中對 HtmlViewer的結(jié)構(gòu)、運(yùn)行原理、定制有詳細(xì)的說明,可以作為參考。

          對于ArcExplorer,JavaViewer等都是使用客戶端處理模式。

          服務(wù)器端處理模式,包括使用Java、ASP、.net等開發(fā)的方式來定制開發(fā)的ArcIMS應(yīng)用。其運(yùn)行機(jī)制如下:

           

          對 于服務(wù)器處理模式,ArcXML的轉(zhuǎn)換、解析在服務(wù)器端由Application Server Connector進(jìn)行。客戶端的代碼由服務(wù)器端的ASP、JSP等程序動態(tài)生成。客戶端發(fā)送地圖服務(wù)請求后,由服務(wù)器端的API轉(zhuǎn)換為ArcXML,然 后由Servlet發(fā)送給Application Server。

          與客戶端處理模式比較,服務(wù)器端處理模式的優(yōu)勢有:更少的數(shù)據(jù)傳輸,更易與其他程序集成等。

          采用服務(wù)器處理模式開發(fā),客戶端還是需要處理用戶操作,例如放大縮小,要獲得好的用戶交互體驗(yàn),這部分還是需要較強(qiáng)的JS才可以完成,好在ArcIMS的例子中提供的JS代碼已基本夠用。

          下面將分別以ActiveX Connector和.net Link為例來分析ArcIMS的開發(fā)。

          使用.net Link

          .net Link是使用.net Framework來開發(fā)ArcIMS應(yīng)用程序的API。使用.net Link的步驟為:

          1. 增加.NET Link的程序集引用到項目,程序集位于目錄:
          <ArcIMS Installation Directory>\ArcIMS\Connectors\NET_Link

          2. 連接到Application Server,可以使用HTTP或者TCP連接,例如下面的代碼建立一個TCP連接:

          using ESRI.ArcIMS.Server;
          ..
          ServerConnection connection= new ServerConnection();
          connection.Host="localhost";
          connection.AppServerPort=5300;
          connection.Scheme=Scheme.TCP;

          3. 發(fā)送一個ArcXML request。

          4. 處理返回的ArcXML response。

          和HTML下的JS相比,.net Link只是把XML操作使用.net程序集封裝了,并不是一個很面向?qū)ο蟮姆庋b,還需要開發(fā)者處理“機(jī)器友好,人類不友好”的XML。這也是筆者對.net Link比較失望的原因。

          下面來看看隨ArcIMS一起安裝的.net Link的例子“BlueViewer”。工程的設(shè)置,數(shù)據(jù)安裝,ArcIMS的設(shè)置請參考例子目錄下的readme.htm。

          設(shè)置好以后就可以在瀏覽器中打開這個站點(diǎn),是一個包括了放大縮小等簡單功能的地圖服務(wù),如下圖所示:



          用VS 2003打開工程,其解決方案如下圖所示:

           

          其中的核心是js代碼和MakeMap.aspx這個文件,我們來做一個分析。

          程 序的default.aspx中除了界面元素,定義了hvMinX、hvMinY、hvMaxX、hvMaxY、hvMapPage,為 HtmlControls.HtmlInputHidden類型(表單的隱藏域),前4個對象的值指示當(dāng)前地圖的范圍,最后一個則用來獲取地圖的url。

          在Page_Load過程中,有如下的語句:

          hvMapPage.Value = "MakeMap.aspx"

          也 就是說,hvMapPage對象的值最終由MakeMap.aspx來返回。我們先看看MakeMap.aspx這個文件。這個文件的邏輯很簡單,在 Page_Load過程中根據(jù)地圖范圍發(fā)送一個ArcXML請求,并獲得Response,解析這個XML,最終如果成功,則定向到生成的圖片文件 url,或者返回錯誤信息:

          If bRequestFailed Then
               ...
          Else
               Response.Redirect(imageURL)
          End If

          這樣,通過重定向,最終由ArcIMS生成的圖片的地址被賦值給default.aspx中hvMapPage的值,我們再回到default.aspx,看這個圖片最終是如何顯示出來的。

          在default.aspx中,在頁面的load事件中調(diào)用了js函數(shù)startUp():

          <BODY onload="startUp()" MS_POSITIONING="GridLayout" style="MARGIN: 0px">

          startUp()定義在main.js中。在startUp()中通過一系列的初始化,然后顯示Loading圖片(加載地圖的那段動畫),并指定事件:

          m_imgMapCanvas.onload = hideWaitImage;

          即當(dāng)m_imgMapCanvas(最終顯示的地圖的圖片)顯示以后,調(diào)用hideWaitImage過程,隱藏Loading圖片(NC需要特殊處理)。

          最 后調(diào)用submit函數(shù)。submit函數(shù)根據(jù)目前的地圖范圍,發(fā)送一個submit,這時候,服務(wù)器端MakeMap.aspx就會運(yùn)行,最后把結(jié)果 (圖片的url)保存在hvMapPage的值中。我們在default.aspx中也看到,MakeMap.aspx也必須是提交表單后才運(yùn)行,就是這 個道理。

          請求(submit)返回后,替換顯示圖片的url:

          m_imgMapCanvas.src = sURL;

          而m_imgMapCanvas就是default.aspx中中間顯示地圖的區(qū)域,為一個<img>。

          對于NC需要特殊處理以隱藏Loading圖片,對于IE則自動調(diào)用hideWaitImage函數(shù)來隱藏之。最后調(diào)用persistExtent函數(shù)把地圖范圍保存在hvMinX等幾個隱藏的表單域中。

          這樣,我們就對這個例子的運(yùn)行機(jī)制和過程做了一個縱向的剖析,從中我們也看到,.net或者ASP.net的工作其實(shí)很少,僅僅是發(fā)送和解析ArcXML請求,地圖的顯示和操作都集中在JS代碼中。

          使用ActiveX Connector來開發(fā)

          ActiveX Connector應(yīng)該是ArcIMS里比較成熟的一個API,另外的應(yīng)該是Java的API。

          ArcIMS的例子在Samples的ActiveX目錄下,ActiveX_Samples是使用ASP來操作ArcIMS的一些例子,例如獲得一幅地圖:

          Set mConnector = Server.CreateObject("aims.ArcIMSConnector")
          mConnector.ServerName = "localhost"    
          mConnector.ServerPort = 5300
          Set mMap = Server.CreateObject("aims.Map")    
          resultInit = mMap.InitMap( mConnector, "SanFrancisco" )
          mMap.Width = 500    
          mMap.Height = 300
          mMap.BackColor = 15130848
          urlImage = mMap.GetImageAsUrl()
          Response.write "<IMG SRC=" + urlImage + ">"

          創(chuàng)建aims.ArcIMSConnector對象,與Application Server的連接,創(chuàng)建Map對象,并與一個Service綁定,然后設(shè)置大小,調(diào)用GetImageAsUrl返回一個圖片的Url。

          ActiveX_Template目錄下有圖層、地圖、選擇操作等一些模版,可以在自己的程序中使用。大多程序都通過Session來保存地圖對象,然后通過該對象來運(yùn)行。

          和.net Link比較,ActiveX Connector是一個比較成熟的API,但由于ASP本身的限制,使用ASP來開發(fā)ArcIMS應(yīng)用的會越來越少。

          Ajax及其他

          目前流行的地圖應(yīng)用是Ajax客戶端,比較“老土”的ArcIMS似乎已經(jīng)很落后了。但如果了解現(xiàn)今網(wǎng)絡(luò)地圖的基本原理,也了解WebGIS的架構(gòu)和原理,那么,使用ArcIMS作為后端,開發(fā)一個類似的應(yīng)用也不是難事。國外已經(jīng)有人在做了,推薦一個站點(diǎn):

          http://www.mapdex.org/blog/

          本文的后續(xù)版本也許也會涉及這個話題。

          總結(jié)

          由本文的敘述,我們可以得出下面一些結(jié)論:

          1. ArcXML,深入編程需要了解ArcXML,因?yàn)楹芏嗖僮鞅仨氉约簩慉rcXML來請求Application服務(wù)器,特別是對于.net Link這樣的API;

          2. JavaScipt,其實(shí)對于所有的WebGIS開發(fā),這點(diǎn)都必不可少;客戶端操作,自定義的操作,和其他應(yīng)用在UI的集成,都需要使用JS。

          3. 服務(wù)器端開發(fā)技術(shù),需要的不多,大概看看書就可以照貓畫虎了。

          4. 由于目前ESRI的主要精力在ArcGIS系列上,因此ArcIMS下一版本的.net Link等是否會得到加強(qiáng),目前還不得而知。

          5. 對于.net運(yùn)行時,1.1和2.0筆者使用好像都可以,畢竟只是一個程序集的事情,而且要做的事情不多,估計是兼容的。

          6. 最后,ESRI的很多產(chǎn)品,由于其歷史“悠久”和用戶眾多,因此尋找有關(guān)問題的答案還是很容易的,只要可以上網(wǎng),有Google可用,大多問題都有答案。

          posted on 2012-06-18 16:02 ** 閱讀(136) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計

          公告

          你好!

          常用鏈接

          留言簿(2)

          隨筆檔案

          文章分類

          文章檔案

          新聞檔案

          相冊

          收藏夾

          C#學(xué)習(xí)

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 建德市| 小金县| 梁河县| 高平市| 方正县| 文山县| 新竹县| 淅川县| 哈密市| 水城县| 丁青县| 贺兰县| 弥勒县| 达州市| 尉氏县| 望奎县| 班玛县| 安仁县| 乌拉特后旗| 灌云县| 衡水市| 彭州市| 泰来县| 皋兰县| 崇左市| 卓资县| 宝兴县| 台北县| 安图县| 社旗县| 谢通门县| 阜宁县| 象州县| 昌都县| 耿马| 高邮市| 福州市| 大冶市| 平邑县| 宿州市| 新巴尔虎右旗|