一、开发环境
开发环境为ArcGIS Engine 10.2与Visual studio2010。在使用ArcEngine查询进行查询的时候主要使用三种查询接口IQueryFilter(属性查询) 、ISpatialFilter(空间查询) 、IQueryDef (多表查询)
那么这三个接口的区别是什么呢?
要求 | IQueryFilter | ISpatialFilter | IQueryDef |
---|---|---|---|
属性约束 | True | True | True |
空间约束 | False | True | False |
查询结果包括多个表的字段 | False | False | True |
查询结果返回一个游标 | True | True | True |
RecordSet对象可以从结果中创建 | True | True | True |
返回的记录可以被编辑 | True | True | False |
记录集包括在活动编辑会话中进行的编辑 | True | True | False |
从上面的表格可以看出IQueryFilter、IQueryDef 都可以进行属性查询,ISpatialFilter可以进行空间查询。
- IQueryFilter接口
这是最常见的属性查询,输入WhereClause条件用于获取或设置查询过滤条件,然后调用IFeatureClass或者ITable的Search方法就行了。
- 示例代码
-
private void 属性查询ToolStripMenuItem_Click(object sender, EventArgs e) { try { //判断第一个图层是否是矢量图层,如果是则开始属性查询,如果不是程序不再执行 if (axMapControl1.get_Layer(0) is IFeatureLayer) { //把第一个图层强制转换为要素类图层 IFeatureLayer pFeatureLayer = axMapControl1.get_Layer(0) as IFeatureLayer; //创建一个QueryFilter对象 IQueryFilter pQueryFilter = new QueryFilter(); //输入查询过滤条件【查询当前要素类 FID为1或2的要素】 pQueryFilter.WhereClause = "FID = 1 or FID = 2"; IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection; //进行空间查询,并加入选择集 pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, false); //刷新主地图进行高亮显示,一般用局部刷新 axMapControl1.Refresh(); } } catch (Exception ex) { MessageBox.Show("请先加载数据后再进行查询!","",MessageBoxButtons.OK,MessageBoxIcon.Warning); } }
2.ISpatialFilter接口文章来源:https://www.toymoban.com/news/detail-730931.html
- ISpatialFilter继承了接口IQueryFilter,在属性查询的基础上加了要素与要素的空间关系进行查询。其中Geometry用于设置查询几何;SpatialRel设置查询的空间关系,空间关系esriSpatialRelEnum可参考我另一篇文章的介绍。以及esri官网的介绍。
SpatialFilterClass还继承了IQueryFilterDefinition2接口。 - 示例代码
-
#region 通过点击主地图的面状图形,获取其临近要素 private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e) { try { //清空地图选择集 axMapControl1.ActiveView.FocusMap.ClearSelection(); //实例化一个点,以该点作拓扑算子,将点击的位置坐标赋予pPoint IPoint pPoint = new ESRI.ArcGIS.Geometry.Point(); ITopologicalOperator pTopologicalOperator = pPoint as ITopologicalOperator; pPoint.PutCoords(e.mapX, e.mapY); //以缓冲半径为0进行缓冲 得到一个点 IGeometry pGeometry = pTopologicalOperator.Buffer(0); //以该点进行要素选择(只能选中面状要素,点和线无法选中) axMapControl1.Map.SelectByShape(pGeometry, null, false); //刷新视图 axMapControl1.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null); // 获取选择集 ISelection pSelection = axMapControl1.Map.FeatureSelection; // 获取要素 IEnumFeature pEnumFeature = pSelection as IEnumFeature; IFeature pFeature = pEnumFeature.Next(); while (pFeature != null) { //定义一个空间查询对象 ISpatialFilter spatialFilter = new SpatialFilter(); //空间查询对象为点选的的几何对象 spatialFilter.Geometry = pFeature.Shape; //设置空间查询关系为 空间临接查询 spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelTouches; //遍历axMapControl1中的所有图层 for (int i = 0; i < axMapControl1.LayerCount; i++) { //清空地图选择集 axMapControl1.ActiveView.FocusMap.ClearSelection(); //判断当前图层是否为矢量图层 if (axMapControl1.get_Layer(i) is IFeatureLayer) { //将图层强制转换为IFeatureLayer IFeatureLayer pFeatureLayer = axMapControl1.get_Layer(i) as IFeatureLayer; //输入目标图层,并转换为IFeatureSelection对象 IFeatureSelection featureSelection = pFeatureLayer as IFeatureSelection; //开始空间查询,查询到的结果保存在ISelectionSet中,可以用游标Cursor来遍历要素 featureSelection.SelectFeatures((IQueryFilter)spatialFilter, esriSelectionResultEnum.esriSelectionResultNew, false); } } break; } } catch (Exception ex) { MessageBox.Show("程序执行失败!"+ex); } } #endregion
3.IQueryDef 接口
IQueryDef用于属性查询。它支持复杂的SQL查询并且能在同一工作空间内做连表查询。但是查询后的结果不支持编辑。且不能在Shapefile 和Coverage 数据中使用,而仅仅可以使用在GeoDatabase数据库中。文章来源地址https://www.toymoban.com/news/detail-730931.html
到了这里,关于基于C#的AE二次开发之IQueryFilter接口、ISpatialFilter接口、IQueryDef 接口的查询接口的介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!