空间查询功能是通过用户选择的空间几何体以及该几何体与当前地图中要素之间的几何关系进行空间查找,从而得到查询结果的操作。

相关类与接口

空间查询相关的类主要是SpatialFilter类,其实现的接口主要为ISpatialFilter接口。SpatialFilter类是空间关系过滤类,ISpatialFilter接口的成员主要用于返回和修改数据过滤器所使用的空间关系。ISpatialFilter接口同时包含了空间和属性两种查询约束,它继承了IQueryFilter接口。

1.Geometry属性:

设置或获取用来筛选数据的几何体,其值为IGeometry接口类型。

2.GeometryField属性:

获取或设置应用于查询过滤器中几何字段的名称。

3.SpatialRel属性

获取或设置过滤器所要使用的控件关系,其值为esriSpatialRelEnum枚举类型,包括相交esriSpatialRelInersects、覆盖esriSpatialRelOverlaps、跨越esriSpatialRelCrosses等多种空间关系。


实现思路:

通过ISpatialFilter接口定义空间查询条件,其Geometry属性确定用来查询的空间几何体,SpatialRel属性定义查询所使用的空间关系,为esriSpatialRelEnum枚举类型的变量。包括:esriSpatialRelIntersects(空间相交)、esriSpatialRelTouches(空间相接,共享空间边界),esriSpatialRelOverlaps(空间覆盖)、esriSpatialRelCrosses(空间跨越)、esriSpatialRelWithin(空间被包含)、esriSpatialRelContains(空间包含)等。因为ISpatialFilter接口继承与IQueryFilter接口,因此在定义好空间查询条件后,可以使用IQueryFilter接口的查询方法进行空间查询操作。另外,在合并源图层的几何体时,使用ITopologicalOperator接口的Union方法来进行几何体合并操作,该接口是点、线、面等几何体对象所共同实现的接口。

