BlueViewer 地圖加載分析(C#)
??? 作者:Flyingis
??? BlueViewer是基于.NET Link進(jìn)行ArcIMS二次開(kāi)發(fā)的一個(gè)實(shí)例,里面包含了WebGIS最基本的一些功能。關(guān)于ArcIMS結(jié)構(gòu)及其簡(jiǎn)介可以參考我的另外一篇隨筆《ArcIMS體系結(jié)構(gòu)》。關(guān)于.NET Link連接器的介紹可以參考《ArcIMS連接器--.NET Link使用方法》。Mars寫(xiě)了一篇《淺析ArcIMS》,對(duì)BlueViewer做了簡(jiǎn)單的分析。
??? 使用.NET Link進(jìn)行ArcIMS二次開(kāi)發(fā)并不復(fù)雜,但不少剛剛接觸GIS朋友面對(duì)大量JavaScript和ArcXML,加上對(duì)WebGIS運(yùn)行機(jī)制不了解,還是感覺(jué)無(wú)從下手。這篇隨筆將對(duì)BlueViewer地圖加載顯示機(jī)制進(jìn)行剖析,看看整個(gè)代碼的運(yùn)行過(guò)程,代碼語(yǔ)言使用C#。
??? 使用HTML、ArcExplorer、JavaViewer客戶端進(jìn)行開(kāi)發(fā),需要在客戶端使用JavaScript對(duì)ArcXML進(jìn)行編寫(xiě)與封裝,雖然ArcXML的傳輸過(guò)程變得相對(duì)簡(jiǎn)單,但對(duì)人的耐力絕對(duì)是個(gè)莫大的考驗(yàn),因此一般建議使用ArcIMS的各種連接器進(jìn)行二次開(kāi)發(fā),BlueViewer就是基于.NET Link進(jìn)行二次開(kāi)發(fā)的一個(gè)實(shí)例。
??? 連接器的主要作用,就是根據(jù)客戶端的請(qǐng)求,將請(qǐng)求封裝為ArcXML傳輸?shù)紸rcIMS應(yīng)用服務(wù)器,以及將ArcIMS應(yīng)用服務(wù)器發(fā)送回來(lái)的結(jié)果提取出來(lái)(一般為圖片),發(fā)送給客戶端,響應(yīng)用戶請(qǐng)求。在客戶端,用戶對(duì)地圖的操作及地圖的顯示還是由JavaScript來(lái)控制,但相對(duì)于在客戶端編寫(xiě)ArcXML來(lái)說(shuō),其工作量還是要減輕不少,開(kāi)發(fā)方法更符合OOP,其中.NET Link相對(duì)來(lái)說(shuō)在面向?qū)ο蠓矫孀龅牟辉趺春茫褂肁SP.NET進(jìn)行開(kāi)發(fā),.NET Link是不二的選擇。
??? 下面是對(duì)程序啟動(dòng)地圖顯示過(guò)程的分析
----------------------------------------
?
??? 在default.aspx中有五個(gè)隱藏域,hvMinX、hvMinY、hvMaxX、hvMaxY、hvMapPage,前四個(gè)對(duì)象描述當(dāng)前地圖顯示范圍,最后一個(gè)返回地圖顯示的url。程序啟動(dòng)第一步就是初始化這些值,在default.aspx.cs中有詳細(xì)描述。
protected?void?Page_Load(object?sender,?System.EventArgs?e)
{
??if?(!(IsPostBack))
??{
????Session.Add("VALID_USER",?true);
????hvMapPage.Value?=?"MakeMap.aspx";
??}
??if?((Request.QueryString["XMIN"]?==?null?|?Request.QueryString["YMIN"]?==?null?|
????? Request.QueryString["XMAX"]?==?null?|?Request.QueryString["YMAX"]?==?null))
??{
????hvMinX.Value?=?System.Configuration.ConfigurationSettings.AppSettings["DEFAULT_EXTENT_XMIN"];
????hvMinY.Value?=?System.Configuration.ConfigurationSettings.AppSettings["DEFAULT_EXTENT_YMIN"];
????hvMaxX.Value?=?System.Configuration.ConfigurationSettings.AppSettings["DEFAULT_EXTENT_XMAX"];
????hvMaxY.Value?=?System.Configuration.ConfigurationSettings.AppSettings["DEFAULT_EXTENT_YMAX"];
??}
??else
??{
????hvMinX.Value?=?Request.QueryString["XMIN"];
????hvMinY.Value?=?Request.QueryString["YMIN"];
????hvMaxX.Value?=?Request.QueryString["XMAX"];
????hvMaxY.Value?=?Request.QueryString["YMAX"];
??}
}
??? 在default.aspx的<body/>中,onload調(diào)用main.js的startUp()方法。在startUp()中,先后調(diào)用posLoadingImage()、posBorder()、posBorderNavigation()、posTools()四個(gè)方法,它們分別代表圖像加載時(shí)的"Loading"圖標(biāo)、放大縮小圖框、方位移動(dòng)圖標(biāo)的定位(A)、下方整個(gè)工具狀態(tài)欄的位置(B,依賴方位移動(dòng)圖標(biāo)的位置)。然后通過(guò)handleToolClick()確定當(dāng)前鼠標(biāo)操作是放大縮小(iToolMode==1),還是移動(dòng)圖層(iToolMode==2),通過(guò)m_txtXCoord和m_txtYCoord初始化當(dāng)前X/Y坐標(biāo)的顯示(C)。
m_imgMapCanvas.onload?=?hideWaitImage;
??? 這段代碼說(shuō)明了在服務(wù)器響應(yīng)用戶操作之前的時(shí)刻,客戶端所作的狀態(tài)清理工作,hideWaitImage主要的作用是清楚用戶的放大縮小框,隱藏"Loading"圖標(biāo)。
?
??? 到目前為止,程序完成了在向ArcIMS應(yīng)用服務(wù)器發(fā)送ArcXML之前的所有工作,包括程序界面顯示、客戶端對(duì)用戶界面操作的響應(yīng),下面緊接著,就是用戶請(qǐng)求的發(fā)送與系統(tǒng)服務(wù)器端(Web應(yīng)用服務(wù)器、ArcIMS應(yīng)用服務(wù)器和ArcIMS空間服務(wù)器統(tǒng)稱)對(duì)用戶請(qǐng)求的響應(yīng)。因?yàn)檫@里描述的是程序啟動(dòng)的過(guò)程,不涉及到用戶對(duì)地圖的實(shí)際操作,但用戶對(duì)地圖的操作無(wú)非是一堆JavaScript代碼,對(duì)后面的程序響應(yīng)過(guò)程沒(méi)有太多影響。不論是程序啟動(dòng),還是用戶對(duì)地圖進(jìn)行操作請(qǐng)求服務(wù),都要通過(guò)submit()方法來(lái)發(fā)送請(qǐng)求并返回系統(tǒng)服務(wù)器端響應(yīng)。
function?submit()?{

??var?sURL?=?m_hvMapPage.value+"?XMIN="+
????m_mapViewer.getExtent().getLeft()+
????"&YMIN="+m_mapViewer.getExtent().getBottom()+
????"&XMAX="+m_mapViewer.getExtent().getRight()+
????"&YMAX="+m_mapViewer.getExtent().getTop()+
????"&WIDTH="+m_mapViewer.getTagWidth()+
????"&HEIGHT="+m_mapViewer.getTagHeight();

??updateZoomLevel(m_mapViewer.getLevel());
??showWaitImage();

??if?(navigator.userAgent.indexOf('Netscape6/6')?>?-1)?{
????m_lTimerID?=?setInterval("hideWaitImageForNetscape6();",100);
??}

??m_imgMapCanvas.src?=?sURL;

??persistExtent();

}
??? 在default.aspx的Page_Load()中,hvMapPage.Value已被賦值為"MakeMap.aspx",此時(shí)將調(diào)用MakeMap.aspx頁(yè)面并啟動(dòng)其Page_Load()過(guò)程,在這個(gè)過(guò)程中實(shí)現(xiàn)了根據(jù)用戶請(qǐng)求封裝ArcXML的發(fā)送,和系統(tǒng)服務(wù)器端的響應(yīng),具體的過(guò)程可以參考《ArcIMS連接器--.NET Link使用方法》。頁(yè)面會(huì)返回用戶所需要的圖片的url,并定義當(dāng)前地圖的顯示范圍,賦給submit()的各個(gè)參數(shù),通過(guò)persistExtent()方法將地圖范圍保存在hvMinX、hvMinY、hvMaxX、hvMaxY四個(gè)隱藏域中。
??? 到此,程序完成了整個(gè)啟動(dòng)過(guò)程,其界面如上圖所示,當(dāng)用戶對(duì)其進(jìn)行操作請(qǐng)求服務(wù)時(shí),除了JavaScript操作不同外,其他過(guò)程基本相同。熟悉JavaScript和XML,理解了ArcIMS的體系結(jié)構(gòu)和服務(wù)請(qǐng)求過(guò)程,進(jìn)行.NET Link二次開(kāi)發(fā)還是不復(fù)雜的。在Ajax橫行天下的年代,將客戶端請(qǐng)求服務(wù)和響應(yīng)客戶端請(qǐng)求的過(guò)程用Ajax來(lái)實(shí)現(xiàn),可以擺脫frame框架的束縛,改善代碼的邏輯結(jié)構(gòu),增強(qiáng)WebGIS的用戶體驗(yàn)。
??? BlueViewer是基于.NET Link進(jìn)行ArcIMS二次開(kāi)發(fā)的一個(gè)實(shí)例,里面包含了WebGIS最基本的一些功能。關(guān)于ArcIMS結(jié)構(gòu)及其簡(jiǎn)介可以參考我的另外一篇隨筆《ArcIMS體系結(jié)構(gòu)》。關(guān)于.NET Link連接器的介紹可以參考《ArcIMS連接器--.NET Link使用方法》。Mars寫(xiě)了一篇《淺析ArcIMS》,對(duì)BlueViewer做了簡(jiǎn)單的分析。
??? 使用.NET Link進(jìn)行ArcIMS二次開(kāi)發(fā)并不復(fù)雜,但不少剛剛接觸GIS朋友面對(duì)大量JavaScript和ArcXML,加上對(duì)WebGIS運(yùn)行機(jī)制不了解,還是感覺(jué)無(wú)從下手。這篇隨筆將對(duì)BlueViewer地圖加載顯示機(jī)制進(jìn)行剖析,看看整個(gè)代碼的運(yùn)行過(guò)程,代碼語(yǔ)言使用C#。
??? 使用HTML、ArcExplorer、JavaViewer客戶端進(jìn)行開(kāi)發(fā),需要在客戶端使用JavaScript對(duì)ArcXML進(jìn)行編寫(xiě)與封裝,雖然ArcXML的傳輸過(guò)程變得相對(duì)簡(jiǎn)單,但對(duì)人的耐力絕對(duì)是個(gè)莫大的考驗(yàn),因此一般建議使用ArcIMS的各種連接器進(jìn)行二次開(kāi)發(fā),BlueViewer就是基于.NET Link進(jìn)行二次開(kāi)發(fā)的一個(gè)實(shí)例。
??? 連接器的主要作用,就是根據(jù)客戶端的請(qǐng)求,將請(qǐng)求封裝為ArcXML傳輸?shù)紸rcIMS應(yīng)用服務(wù)器,以及將ArcIMS應(yīng)用服務(wù)器發(fā)送回來(lái)的結(jié)果提取出來(lái)(一般為圖片),發(fā)送給客戶端,響應(yīng)用戶請(qǐng)求。在客戶端,用戶對(duì)地圖的操作及地圖的顯示還是由JavaScript來(lái)控制,但相對(duì)于在客戶端編寫(xiě)ArcXML來(lái)說(shuō),其工作量還是要減輕不少,開(kāi)發(fā)方法更符合OOP,其中.NET Link相對(duì)來(lái)說(shuō)在面向?qū)ο蠓矫孀龅牟辉趺春茫褂肁SP.NET進(jìn)行開(kāi)發(fā),.NET Link是不二的選擇。
??? 下面是對(duì)程序啟動(dòng)地圖顯示過(guò)程的分析
----------------------------------------
?
??? 在default.aspx中有五個(gè)隱藏域,hvMinX、hvMinY、hvMaxX、hvMaxY、hvMapPage,前四個(gè)對(duì)象描述當(dāng)前地圖顯示范圍,最后一個(gè)返回地圖顯示的url。程序啟動(dòng)第一步就是初始化這些值,在default.aspx.cs中有詳細(xì)描述。








