ArcGIS Server 開發系列(二)–Web ADF 編程

ArcGIS Server 開發系列(二)–Web ADF 編程   

目標:

根據查詢語句實現圖層信息查詢  

代碼實現:

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

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Collections;

using ESRI;

using ESRI.ArcGIS.ADF.Web.DataSources;

using ESRI.ArcGIS.ADF.Web.Geometry;

using ESRI.ArcGIS.ADF.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

 

    }

    protected void Button_query_Click(object sender, EventArgs e)

    {

        Query(Map1.Extent);

    }

 

    private void Query(ESRI.ArcGIS.ADF.Web.Geometry.Envelope envelope)

    {

        IEnumerable func_enum = null;

        func_enum = Map1.GetFunctionalities();//獲取當前map1控件中所有的functionality

        System.Data.DataTable datatable;

        foreach (ESRI.ArcGIS.ADF.Web.DataSources.IGISFunctionality gisfun in func_enum)//對所有的functionality進行遍歷

        {

            ESRI.ArcGIS.ADF.Web.DataSources.IGISResource gisresource = null;

            gisresource = gisfun.Resource;//得到該functionalityresource

            

            bool supported = false;

            //判斷該resource是否支持IQueryFunctionality

            supported = gisresource.SupportsFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality));

 

            if (supported)

            {

                ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality qfunc;

                qfunc = (IQueryFunctionality)gisresource.CreateFunctionality(typeof(IQueryFunctionality), null);

                string[] ids;

                string[] names;

                qfunc.GetQueryableLayers(null, out ids, out names);//獲得圖層的layerIdlayerName

                ESRI.ArcGIS.ADF.Web.SpatialFilter spatialfilter = new ESRI.ArcGIS.ADF.Web.SpatialFilter();

                spatialfilter.ReturnADFGeometries = false;//設置查詢條件

                spatialfilter.MaxRecords = 1000;

                spatialfilter.WhereClause = TextBox_condition.Text;

                //spatialfilter.Geometry=geometry;

 

                datatable = qfunc.Query(null, ids[0], spatialfilter);//對指定的圖層進行查詢ids[0]

 

                TreeViewPlus1.Nodes.Clear();

                if (datatable != null)

                {

                    System.Data.DataSet ds = new DataSet();

                    ds.Tables.Add(datatable);

                    TreeViewPlus1.ShowClearAllButton = false;

                    TreeViewPlus1.Value = "搜索結果";

                    TreeViewPlus1.BindToDataSet(ds);//將結果綁定到TreeViewPlus控件上

                    TreeViewPlus1.Nodes[0].Expanded = true;

                }

            }

        }

    }

}

 

這樣這個小程序就完成了,在server中實現了對圖層屬性信息的查詢,現在我們需要進行更多的考慮:

第一,考慮web控件、 functionalitydatasourceresourceresourcemamager之間的關係,代碼中多次對它們的關係進行了描述,用文檔中的一幅圖可以概括整個框架,這篇文章對此進行了闡述ArcGIS Server .Net Web ADF體系結構》。

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

第三,程序實現的查詢方式相當簡單,在text box中輸入原始的sql來完成where語句,只僅僅是一個測試,一般我們會屏蔽掉sql相關的關鍵字,提供多個text boxdropdownlist供用戶選擇進行字段查詢。

第四,如果查詢信息量不大,返回結果數量不多,完全可以考慮ajax來完成頁面請求,不論是速度還是用戶體驗都會得到提高。

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

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

 

發佈了13 篇原創文章 · 獲贊 1 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章