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