代码:

  1. public partial class FormQueryBySpatial : DevExpress.XtraEditors.XtraForm
  2. {
  3. //变量定义
  4. private IMap currentMap;//当前MapControl控件的Map对象
  5. private IFeatureLayer currentFeatureLayer;//设置临时类变量来使用IFeatureLayer接口的当前图层对象
  6. private string currentFileName;//设置临时类变量来存储字段名称
  7. /// <summary>
  8. /// 获得当前MapControl控件中的对象
  9. /// </summary>
  10. public IMap CurrentMap
  11. {
  12. set
  13. {
  14. currentMap = value;
  15. }
  16. }
  17. public FormQueryBySpatial()
  18. {
  19. InitializeComponent();
  20. }
  21.  
  22. private void FormQueryBySpatial_Load(object sender, EventArgs e)
  23. {
  24. //清空目标图层列表
  25. checkListTargetLayer.Items.Clear();
  26. string layerName;//设置临时变量存储图层名称
  27. //对Map中的每一个图层进行判断并添加图层名称
  28. for (int i = ; i < currentMap.LayerCount; i++)
  29. {
  30. //如果该图层为图层组类型,则分别对所包含的每个图层进行操作
  31. if (currentMap.get_Layer(i) is GroupLayer)
  32. {
  33. //使用ICompositeLayer接口进行遍历操作
  34. ICompositeLayer compositeLayer = currentMap.get_Layer(i) as ICompositeLayer;
  35. for (int j = ; j < compositeLayer.Count; j++)
  36. {
  37. //将图层的名称添加到checkListTargetLayer控件中
  38. layerName = compositeLayer.get_Layer(j).Name;
  39. checkListTargetLayer.Items.Add(layerName);
  40. comBoxSourceLayer.Items.Add(layerName);
  41. }
  42. }
  43. //如果图层不是图层组类型,则直接添加名称
  44. else
  45. {
  46. layerName = currentMap.get_Layer(i).Name;
  47. checkListTargetLayer.Items.Add(layerName);
  48. comBoxSourceLayer.Items.Add(layerName);
  49. }
  50. }
  51. //将comboxSourceLayer控件的默认选项设置为第一个图层的名称
  52. comBoxSourceLayer.SelectedIndex = ;
  53. //将ComBoxMethod控件的默认选项设置为第一种控件选择方法
  54. comBoxMethod.SelectedIndex = ;
  55. }
  56.  
  57. //定义方法获取要素图层
  58. private IFeatureLayer GetFeatureLayerByName(IMap map, string layerName)
  59. {
  60. //对地图图层进行遍历
  61. for (int i = ; i < map.LayerCount; i++)
  62. {
  63. //如果该图层为图层组类型,则分别对包含的每个图层进行操作
  64. if (map.get_Layer(i) is GroupLayer)
  65. {
  66. //使用ICompositeLayer接口进行遍历操作
  67. ICompositeLayer compositeLayer = map.get_Layer(i) as ICompositeLayer;
  68. for (int j = ; j < compositeLayer.Count; j++)
  69. {
  70. //如果图层名称为所要查询的图层名称,则返回IFeaturelayer接口的矢量图层对象
  71. if (compositeLayer.get_Layer(j).Name == layerName)
  72. {
  73. return (IFeatureLayer)compositeLayer.get_Layer(j);
  74. }
  75. }
  76. }
  77. //如果图层不是图层组类型,则直接进行判断
  78. else
  79. {
  80. if (map.get_Layer(i).Name == layerName)
  81. {
  82. return (IFeatureLayer)map.get_Layer(i);
  83. }
  84. }
  85. }
  86. return null;
  87. }
  88. //定义方法获取几何对象
  89. private IGeometry GetFeatureLayerGeometryUnion(IFeatureLayer featureLayer)
  90. {
  91. //定义IGeometry接口对象,存储每一步拓扑操作后得到的几何体
  92. IGeometry geometry = null;
  93. //使用ITopologicalOperator接口进行几何体的拓扑操作
  94. ITopologicalOperator topologicalOperator;
  95. //使用null作为查询过滤器得到图层中所有要素的游标
  96. IFeatureCursor featureCursor = featureLayer.Search(null, false);
  97. //获取IFeature接口游标中的第一个元素
  98. IFeature feature = featureCursor.NextFeature();
  99. //当游标不为空时
  100. while (feature != null)
  101. {
  102. //如果几何体不为空
  103. if (geometry != null)
  104. {
  105. //进行接口转换,使当前接口进行拓扑操作
  106. topologicalOperator = geometry as ITopologicalOperator;
  107. //执行拓扑合并操作,将当前要素的几何体与已有的几何体进行Union,返回新的合并后的几何体
  108. geometry = topologicalOperator.Union(feature.Shape);
  109. }
  110. else
  111. geometry = feature.Shape;
  112. feature = featureCursor.NextFeature();//移动游标到下一个要素
  113. }
  114. //返回最新合并的几何体
  115. return geometry;
  116. }
  117. //定义指定查询的方法
  118. private void SelectFeaturesBySpatial()
  119. {
  120. //定义和创建用于查询的ISpatialFilter接口对象
  121. ISpatialFilter spatialFilter = new SpatialFilterClass();
  122. //默认设定用于查询的空间几何体为当前地图源图层中所有要素几何体的集合
  123. spatialFilter.Geometry = GetFeatureLayerGeometryUnion(GetFeatureLayerByName(currentMap, comBoxSourceLayer.SelectedItem.ToString()));
  124. //根据对空间选择方法的选择采用相应的空间选择方法
  125. switch (comBoxMethod.SelectedIndex)
  126. {
  127. case :
  128. spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
  129. break;
  130. case :
  131. spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelWithin;
  132. break;
  133. case :
  134. spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
  135. break;
  136. case :
  137. spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelTouches;
  138. break;
  139. case :
  140. spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses;
  141. break;
  142. case :
  143. spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelEnvelopeIntersects;
  144. break;
  145. case :
  146. spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelOverlaps;
  147. break;
  148. default:
  149. spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
  150. break;
  151. }
  152. //对选择的目标图层进行遍历,并对每一个图层进行空间查询,查询结果将放在选择集中
  153. IFeatureLayer featureLayer;
  154. //对所有选择的目标图层进行遍历
  155. for (int i = ; i < checkListTargetLayer.CheckedItems.Count; i++)
  156. {
  157. //根据选择的目标图层名称获得对应的矢量图层
  158. featureLayer = GetFeatureLayerByName(currentMap, (string)checkListTargetLayer.CheckedItems[i]);
  159. //进行接口转换,使用IFeatureSelection接口选择要素
  160. IFeatureSelection featureSelection = featureLayer as IFeatureSelection;
  161. //使用IFeatureSelection接口的SelectFeature方法,根据空间查询过滤器选择要素,将其放在新的选择集中
  162. featureSelection.SelectFeatures((IQueryFilter)spatialFilter, esriSelectionResultEnum.esriSelectionResultAdd, false);
  163. }
  164. //进行接口转换,使用IActiveView接口进行视图操作
  165. IActiveView activeView = currentMap as IActiveView;
  166. //进行部分刷新操作,只刷新选择集的内容
  167. activeView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, activeView.Extent);
  168. }
  169.  
  170. private void btnOk_Click(object sender, EventArgs e)
  171. {
  172. try
  173. {
  174. SelectFeaturesBySpatial();
  175. this.Close();
  176. }
  177. catch { }
  178. }
  179.  
  180. private void btnApply_Click(object sender, EventArgs e)
  181. {
  182. try
  183. {
  184. SelectFeaturesBySpatial();
  185. }
  186. catch { }
  187. }
  188.  
  189. private void btnClose_Click(object sender, EventArgs e)
  190. {
  191. this.Close();
  192. }

