日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Arcgis Engine 二次开发之属性查询

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

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