日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Arcgis Engine 二次开发之属性查询

發布時間:2024/3/26 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 二次开发之属性查询的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。