ArcEngine简单教程 | 您所在的位置:网站首页 › 显示属性中不包括什么 › ArcEngine简单教程 |
其他教程请见: ArcEngine简单教程汇总
目录 ArcEngine简单教程汇总 1 目的
2 概要 空间查询 属性查询 3 关键代码 4小结 1 目的 实现简单的地图查询功能,包括右键拖选形状,进行空间查询;在属性查询窗口,输入查询语句进行属性查询等;清除查询 2 概要本文只介绍主要功能方法,具体的调用关系、窗口实现可见: https://download.csdn.net/download/nominior/11577533 空间查询 空间查询实现比较简单,主要借助鼠标事件、空间查询条件完成: 1)确定查询图层 2)调用AxMapcontrol.Track*()获取鼠标拖选范围 3)高亮显示:使用空间查询ISpatialFilter,通过游标遍历,向IFeatureSelection中加入要素,刷新显示 属性查询属性查询也比较简单,主要基于属性查询接口完成,但为了方便查询,需要显示图层、字段、唯一值等,优化交互 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),创建空间查询条件对象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; }根据查询语言,创建属性查询条件,并遍历、选择、高亮 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小结查询实现的最简过程:创建查询条件对象,遍历获取要素并添加到选择,刷新高亮 比较复杂的是创建查询条件对象之前的处理过程 |
CopyRight 2018-2019 实验室设备网 版权所有 |