ArcEngine简单教程 您所在的位置:网站首页 显示属性中不包括什么 ArcEngine简单教程

ArcEngine简单教程

2024-06-26 10:15| 来源: 网络整理| 查看: 265

其他教程请见:

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 实验室设备网 版权所有