Web ADF全名是Web Application Develope Framework,是ArcGIS Server專用的開發架構,9.2版本的ArcIMS也開始提供ADF的封裝。完全使用Web控件程式設計幾乎不能解決我們實際項目中的問題,是以我們從《ArcGIS Server 開發系列(一)--程式設計架構總覽》中提到的途徑二開始,即web controls + common datasource apis。
目标:
根據查詢語句實作圖層資訊查詢
準備工作:
1.Windows XP sp2中/英文版
2.Visual Studio 2005中/英文版
3.ArcGIS Server 9.2(我打上了sp2更新檔),建立一個ArcGIS Server服務,Map Server屬性中更改Pooling,使用池化連接配接方式,Progresses選擇“In a seperate process for each instance(high isolation)”,我的服務為“World”
4.利用vs2005建立一個模闆server應用--Web Mapping Application,并更改MapResourceManager屬性

這樣我們可以測試程式看是否能夠正常運作,啟動調試看到如下結果:
代碼實作:
我們要完成的工作是對圖層屬性資訊的查詢,首先在頁面左側添加一個新的panel,左側的Tasks、Results等都是放置在panel之中,在這個新的panel中分别添加TreeViewPlus、TextBox、Button三個控件,TextBox輸入查詢條件,Button确定查詢, TreeViewPlus顯示結果,在設計試圖中浏覽效果如下:
輕按兩下“Query”Button,編寫點選事件。
protected void cmdQuery_Click(object sender, EventArgs e)
{
Query(Map1.Extent);
}
Query方法實作了對圖層屬性資訊的查詢。
protected void Query(ESRI.ArcGIS.ADF.Web.Geometry.Geometry geometry)
{
IEnumerable func_enum = null;
//擷取目前map1控件中所有的functionality
func_enum = Map1.GetFunctionalities();
System.Data.DataTable datatable;
//對所有的functionality進行周遊
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(null, out lids, out lnames);
ESRI.ArcGIS.ADF.Web.SpatialFilter spatialfilter = new ESRI.ArcGIS.ADF.Web.SpatialFilter();
//設定過濾器的過濾條件,txtQuery就是panel中text box的ID
spatialfilter.ReturnADFGeometries = false;
spatialfilter.MaxRecords = 1000;
spatialfilter.WhereClause = txtQuery.Text;
spatialfilter.Geometry = geometry;
//對指定的圖層進行查詢,查詢的結果儲存為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;
//将結果綁定到TreeViewPlus控件上
TreeViewPlus1.BindToDataSet(ds);
TreeViewPlus1.Nodes[0].Expanded = true;
}
}
}
}
運作程式,text box中輸入“CNTRY_NAME LIKE 'A%'”,查詢結果:
運作程式,text box中輸入“CNTRY_NAME LIKE 'A%'”,查詢結果:
這樣這個小程式就完成了,在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開發的起步。