ArcEngine简单教程——要素的属性查询、空间查询
其他教程請見:
ArcEngine簡單教程匯總
?
目錄
ArcEngine簡單教程匯總???????
1?目的
?
2?概要
空間查詢
屬性查詢
3?關鍵代碼
4小結
???????
?
1?目的
實現簡單的地圖查詢功能,包括右鍵拖選形狀,進行空間查詢;在屬性查詢窗口,輸入查詢語句進行屬性查詢等;清除查詢
?
2?概要
本文只介紹主要功能方法,具體的調用關系、窗口實現可見:
https://download.csdn.net/download/nominior/11577533
?
空間查詢
空間查詢實現比較簡單,主要借助鼠標事件、空間查詢條件完成:
1)確定查詢圖層
2)調用AxMapcontrol.Track*()獲取鼠標拖選范圍
3)高亮顯示:使用空間查詢ISpatialFilter,通過游標遍歷,向IFeatureSelection中加入要素,刷新顯示
屬性查詢
屬性查詢也比較簡單,主要基于屬性查詢接口完成,但為了方便查詢,需要顯示圖層、字段、唯一值等,優(yōu)化交互
1)確定查詢圖層
2)根據圖層,確定查詢字段
3)根據圖層、自帶,確定唯一值
4)根據字段、唯一值,確定查詢條件
5)高亮顯示:使用屬性查詢IQueryFilter,通過游標遍歷,向IFeatureSelection中加入要素,刷新顯示
重置查詢
使用如下代碼清除指定圖層的選擇:
IFeatureSelection fSelection = axMapControl1.get_Layer(i) as IFeatureSelection; fSelection.Clear();3?關鍵代碼
空間查詢
獲取指定的要素圖層
private FeatureLayer get_FL(){FeatureLayer pFeatureLayer = null;for (int i = 0; i < axMapControl1.LayerCount; i++){if (cb_layer.Text == axMapControl1.get_Layer(i).Name){pFeatureLayer = axMapControl1.get_Layer(i) as FeatureLayer;break;}}return pFeatureLayer;}根據查詢圖層和查詢方式,獲取鼠標框選范圍(矩形框選獲取的是IEnvelope,圓形框選、多邊形框選獲取的是IGeometry),創(chuàng)建空間查詢條件對象ISpatialFilter
private void axMapControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e){FeatureLayer pFeatureLayer = get_FL();if (e.button == 2 && pFeatureLayer != null){ IEnvelope box = null;if (cb_method.Text == "框選查詢"){box = axMapControl1.TrackRectangle() as IEnvelope;ISpatialFilter filter = new SpatialFilterClass();filter.WhereClause = "";filter.Geometry = box;filter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;ShowFeatures(pFeatureLayer, filter);}else{IGeometry pGeo;if (cb_method.Text == "多邊形查詢"){pGeo = axMapControl1.TrackPolygon();}else{pGeo = axMapControl1.TrackCircle();}ISpatialFilter filter = new SpatialFilterClass();filter.WhereClause = "";filter.Geometry = pGeo;filter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;ShowFeatures(pFeatureLayer, filter);}}}根據空間查詢對象,游標遍歷要素圖層的要素類,獲取查詢要素添加到IFeatureSelection高亮顯示
public void ShowFeatures(IFeatureLayer featureLayer, IQueryFilter condition){if (featureLayer != null){IFeatureClass featureClass = featureLayer.FeatureClass;IFeatureCursor cursor = null;try{cursor = featureLayer.Search(condition, false);}catch (Exception e){cursor = null;}if (cursor != null){axMapControl1.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);IFeatureSelection fSelection = featureLayer as IFeatureSelection;fSelection.Clear();IFeature pFeature = cursor.NextFeature();while (pFeature != null){fSelection.Add(pFeature);pFeature = cursor.NextFeature();}axMapControl1.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);}}}?
屬性查詢
獲取圖層字段,在lb_field中存放
private void cb_layerChoose_SelectedValueChanged(object sender, EventArgs e){lb_field.Items.Clear();int index = -1;for (int i = 0; i < map.LayerCount; i++){if (cb_layer.Text == map.get_Layer(i).Name){index = i;pFeatureLayer = map.get_Layer(i) as IFeatureLayer;break;}}if (index != -1){IFeatureLayer pFLayer = map.get_Layer(index) as IFeatureLayer;for (int j = 0; j < pFLayer.FeatureClass.Fields.FieldCount; j++){if (pFLayer.FeatureClass.Fields.get_Field(j).Type == esriFieldType.esriFieldTypeDouble ||pFLayer.FeatureClass.Fields.get_Field(j).Type == esriFieldType.esriFieldTypeSingle ||pFLayer.FeatureClass.Fields.get_Field(j).Type == esriFieldType.esriFieldTypeString ||pFLayer.FeatureClass.Fields.get_Field(j).Type == esriFieldType.esriFieldTypeInteger){lb_field.Items.Add(pFLayer.FeatureClass.Fields.get_Field(j).Name);}}}}獲取字段唯一值,在lb_uniqueValue中存放
private void lb_field_MouseDoubleClick(object sender, MouseEventArgs e){string field = lb_field.Text;txt_query.Text += field;string[] values = UniqueValuesShow(field);lb_uniqueValue.Items.Clear();int pField_num = pFeatureLayer.FeatureClass.FindField(field);IField pField = pFeatureLayer.FeatureClass.Fields.get_Field(pField_num);for (int i = 0; i < values.Length; i++){if (pField.Type == esriFieldType.esriFieldTypeString){lb_uniqueValue.Items.Add("\'" + values[i] + "\'");}else{lb_uniqueValue.Items.Add(values[i]);}}}public string[] UniqueValuesShow(string strField){IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;IFeatureCursor lFeatureCursor = pFeatureClass.Search(null, false);IDataStatistics lData = new DataStatisticsClass();lData.Field = strField;lData.Cursor = lFeatureCursor as ICursor;IEnumerator pEnumVar = lData.UniqueValues;string[] strValue = new string[lData.UniqueValueCount];pEnumVar.Reset();int i = 0;while (pEnumVar.MoveNext()){strValue[i++] = pEnumVar.Current.ToString();}return strValue;}根據查詢語言,創(chuàng)建屬性查詢條件,并遍歷、選擇、高亮
private void btn_att_select_Click(object sender, EventArgs e){IQueryFilter filter = new QueryFilterClass();filter.WhereClause = this.txt_query.Text;ShowFeatures(pFeatureLayer, filter);}public void ShowFeatures(IFeatureLayer featureLayer, IQueryFilter condition){if (featureLayer != null){IFeatureClass featureClass = featureLayer.FeatureClass;IFeatureCursor cursor = null;try{cursor = featureLayer.Search(condition, false);}catch (Exception e){cursor = null;}if (cursor != null){this.map.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);IFeatureSelection fSelection = featureLayer as IFeatureSelection;fSelection.Clear();IFeature pFeature = cursor.NextFeature();while (pFeature != null){fSelection.Add(pFeature);pFeature = cursor.NextFeature();}this.map.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);}}}4小結
查詢實現的最簡過程:創(chuàng)建查詢條件對象,遍歷獲取要素并添加到選擇,刷新高亮
比較復雜的是創(chuàng)建查詢條件對象之前的處理過程
總結
以上是生活随笔為你收集整理的ArcEngine简单教程——要素的属性查询、空间查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 雷塞SMC304系列控制器VC6.0例程
- 下一篇: Stop sucking,Become