天天看點

ArcGIS Server 開發系列(二)–Web ADF 程式設計

ArcGIS Server 開發系列(二)–Web ADF 程式設計   

目标:

根據查詢語句實作圖層資訊查詢  

代碼實作:

我們要完成的工作是對圖層屬性資訊的查詢,首先在頁面左側添加一個新的panel,左側的Tasks、Results等都是放置在panel之中,在這個新的panel中分别添加TreeViewPlus、TextBox、Button三個控件,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;//得到該functionality的resource

            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);//獲得圖層的layerId和layerName

                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控件、 functionality、datasource、resource、resourcemamager之間的關系,代碼中多次對它們的關系進行了描述,用文檔中的一幅圖可以概括整個架構,這篇文章對此進行了闡述–《ArcGIS Server .Net Web ADF體系結構》。

第二,程式中使用的mxd僅僅包含一個world圖層,是以對圖層進行周遊的過程中隻需獲得第一圖層的ID,如果指定圖層名,可以在lnames得到所需的圖層進行查詢。

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

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

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

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