在ArcGis Engine二次開發過程中,經常會需要用到查詢統計的功能,而IQueryFilter是最常見的屬性字段查詢接口,可以用來做一些簡單的查詢工作。
現在有一些公交站點和公交路線的數據,可視化效果如下:

其中站點數據的屬性信息中記錄了站點名稱和經過的路線,如下圖所示:

功能需求為:用戶輸入一條公交路線,程序運行並返回這條路線經過的所有站點。
在AE程序中先建立查詢的窗體,如下圖所示:

這個功能需要從MapControl中獲取圖層,因此調用此窗體的時候需要將MapControl作為參數傳入,另外還需要用到ArrayList接口,在代碼中添加如下引用:
1 using System.Collections; 2 using ESRI.ArcGIS.Controls; 3 using ESRI.ArcGIS.Carto; 4 using ESRI.ArcGIS.Geodatabase;
構建一個用於屬性查詢的函數,返回結果為ArrayList數組,具體代碼如下:
1 //查詢函數 2 private ArrayList Query(AxMapControl axMapControl1, int layerIndex, string inputField, string outputField, string inputTxt) 3 { 4 IFeatureLayer pFeatureLayer = axMapControl1.Map.get_Layer(layerIndex) as IFeatureLayer; //獲取查詢的圖層 5 IFeatureClass pFeatCls = pFeatureLayer.FeatureClass; 6 IQueryFilter pQueryfilter = new QueryFilterClass(); 7 pQueryfilter.WhereClause = inputField + "='" + inputTxt + "'"; //設置屬性查詢條件 8 IFeatureCursor pFeatCur = pFeatCls.Search(pQueryfilter, false); 9 IFields pFields = pFeatCls.Fields; //獲取圖層的字段 10 int iField = pFields.FindField(outputField); //找出輸出字段的位置 11 IFeature pFeat = pFeatCur.NextFeature(); 12 ArrayList OutputList = new ArrayList(); //新建輸出列表 13 while (pFeat != null) 14 { 15 OutputList.Add(pFeat.get_Value(iField).ToString()); 16 pFeat = pFeatCur.NextFeature(); 17 } 18 return OutputList; 19 }
在“查詢”按鈕的點擊響應函數下添加如下代碼:
1 private void button1_Click(object sender, EventArgs e) 2 { 3 string inputTxt = textBox1.Text; //獲取線路值 4 if (inputTxt != null && inputTxt != "") 5 { 6 ArrayList outListBus = Query(mapControl, 1, "lineName", "name", inputTxt); 7 ArrayList outListSubway = Query(mapControl, 3, "lineName", "name", inputTxt); 8 if (outListBus.Count != 0 || outListSubway.Count != 0) 9 { 10 string outList = null; 11 if (outListBus.Count > 0) //若查詢路線為公交路線 12 { 13 for (int i = 0; i < outListBus.Count - 1;i++ ) 14 { 15 outList += outListBus[i].ToString() + "-->"; 16 } 17 richTextBox1.Text = "經過站點:" + outList + outListBus[outListBus.Count - 1].ToString(); 18 } 19 else //若查詢路線為地鐵路線 20 { 21 for (int i = 0; i < outListSubway.Count - 1; i++) 22 { 23 outList += outListSubway[i].ToString() + "-->"; 24 } 25 richTextBox1.Text = "經過站點:" + outList + outListSubway[outListSubway.Count - 1].ToString(); 26 } 27 } 28 else 29 { 30 MessageBox.Show("查無此線路,請輸入正確的線路值!"); 31 } 32 33 } 34 else 35 { 36 MessageBox.Show("請輸入正確的線路值!"); 37 } 38 39 }
最終運行結果如下:

至此,一個簡單的屬性查詢窗體已經完成!