ArcGIS Engine开发之空间查询的更多相关文章

  1. ArcGIS Engine开发之图形查询

    图形查询是以用户通过鼠标操作生成的图形几何体为输入条件进行查询的查询,其查询结果为该几何体空间范围内的所有要素.常用的查询方式包括点选.线选.多边形选择.圆形选择和矩形选择等. 相关类与接口 图像查询 ...

  2. ArcGIS Engine开发之属性查询

    属性查询即基于空间数据的属性数据的查询,通过用户提交SQL语言中的where语句定义的查询条件,对属性数据进行搜索,从而得到查询结果的操作. 相关的类与接口 与属性查询功能相关的类主要有QureyFi ...

  3. ArcGIS Engine开发之地图基本操作(4)

    ArcGIS Engine开发中数据库的加载 1.加载个人地理数据库数据 个人地理数据库(Personal Geodatabase)使用Miscrosoft Access文件(*.mdb)进行空间数据 ...

  4. ArcGIS Engine开发前基础知识(2)

    ArcGIS基本控件简介 ArcGIS Engine控件是一组可视化的开发组件,每个ArcGIS Engine控件都是一个COM组件.这些组件包括MapControl,PageLayoutContro ...

  5. ArcGIS Engine开发基础总结(一)

    标准Engine功能 地图浏览    地图制作 数据查询 数据分析 及 所有的开发控件 —MapControl, PageLayout, Toolbar, TOC, ArcReader 对所有矢量和栅 ...

  6. ArcGIS Engine开发鹰眼图的功能(基础篇)

    鹰眼是用于调节全视域范围内主地图显示范围情况的副地图.它体现了地图整体与详细局部的关系. 用户可以通过鼠标单击或者画框等动作实现鹰眼与主地图的交互情况. 鹰眼功能的原理是通过主地图窗口的地图控件和鹰眼 ...

  7. ArcGIS Engine开发前基础知识(3)

    对象模型图 一.对象模型图中的类与接口 ArcGIS Engine 提供大量的对象,这些对象之间存在各种各样的关系,如继承.组合.关联等.对象模型图(Object model diagram,ODM) ...

  8. ArcGIS Engine开发的ArcGIS 版本管理的功能

    原文:ArcGIS Engine开发的ArcGIS 版本管理的功能 转自:http://blog.csdn.net/linghe301/article/details/7965901 这是以前的Arc ...

  9. C#,ArcGIS Engine开发入门教程

    C#,ArcGIS Engine开发入门教程 转自:http://blog.csdn.net/yanleigis/article/details/2233674  目录(?)[+] 五实现 一 加载A ...

随机推荐

  1. fhq treap最终模板

    新学习了fhq treap,厉害了 先贴个神犇的版, from memphis /* Treap[Merge,Split] by Memphis */ #include<cstdio> # ...

  2. Xamarin和微软发起.NET基金会

    新闻<微软宣布成立.NET基金会全面支持开源项目 包括C#编译器Roslyn>,看到大家对微软的开放都很兴奋.在此之前在.NET社区也有了大量的开源项目,所列的24个项目也是早就开源,这次 ...

  3. 让ASP.NET5在Jexus上飞呀飞

    就在最近一段时间,“Visual Studio 2015 CTP 5”(以下简称CTP5)发布了,CTP5的发布不仅标志着新一代的VisualStudio正式发布又向前迈出了一步,还标志着距离ASP. ...

  4. ABP源码分析三十八: ABP.Web.Api.OData

    如果对OData不熟悉的话可参考OData的初步认识一文以获取OData的一些初步知识. API.Odata 模块唯一用处就是提供了一个泛型版本的ODataController,实现了Controll ...

  5. 查看Windows下引起Oracle CPU占用率高的神器-qslice

    前言: qslice是一个win2000的工具包,能分析进程的cpu占用率,我们用于分析oracle的性能 这是绿色的软件无需安装. 我们经常会碰到oracle的CPU占用居高不下,无法快速定位到问题 ...

  6. salesforce 零基础学习(五十五)java通过SOAP方式定时访问某个文件然后插入到sObject中

    项目源码:https://github.com/zhangyueqidlmu/SOAP-Access-SFDC.git 项目背景:salesforce端相关数据需要其他系统提供,其他系统可以提供相关数 ...

  7. wordpress去掉导航栏链接中的category

    找到服务器目录下的functions..php文件,在末尾处添加如下内容即可. 路径:/htdocs/wp-content/themes/functions.php 要追加在functions.php ...

  8. angularJS实用的开发技巧

    一.开端 真的是忙完这一阵子就可以忙下一阵子了啊... 最近在做一个angularJS+Ionic的移动端项目...记录一些技巧,方便自己以后查阅,也方便需要的人可以看一看...^_^ 二.基础原则了 ...

  9. Vertica节点宕机处理一例

    Vertica节点宕机处理一例: 查询数据库版本和各节点状态 常规方式启动宕机节点失败 进一步查看宕机节点的详细日志 定位问题并解决 1. 查询数据库版本和各节点状态 dbadmin=> sel ...

  10. 由浅入深学习ajax跨域(JSONP)问题

    什么是跨域?说直白点就是获取别人网站上的内容.但这么说貌似又有点混淆,因为通常我们用ajax+php就可以获取别人网站的内容,来看下面这个例子. 来看看跨域的例子,jquery+ajax是不能跨域请求 ...