程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> BlueViewer 地圖加載分析(C#)

BlueViewer 地圖加載分析(C#)

編輯:關於C語言
加載BlueVIEwer是基於.Net Link進行ArcIMS二次開發的一個實例,裡面包含了WebGIS最基本的一些功能。關於ArcIMS結構及其簡介可以參考我的另外一篇隨筆《ArcIMS體系結構》。關於.Net Link連接器的介紹可以參考《ArcIMS連接器--.Net Link使用方法》。Mars寫了一篇《淺析ArcIMS》,對BlueVIEwer做了簡單的分析。

    使用.Net Link進行ArcIMS二次開發並不復雜,但不少剛剛接觸GIS朋友面對大量JavaScript和ArcXML,加上對WebGIS運行機制不了解,還是感覺無從下手。這篇隨筆將對BlueVIEwer地圖加載顯示機制進行剖析,看看整個代碼的運行過程,代碼語言使用C#。

    使用Html、ArcExplorer、JavaVIEwer客戶端進行開發,需要在客戶端使用JavaScript對ArcXML進行編寫與封裝,雖然ArcXML的傳輸過程變得相對簡單,但對人的耐力絕對是個莫大的考驗,因此一般建議使用ArcIMS的各種連接器進行二次開發,BlueVIEwer就是基於.Net Link進行二次開發的一個實例。

    連接器的主要作用,就是根據客戶端的請求,將請求封裝為ArcXML傳輸到ArcIMS應用服務器,以及將ArcIMS應用服務器發送回來的結果提取出來(一般為圖片),發送給客戶端,響應用戶請求。在客戶端,用戶對地圖的操作及地圖的顯示還是由JavaScript來控制,但相對於在客戶端編寫ArcXML來說,其工作量還是要減輕不少,開發方法更符合OOP,其中.NET Link相對來說在面向對象方面做的不怎麼好,但使用ASP.NET進行開發,.Net Link是不二的選擇。

    下面是對程序啟動地圖顯示過程的分析
----------------------------------------
 
    在default.aspx中有五個隱藏域,hvMinX、hvMinY、hvMaxX、hvMaxY、hvMapPage,前四個對象描述當前地圖顯示范圍,最後一個返回地圖顯示的url。程序啟動第一步就是初始化這些值,在default.ASPx.cs中有詳細描述。

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的中,onload調用main.JS的startUp()方法。在startUp()中,先後調用posLoadingImage()、posBorder()、posBorderNavigation()、posTools()四個方法,它們分別代表圖像加載時的"Loading"圖標、放大縮小圖框、方位移動圖標的定位(A)、下方整個工具狀態欄的位置(B,依賴方位移動圖標的位置)。然後通過handleToolClick()確定當前鼠標操作是放大縮小(iToolMode==1),還是移動圖層(iToolMode==2),通過m_txtXCoord和m_txtYCoord初始化當前X/Y坐標的顯示(C)。



m_imgMapCanvas.onload = hideWaitImage;
    這段代碼說明了在服務器響應用戶操作之前的時刻,客戶端所作的狀態清理工作,hideWaitImage主要的作用是清楚用戶的放大縮小框,隱藏"Loading"圖標。
 
    到目前為止,程序完成了在向ArcIMS應用服務器發送ArcXML之前的所有工作,包括程序界面顯示、客戶端對用戶界面操作的響應,下面緊接著,就是用戶請求的發送與系統服務器端(Web應用服務器、ArcIMS應用服務器和ArcIMS空間服務器統稱)對用戶請求的響應。因為這裡描述的是程序啟動的過程,不涉及到用戶對地圖的實際操作,但用戶對地圖的操作無非是一堆JavaScript代碼,對後面的程序響應過程沒有太多影響。不論是程序啟動,還是用戶對地圖進行操作請求服務,都要通過submit()方法來發送請求並返回系統服務器端響應。

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",此時將調用MakeMap.ASPx頁面並啟動其Page_Load()過程,在這個過程中實現了根據用戶請求封裝ArcXML的發送,和系統服務器端的響應,具體的過程可以參考《ArcIMS連接器--.Net Link使用方法》。頁面會返回用戶所需要的圖片的url,並定義當前地圖的顯示范圍,賦給submit()的各個參數,通過persistExtent()方法將地圖范圍保存在hvMinX、hvMinY、hvMaxX、hvMaxY四個隱藏域中。

    到此,程序完成了整個啟動過程,其界面如上圖所示,當用戶對其進行操作請求服務時,除了Javascript操作不同外,其他過程基本相同。熟悉JavaScript和XML,理解了ArcIMS的體系結構和服務請求過程,進行.Net Link二次開發還是不復雜的。在Ajax橫行天下的年代,將客戶端請求服務和響應客戶端請求的過程用AJax來實現,可以擺脫frame框架的束縛,改善代碼的邏輯結構,增強WebGIS的用戶體驗。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved