Arcgis Engine 二次开发之属性查询
一、類庫接口描述
1、IQueryFilter接口
過濾數據通過屬性值或者屬性之間的關系,一般為其賦WhereClause和SubFields屬性。
2、IFeatureClass接口
(1)Search方法 IFeatureCursor返回值
返回查詢結果集IFeatureCursor接口的游標,目的是遍歷查詢結果,在地圖中不會顯示查詢結果
(2)Select方法 ISelectionSet返回值
返回結果為ISelectionSet接口的選擇集,在地圖中不會顯示查詢結果。
3、IFeatureLayer接口
Search方法 IFeatureCursor返回值
與IFeatureClass接口中的Search方法相同。
4、IFeatureSelection接口
SelectFeatures方法 void返回值
無返回值,目的是根據查詢條件選擇要素,將在地圖上高亮顯示查詢結果。
5、IQueryDef接口
Evaluate方法 ICursor返回值
根據設定的查詢條件執行查詢操作,返回值為Icursor接口的游標,可進行行遍歷,在地圖上不會顯示查詢結果。
二、 實現思路
1、設計界面
2、理清邏輯思路,設計功能
通過主界面將MapControl傳到屬性查詢的界面,用戶可以通過“選擇圖層”的下拉框選擇不同的圖層,再選擇“方法”:創建新選擇內容、添加到當前選擇內容、從當前選擇內容移除、從當前選擇內容選擇,當選擇不同的圖層時,左邊會顯示出當前圖層的字段,用戶點擊“字段”,點擊“獲取唯一屬性值”,右側會相應將字段顯示出來。雙擊左側和右側的字段和單擊中間的符號會在下方相應區域顯示,只要寫入正確的語句,則會在地圖中進行相應的高亮顯示。 當勾選“定位到查詢結果”,查詢后會直接跳轉到查詢結果處。
3、代碼實現
4、測試
三、 屬性查詢流程圖
四、 關鍵代碼
1、獲得圖層名字
// 通過這個函數獲得所有圖層public IEnumLayer GetLayers(){IEnumLayer layers;if (m_map.LayerCount == 0)return null;layers = m_map.get_Layers(null, true);layers.Reset();return layers;}// 將得到的圖層轉為矢量要素public IFeatureLayer GetFeatureLayer(string layername){if (GetLayers() == null)return null;IEnumLayer layers = GetLayers();layers.Reset();ILayer layer = null;while ((layer = layers.Next()) != null){if (layer.Name == layername)return layer as IFeatureLayer;}return null;}// 添加圖層名字public void cbxAddLayer(){if (GetLayers() == null) return;IEnumLayer layers = GetLayers();layers.Reset();ILayer layer = null;while ((layer = layers.Next()) != null){if (layer is IFeatureLayer)comboBoxLayer.Items.Add(layer.Name);}}2、當圖層進行選擇時,下面框數據隨著變化:利用comboBoxLayer_SelectedIndexChanged事件
//圖層選擇private void comboBoxLayer_SelectedIndexChanged(object sender, EventArgs e){if (GetLayers() == null) return;IEnumLayer layers = GetLayers();IField m_field;int fieldtype;layers.Reset();listBoxFields.Items.Clear();while ((m_layer = layers.Next()) != null){if (m_layer.Name != comboBoxLayer.Text) continue;this.m_layerfield = m_layer as ILayerFields;for (int i = 0; i < m_layerfield.FieldCount; i++){m_field = m_layerfield.get_Field(i);fieldtype = (int)m_field.Type; if (fieldtype > 5) continue;this.listBoxFields.Items.Add(m_field.Name);}}this.m_featurelayer = GetFeatureLayer(comboBoxLayer.Text);}3、符號加載功能相關代碼
private void listBoxFields_MouseDoubleClick(object sender, MouseEventArgs e){Fieldstr = listBoxFields.Text;textBoxSqlClause.Text = Fieldstr + " ";}private void listBoxValues_MouseDoubleClick(object sender, MouseEventArgs e){valuesstr = listBoxValues.Text;textBoxSqlClause.Text += " " + valuesstr;}private void buttonX1_MouseClick(object sender, MouseEventArgs e){constr = "=";textBoxSqlClause.Text += constr;} …………4、屬性查詢功能相關代碼
private void buttonX18_Click(object sender, EventArgs e){if (textBoxSqlClause.Text == "" ){MessageBox.Show( "請生成語句。" );return ;}try{IQueryFilter2 QueryFilter = (IQueryFilter2)new QueryFilter();QueryFilter.WhereClause = textBoxSqlClause.Text;IFeatureSelection FeatureSelection = m_featurelayer as IFeatureSelection ;m_mapcontrol.ActiveView.Refresh();int iSelectedFeaturesCount = FeatureSelection.SelectionSet.Count;esriSelectionResultEnum SelectMothod;switch (comboBoxMethod.SelectedIndex){case 0:m_map.ClearSelection();SelectMothod = esriSelectionResultEnum .esriSelectionResultNew;break ;case 1: SelectMothod = esriSelectionResultEnum .esriSelectionResultAdd;break ;case 2: SelectMothod =esriSelectionResultEnum .esriSelectionResultSubtract;break ;case 3: SelectMothod = esriSelectionResultEnum .esriSelectionResultAnd;break ;default :SelectMothod =esriSelectionResultEnum .esriSelectionResultNew;break ;}FeatureSelection.SelectFeatures(QueryFilter, SelectMothod, false );VaryInt = VaryInt + 1;if (FeatureSelection.SelectionSet.Count == 0){MessageBox.Show( "沒有符合本次查詢的條件。" );return ;}// 如果復選框被選中就定位到選擇結果if (checkBox2.Checked == true ){IEnumFeature EnumFeature = m_mapcontrol.Map.FeatureSelection as IEnumFeature ;IFeature Feature = EnumFeature.Next();IEnvelope Envelope = (IEnvelope)new Envelope();while (Feature != null ){Envelope.Union(Feature.Extent);Feature = EnumFeature.Next();}m_mapcontrol.ActiveView.Extent = Envelope;m_mapcontrol.ActiveView.Refresh();}//m_mapcontrol.ActiveView.Refresh();m_mapcontrol.ActiveView.PartialRefresh( esriViewDrawPhase .esriViewGeoSelection, null ,null );}catch ( Exception ex){MessageBox.Show( "您的查詢語句可能有誤,請檢查!| " + ex.Message);return ;}}五、注意內容
在實現AE屬性數據的查詢過程中,除了考慮屬性查詢的代碼編寫,還需考慮如何在不同窗體之間進行傳參,如何在下拉框改變時,下方的listbox內的值隨之變動,如何獲得圖層的唯一值等問題。
總結
以上是生活随笔為你收集整理的Arcgis Engine 二次开发之属性查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高级驾驶辅助系统(ADAS)的安全性和静
- 下一篇: Sping的AOP理解