Flyingis

          Talking and thinking freely !
          Flying in the world of GIS !
          隨筆 - 156, 文章 - 16, 評(píng)論 - 589, 引用 - 0
          數(shù)據(jù)加載中……

          ArcGIS Server 開發(fā)系列(二)--Web ADF 編程

              作者:Flyingis

              本文嚴(yán)禁擅自轉(zhuǎn)載或用于商業(yè)目的,如有需要請(qǐng)事先聯(lián)系作者:dev.vip#gmail.com

              Web ADF全名是Web Application Develope Framework,是ArcGIS Server專用的開發(fā)框架,9.2版本的ArcIMS也開始提供ADF的封裝。完全使用Web控件編程幾乎不能解決我們實(shí)際項(xiàng)目中的問題,因此我們從《ArcGIS Server 開發(fā)系列(一)--編程框架總覽》中提到的途徑二開始,即web controls + common datasource apis。

              目標(biāo):

              根據(jù)查詢語句實(shí)現(xiàn)圖層信息查詢

              準(zhǔn)備工作:

              1.Windows XP sp2中/英文版
              2.Visual Studio 2005中/英文版
              3.ArcGIS Server 9.2(我打上了sp2補(bǔ)丁),創(chuàng)建一個(gè)ArcGIS Server服務(wù),Map Server屬性中更改Pooling,使用池化連接方式,Progresses選擇“In a seperate process for each instance(high isolation)”,我的服務(wù)為“World”
              4.利用vs2005創(chuàng)建一個(gè)模板server應(yīng)用--Web Mapping Application,并更改MapResourceManager屬性



              這樣我們可以測(cè)試程序看是否能夠正常運(yùn)行,啟動(dòng)調(diào)試看到如下結(jié)果:


              代碼實(shí)現(xiàn):

              我們要完成的工作是對(duì)圖層屬性信息的查詢,首先在頁面左側(cè)添加一個(gè)新的panel,左側(cè)的Tasks、Results等都是放置在panel之中,在這個(gè)新的panel中分別添加TreeViewPlus、TextBox、Button三個(gè)控件,TextBox輸入查詢條件,Button確定查詢, TreeViewPlus顯示結(jié)果,在設(shè)計(jì)試圖中瀏覽效果如下:


              雙擊“Query”Button,編寫點(diǎn)擊事件。

              protected void cmdQuery_Click(object sender, EventArgs e)
              
          {
                  Query(Map1.Extent);
              }

              Query方法實(shí)現(xiàn)了對(duì)圖層屬性信息的查詢。   

          protected void Query(ESRI.ArcGIS.ADF.Web.Geometry.Geometry geometry)
              
          {
                  IEnumerable func_enum 
          = null;
                  
          //獲取當(dāng)前map1控件中所有的functionality
                  func_enum = Map1.GetFunctionalities();

                  System.Data.DataTable datatable;
                  
          //對(duì)所有的functionality進(jìn)行遍歷
                  foreach (ESRI.ArcGIS.ADF.Web.DataSources.IGISFunctionality gisfunctionality in func_enum)
                  
          {
                      ESRI.ArcGIS.ADF.Web.DataSources.IGISResource gisresource 
          = null;
                      
          //得到該functionality的resource
                      gisresource = gisfunctionality.Resource;

                      
          //判斷該resource是否支持IQueryFunctionality  
                      bool supported = false;
                      supported 
          = gisresource.SupportsFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality));

                      
          if (supported)
                      
          {
                          ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality qfunc;
                          qfunc 
          = (ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality)gisresource.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality), null);

                          
          string[] lids;
                          
          string[] lnames;
                          
          //獲得圖層的layerId和layerName,GetQueryableLayers的重載方法可以指定圖層類型
                          qfunc.GetQueryableLayers(nullout lids, out lnames);

                          ESRI.ArcGIS.ADF.Web.SpatialFilter spatialfilter 
          = new ESRI.ArcGIS.ADF.Web.SpatialFilter();
                          
          //設(shè)置過濾器的過濾條件,txtQuery就是panel中text box的ID
                          spatialfilter.ReturnADFGeometries = false;
                          spatialfilter.MaxRecords 
          = 1000;
                          spatialfilter.WhereClause 
          = txtQuery.Text;
                          spatialfilter.Geometry 
          = geometry;

                          
          //對(duì)指定的圖層進(jìn)行查詢,查詢的結(jié)果保存為DataTable
                          datatable = qfunc.Query(null, lids[0], spatialfilter);

                          TreeViewPlus1.Nodes.Clear();
                          
          if (datatable != null)
                          
          {
                              System.Data.DataSet ds 
          = new System.Data.DataSet();
                              ds.Tables.Add(datatable);
                              TreeViewPlus1.ShowClearAllButton 
          = false;
                              
          //將結(jié)果綁定到TreeViewPlus控件上
                              TreeViewPlus1.BindToDataSet(ds);

                              TreeViewPlus1.Nodes[
          0].Expanded = true;
                          }

                      }

                  }

              }

             
              運(yùn)行程序,text box中輸入“CNTRY_NAME LIKE 'A%'”,查詢結(jié)果:


              這樣這個(gè)小程序就完成了,在server中實(shí)現(xiàn)了對(duì)圖層屬性信息的查詢,現(xiàn)在我們需要進(jìn)行更多的考慮:

              第一,考慮web控件、 functionality、datasource、resource、resourcemamager之間的關(guān)系,代碼中多次對(duì)它們的關(guān)系進(jìn)行了描述,用文檔中的一幅圖可以概括整個(gè)框架,這篇文章對(duì)此進(jìn)行了闡述--《ArcGIS Server .Net Web ADF體系結(jié)構(gòu)》。


              第二,程序中使用的mxd僅僅包含一個(gè)world圖層,因此對(duì)圖層進(jìn)行遍歷的過程中只需獲得第一圖層的ID,如果指定圖層名,可以在lnames得到所需的圖層進(jìn)行查詢。

              第三,程序?qū)崿F(xiàn)的查詢方式相當(dāng)簡(jiǎn)單,在text box中輸入原始的sql來完成where語句,只僅僅是一個(gè)測(cè)試,一般我們會(huì)屏蔽掉sql相關(guān)的關(guān)鍵字,提供多個(gè)text box或dropdownlist供用戶選擇進(jìn)行字段查詢。

              第四,如果查詢信息量不大,返回結(jié)果數(shù)量不多,完全可以考慮ajax來完成頁面請(qǐng)求,不論是速度還是用戶體驗(yàn)都會(huì)得到提高。

              第五,通過程序可以看到,查詢結(jié)果保存在一個(gè)datatable中,這極大的方便了server查詢和.net的無縫連接,直接將結(jié)果和TreeViewPlus綁定,換成其他的visual studio控件也沒問題。

              只要整個(gè)框架思路清晰了,查詢功能的實(shí)現(xiàn)其實(shí)很簡(jiǎn)單,這也是途徑2開發(fā)方式的一個(gè)例子,可以看出ArcGIS Server ADF給開發(fā)提供了很多便利,和ArcIMS相比開發(fā)難度相當(dāng),多看看文檔和ADF OMD圖可以讓我們對(duì)ArcGIS Server ADF開發(fā)有更多的了解,記住,這只是server開發(fā)的起步。

          posted on 2007-08-14 13:55 Flyingis 閱讀(7171) 評(píng)論(10)  編輯  收藏 所屬分類: ArcGIS Server

          評(píng)論

          # re: ArcGIS Server 開發(fā)系列(二)--Web ADF 編程  回復(fù)  更多評(píng)論   

          寫得不錯(cuò),繼續(xù)努力,期待ArcGIS Server 開發(fā)系列(三)......
          2007-08-21 11:49 | zhaomz

          # re: ArcGIS Server 開發(fā)系列(二)--Web ADF 編程  回復(fù)  更多評(píng)論   

          這邊server寫的更多,暫時(shí)沒有轉(zhuǎn)過來:
          http://www.cnblogs.com/flyingis
          2007-10-16 11:34 | Flyingis

          # re: ArcGIS Server 開發(fā)系列(二)--Web ADF 編程  回復(fù)  更多評(píng)論   

          我在幫助上看,一個(gè)簡(jiǎn)單的WEB瀏覽器就可以打開WMS服務(wù)。
          WMS是不是就是個(gè)一般的地圖呢》》請(qǐng)問
          問什么我輸入U(xiǎn)RL的時(shí)候報(bào)錯(cuò)捏。。
          難道普通的IE瀏覽器不可以顯示打開嗎
          opernlayers是什么東東啊
          2007-11-20 09:44 | question

          # re: ArcGIS Server 開發(fā)系列(二)--Web ADF 編程  回復(fù)  更多評(píng)論   

          學(xué)習(xí)中,覺得你的文章對(duì)我這個(gè)初學(xué)者太有用了。
          2007-12-26 22:22 | 丫頭

          # re: ArcGIS Server 開發(fā)系列(二)--Web ADF 編程  回復(fù)  更多評(píng)論   

          @丫頭
          開發(fā)系列更多的可以看這里的文章:
          http://www.cnblogs.com/flyingis
          2008-01-02 09:43 | Flyingis

          # re: ArcGIS Server 開發(fā)系列(二)--Web ADF 編程  回復(fù)  更多評(píng)論   

          @question
          wms是gis地圖服務(wù)標(biāo)準(zhǔn)的一種,你在arccatalog中可以add wms server查看地圖。
          2008-01-02 10:10 | Flyingis

          # re: ArcGIS Server 開發(fā)系列(二)--Web ADF 編程  回復(fù)  更多評(píng)論   

          現(xiàn)在來說思路已經(jīng)清晰好多了!謝謝1
          2008-01-10 18:49 | 廣州的丫頭

          # re: ArcGIS Server 開發(fā)系列(二)--Web ADF 編程  回復(fù)  更多評(píng)論   

          寫得很好,對(duì)我這樣的初學(xué)者很有用,多謝了
          2008-11-01 11:20 | leepf7211

          # re: ArcGIS Server 開發(fā)系列(二)--Web ADF 編程  回復(fù)  更多評(píng)論   

          請(qǐng)問wms服務(wù)添加后在發(fā)布的地址是多少?
          2009-01-03 21:13 | lizhenhuatop

          # re: ArcGIS Server 開發(fā)系列(二)--Web ADF 編程  回復(fù)  更多評(píng)論   

          protected void Query(ESRI.ArcGIS.ADF.Web.Geometry.Geometry geometry) 這句應(yīng)該是protected void Query(ESRI.ArcGIS.ADF.Web.Geometry geometry)吧
          2010-08-11 11:20 | 第三關(guān)
          主站蜘蛛池模板: 揭西县| 思茅市| 略阳县| 高青县| 舞阳县| 建瓯市| 伊通| 永兴县| 哈尔滨市| 紫金县| 和硕县| 安远县| 绥宁县| 商丘市| 九寨沟县| 化隆| 伊金霍洛旗| 讷河市| 当雄县| 刚察县| 湘阴县| 呼伦贝尔市| 辽源市| 武山县| 阿克陶县| 定西市| 济阳县| 玛沁县| 双城市| 南溪县| 松江区| 沙洋县| 夏河县| 上犹县| 大姚县| 马鞍山市| 井冈山市| 浦县| 炉霍县| 渝中区| 泽普县|