使用ashx擴展開發AjaxMap

          Posted on 2008-08-28 11:00 黎民 閱讀(429) 評論(0)  編輯  收藏 所屬分類: GIS原理
          AjaxMap是SuperMap IS.NET利用Ajax技術封裝的地圖控件,充分發揮了Ajax的技術優勢。在客戶端調用AjaxMap構建的WebGIS發布網站可以使瀏覽者獲得更好的用戶體驗。即使是讀取比較大的GIS數據,在讀取數據的過程中,用戶所面對的不再是白屏,而是原來的頁面,只有當接受到全部數據后才更新相應部分的內容,而這種更新也是瞬間的,用戶幾乎感覺不到。

          由于AjaxMap上述的優點,現在采用AjaxMap來進行開發的用戶在不斷的增多,對AjaxMap也就提出了更高的要求,但是目前AjaxMap提供的接口有限,通過什么手段來實現AjaxMap的功能呢?那就是.ashx 文件。


            .ashx文件與.aspx文件類似,可以通過它來調用HttpHandler類,它免去了普通.aspx頁面的控件解析以及頁面處理的過程。.ashx文件適合產生供瀏覽器處理的、不需要回發處理的數據格式,例如用于生成動態圖片、動態文本等內容。使用.ashx可以讓您專注于編程而不用管相關的WEB技術。下面的例子就是使用.ashx和Ajax技術來實現獲取地圖圖層名稱的功能。


            具體流程是,先通過頁面的Xmlhttprequest對象,向layer.ashx發送請求,由這個頁面與地圖服務器進行交互,獲得地圖圖層名,然后通過返回一個字符串,從后臺得到,然后再進行解析,具體過程如圖1所示。是不是很像Ajax交互的過程?

          下面按照如上思路來具體實現一下。


          1、添加ashx文件,編寫代碼。
            首先來打開AjaxMap的工程,添加一個Generic Handler的新項,名字叫layer.ashx。在工程中添加引用,就是安裝目錄下SDK里面的所有內容。部分代碼如下:
          添加命名空間
          using System.Web;
          using SuperMap.IS.Utility;
          using SuperMap.IS.Web;
          編寫ProcessRequest函數代碼,接受前臺傳遞過來的方法名稱、地圖名稱。
          public void ProcessRequest(HttpContext context)
          {
          m_map = TcpMap.Create("localhost", 8800, new Hashtable());
          string strMethod = context.Request["method"];
          string strMapName = context.Request["mapname"];
          string strRequestText = string.Empty;
          switch (strMethod)
          {
          case "getAllLayersName"://將獲取圖層的過程放到GetLayersName函數當中,方便以后的擴展
          strRequestText = GetLayersName(strMapName);
          break;
          }
          context.Response.ContentType = "text/plain";
          context.Response.Write(strRequestText);//將獲得的圖層名稱返回
          編寫GetLayersName函數,獲得圖層名稱
          protected string GetLayersName(string mapName)
          {
          string strTmp = string.Empty;

          MapImage mi = m_map.GetDefaultMapImage(mapName, 0, 0);
          MapParam mp = m_map.GetCurrentMapParam();
          Layer[] layers = mp.Layers;
          strTmp = "layersname:";
          for (int i = 0; i < layers.Length; i++)
          {
          strTmp += layers[i].Name + ",";
          }
          return strTmp;
          }
          和TcpMap的調用方式是一樣的。
          2、腳本的代碼
          定義Xmlhttprequest對象,使用異步調用方式。
          var xmlhttprequest=null;
          function getAllLayersName()
          {
          if (null==xmlhttprequest)
          {
          xmlhttprequest = _GetXmlHttpRequest();//使用AjaxMap中的_GetXmlHttpRequest方法來初始化xmlhttprequest對象。
          }
          xmlhttprequest.open("get","layer.ashx?method=getAllLayersName&mapname=changchun",false);//向layer.ashx發送參數
          xmlhttprequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
          xmlhttprequest.onreadystatechange=onCompleteReturn;//定義回調的函數
          xmlhttprequest.send(null);
          }
          編寫回調函數的代碼
          function onCompleteReturn()
          {
          var readyState=xmlhttprequest.readyState;
          if (readyState==4)//判斷對象狀態,4為完成
          {
          var status=xmlhttprequest.status;
          if(status==200)//信息已經返回開始處理信息
          {
          var strLayersName= xmlhttprequest.responseText;//得到返回的字符串
          if(strLayersName!= null)
          {
          alert(strLayersName);
          }
          }
          else
          {
          if(onError)//出錯的處理
          {
          }
          }
          xmlhttprequest = null;
          }
          }
            為了節省篇幅,這里就不對返回的值進行解析了。
          整個實現過程就是這樣,大部分地圖功能都可以通過這種方式來實現。請注意,是大部分而不是全部,凡是涉及出圖方面的操作都不能使用這種方式來實現,例如:制作專題圖等操作。AjaxMap就是通過這種方法來實現的,其中的出圖的操作已經被封裝好了,沒有辦法對其進行修改,這也是出圖的操作不能實現的原因。

          posts - 57, comments - 3, trackbacks - 0, articles - 1

          Copyright © 黎民

          主站蜘蛛池模板: 镇原县| 泸水县| 武安市| 石棉县| 登封市| 山西省| 柞水县| 乳源| 西畴县| 于田县| 榕江县| 宣汉县| 武平县| 巩留县| 封开县| 高青县| 县级市| 邵武市| 定日县| 东宁县| 绵阳市| 杭锦旗| 新余市| 淮阳县| 达州市| 锦屏县| 志丹县| 宜川县| 谢通门县| 吴桥县| 栾城县| 贡山| 康乐县| 华亭县| 柳州市| 唐河县| 隆化县| 旬阳县| 铜陵市| 苗栗市| 安仁县|