????? Request.QueryString["XMAX"]?==?null?|?Request.QueryString["YMAX"]?==?null))














??? 在default.aspx的<body/>中,onload調(diào)用main.js的startUp()方法。在startUp()中,先后調(diào)用posLoadingImage()、posBorder()、posBorderNavigation()、posTools()四個(gè)方法,它們分別代表圖像加載時(shí)的"Loading"圖標(biāo)、放大縮小圖框、方位移動(dòng)圖標(biāo)的定位(A)、下方整個(gè)工具狀態(tài)欄的位置(B,依賴方位移動(dòng)圖標(biāo)的位置)。然后通過(guò)handleToolClick()確定當(dāng)前鼠標(biāo)操作是放大縮小(iToolMode==1),還是移動(dòng)圖層(iToolMode==2),通過(guò)m_txtXCoord和m_txtYCoord初始化當(dāng)前X/Y坐標(biāo)的顯示(C)。

??? 這段代碼說(shuō)明了在服務(wù)器響應(yīng)用戶操作之前的時(shí)刻,客戶端所作的狀態(tài)清理工作,hideWaitImage主要的作用是清楚用戶的放大縮小框,隱藏"Loading"圖標(biāo)。
?
??? 到目前為止,程序完成了在向ArcIMS應(yīng)用服務(wù)器發(fā)送ArcXML之前的所有工作,包括程序界面顯示、客戶端對(duì)用戶界面操作的響應(yīng),下面緊接著,就是用戶請(qǐng)求的發(fā)送與系統(tǒng)服務(wù)器端(Web應(yīng)用服務(wù)器、ArcIMS應(yīng)用服務(wù)器和ArcIMS空間服務(wù)器統(tǒng)稱)對(duì)用戶請(qǐng)求的響應(yīng)。因?yàn)檫@里描述的是程序啟動(dòng)的過(guò)程,不涉及到用戶對(duì)地圖的實(shí)際操作,但用戶對(duì)地圖的操作無(wú)非是一堆JavaScript代碼,對(duì)后面的程序響應(yīng)過(guò)程沒(méi)有太多影響。不論是程序啟動(dòng),還是用戶對(duì)地圖進(jìn)行操作請(qǐng)求服務(wù),都要通過(guò)submit()方法來(lái)發(fā)送請(qǐng)求并返回系統(tǒng)服務(wù)器端響應(yīng)。






















??? 在default.aspx的Page_Load()中,hvMapPage.Value已被賦值為"MakeMap.aspx",此時(shí)將調(diào)用MakeMap.aspx頁(yè)面并啟動(dòng)其Page_Load()過(guò)程,在這個(gè)過(guò)程中實(shí)現(xiàn)了根據(jù)用戶請(qǐng)求封裝ArcXML的發(fā)送,和系統(tǒng)服務(wù)器端的響應(yīng),具體的過(guò)程可以參考《ArcIMS連接器--.NET Link使用方法》。頁(yè)面會(huì)返回用戶所需要的圖片的url,并定義當(dāng)前地圖的顯示范圍,賦給submit()的各個(gè)參數(shù),通過(guò)persistExtent()方法將地圖范圍保存在hvMinX、hvMinY、hvMaxX、hvMaxY四個(gè)隱藏域中。
??? 到此,程序完成了整個(gè)啟動(dòng)過(guò)程,其界面如上圖所示,當(dāng)用戶對(duì)其進(jìn)行操作請(qǐng)求服務(wù)時(shí),除了JavaScript操作不同外,其他過(guò)程基本相同。熟悉JavaScript和XML,理解了ArcIMS的體系結(jié)構(gòu)和服務(wù)請(qǐng)求過(guò)程,進(jìn)行.NET Link二次開(kāi)發(fā)還是不復(fù)雜的。在Ajax橫行天下的年代,將客戶端請(qǐng)求服務(wù)和響應(yīng)客戶端請(qǐng)求的過(guò)程用Ajax來(lái)實(shí)現(xiàn),可以擺脫frame框架的束縛,改善代碼的邏輯結(jié)構(gòu),增強(qiáng)WebGIS的用戶體驗(yàn)。
posted on 2006-09-03 23:14 Flyingis 閱讀(2722) 評(píng)論(5) 編輯 收藏 所屬分類: ArcIMS