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開發的起步。