ArcGIS Engine开发之空间查询
空间查询功能是通过用户选择的空间几何体以及该几何体与当前地图中要素之间的几何关系进行空间查找,从而得到查询结果的操作。
相关类与接口
空间查询相关的类主要是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方法来进行几何体合并操作,该接口是点、线、面等几何体对象所共同实现的接口。

代码:
public partial class FormQueryBySpatial : DevExpress.XtraEditors.XtraForm
{
//变量定义
private IMap currentMap;//当前MapControl控件的Map对象
private IFeatureLayer currentFeatureLayer;//设置临时类变量来使用IFeatureLayer接口的当前图层对象
private string currentFileName;//设置临时类变量来存储字段名称
/// <summary>
/// 获得当前MapControl控件中的对象
/// </summary>
public IMap CurrentMap
{
set
{
currentMap = value;
}
}
public FormQueryBySpatial()
{
InitializeComponent();
} private void FormQueryBySpatial_Load(object sender, EventArgs e)
{
//清空目标图层列表
checkListTargetLayer.Items.Clear();
string layerName;//设置临时变量存储图层名称
//对Map中的每一个图层进行判断并添加图层名称
for (int i = ; i < currentMap.LayerCount; i++)
{
//如果该图层为图层组类型,则分别对所包含的每个图层进行操作
if (currentMap.get_Layer(i) is GroupLayer)
{
//使用ICompositeLayer接口进行遍历操作
ICompositeLayer compositeLayer = currentMap.get_Layer(i) as ICompositeLayer;
for (int j = ; j < compositeLayer.Count; j++)
{
//将图层的名称添加到checkListTargetLayer控件中
layerName = compositeLayer.get_Layer(j).Name;
checkListTargetLayer.Items.Add(layerName);
comBoxSourceLayer.Items.Add(layerName);
}
}
//如果图层不是图层组类型,则直接添加名称
else
{
layerName = currentMap.get_Layer(i).Name;
checkListTargetLayer.Items.Add(layerName);
comBoxSourceLayer.Items.Add(layerName);
}
}
//将comboxSourceLayer控件的默认选项设置为第一个图层的名称
comBoxSourceLayer.SelectedIndex = ;
//将ComBoxMethod控件的默认选项设置为第一种控件选择方法
comBoxMethod.SelectedIndex = ;
} //定义方法获取要素图层
private IFeatureLayer GetFeatureLayerByName(IMap map, string layerName)
{
//对地图图层进行遍历
for (int i = ; i < map.LayerCount; i++)
{
//如果该图层为图层组类型,则分别对包含的每个图层进行操作
if (map.get_Layer(i) is GroupLayer)
{
//使用ICompositeLayer接口进行遍历操作
ICompositeLayer compositeLayer = map.get_Layer(i) as ICompositeLayer;
for (int j = ; j < compositeLayer.Count; j++)
{
//如果图层名称为所要查询的图层名称,则返回IFeaturelayer接口的矢量图层对象
if (compositeLayer.get_Layer(j).Name == layerName)
{
return (IFeatureLayer)compositeLayer.get_Layer(j);
}
}
}
//如果图层不是图层组类型,则直接进行判断
else
{
if (map.get_Layer(i).Name == layerName)
{
return (IFeatureLayer)map.get_Layer(i);
}
}
}
return null;
}
//定义方法获取几何对象
private IGeometry GetFeatureLayerGeometryUnion(IFeatureLayer featureLayer)
{
//定义IGeometry接口对象,存储每一步拓扑操作后得到的几何体
IGeometry geometry = null;
//使用ITopologicalOperator接口进行几何体的拓扑操作
ITopologicalOperator topologicalOperator;
//使用null作为查询过滤器得到图层中所有要素的游标
IFeatureCursor featureCursor = featureLayer.Search(null, false);
//获取IFeature接口游标中的第一个元素
IFeature feature = featureCursor.NextFeature();
//当游标不为空时
while (feature != null)
{
//如果几何体不为空
if (geometry != null)
{
//进行接口转换,使当前接口进行拓扑操作
topologicalOperator = geometry as ITopologicalOperator;
//执行拓扑合并操作,将当前要素的几何体与已有的几何体进行Union,返回新的合并后的几何体
geometry = topologicalOperator.Union(feature.Shape);
}
else
geometry = feature.Shape;
feature = featureCursor.NextFeature();//移动游标到下一个要素
}
//返回最新合并的几何体
return geometry;
}
//定义指定查询的方法
private void SelectFeaturesBySpatial()
{
//定义和创建用于查询的ISpatialFilter接口对象
ISpatialFilter spatialFilter = new SpatialFilterClass();
//默认设定用于查询的空间几何体为当前地图源图层中所有要素几何体的集合
spatialFilter.Geometry = GetFeatureLayerGeometryUnion(GetFeatureLayerByName(currentMap, comBoxSourceLayer.SelectedItem.ToString()));
//根据对空间选择方法的选择采用相应的空间选择方法
switch (comBoxMethod.SelectedIndex)
{
case :
spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
break;
case :
spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelWithin;
break;
case :
spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
break;
case :
spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelTouches;
break;
case :
spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses;
break;
case :
spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelEnvelopeIntersects;
break;
case :
spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelOverlaps;
break;
default:
spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
break;
}
//对选择的目标图层进行遍历,并对每一个图层进行空间查询,查询结果将放在选择集中
IFeatureLayer featureLayer;
//对所有选择的目标图层进行遍历
for (int i = ; i < checkListTargetLayer.CheckedItems.Count; i++)
{
//根据选择的目标图层名称获得对应的矢量图层
featureLayer = GetFeatureLayerByName(currentMap, (string)checkListTargetLayer.CheckedItems[i]);
//进行接口转换,使用IFeatureSelection接口选择要素
IFeatureSelection featureSelection = featureLayer as IFeatureSelection;
//使用IFeatureSelection接口的SelectFeature方法,根据空间查询过滤器选择要素,将其放在新的选择集中
featureSelection.SelectFeatures((IQueryFilter)spatialFilter, esriSelectionResultEnum.esriSelectionResultAdd, false);
}
//进行接口转换,使用IActiveView接口进行视图操作
IActiveView activeView = currentMap as IActiveView;
//进行部分刷新操作,只刷新选择集的内容
activeView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, activeView.Extent);
} private void btnOk_Click(object sender, EventArgs e)
{
try
{
SelectFeaturesBySpatial();
this.Close();
}
catch { }
} private void btnApply_Click(object sender, EventArgs e)
{
try
{
SelectFeaturesBySpatial();
}
catch { }
} private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
}
ArcGIS Engine开发之空间查询的更多相关文章
- ArcGIS Engine开发之图形查询
图形查询是以用户通过鼠标操作生成的图形几何体为输入条件进行查询的查询,其查询结果为该几何体空间范围内的所有要素.常用的查询方式包括点选.线选.多边形选择.圆形选择和矩形选择等. 相关类与接口 图像查询 ...
- ArcGIS Engine开发之属性查询
属性查询即基于空间数据的属性数据的查询,通过用户提交SQL语言中的where语句定义的查询条件,对属性数据进行搜索,从而得到查询结果的操作. 相关的类与接口 与属性查询功能相关的类主要有QureyFi ...
- ArcGIS Engine开发之地图基本操作(4)
ArcGIS Engine开发中数据库的加载 1.加载个人地理数据库数据 个人地理数据库(Personal Geodatabase)使用Miscrosoft Access文件(*.mdb)进行空间数据 ...
- ArcGIS Engine开发前基础知识(2)
ArcGIS基本控件简介 ArcGIS Engine控件是一组可视化的开发组件,每个ArcGIS Engine控件都是一个COM组件.这些组件包括MapControl,PageLayoutContro ...
- ArcGIS Engine开发基础总结(一)
标准Engine功能 地图浏览 地图制作 数据查询 数据分析 及 所有的开发控件 —MapControl, PageLayout, Toolbar, TOC, ArcReader 对所有矢量和栅 ...
- ArcGIS Engine开发鹰眼图的功能(基础篇)
鹰眼是用于调节全视域范围内主地图显示范围情况的副地图.它体现了地图整体与详细局部的关系. 用户可以通过鼠标单击或者画框等动作实现鹰眼与主地图的交互情况. 鹰眼功能的原理是通过主地图窗口的地图控件和鹰眼 ...
- ArcGIS Engine开发前基础知识(3)
对象模型图 一.对象模型图中的类与接口 ArcGIS Engine 提供大量的对象,这些对象之间存在各种各样的关系,如继承.组合.关联等.对象模型图(Object model diagram,ODM) ...
- ArcGIS Engine开发的ArcGIS 版本管理的功能
原文:ArcGIS Engine开发的ArcGIS 版本管理的功能 转自:http://blog.csdn.net/linghe301/article/details/7965901 这是以前的Arc ...
- C#,ArcGIS Engine开发入门教程
C#,ArcGIS Engine开发入门教程 转自:http://blog.csdn.net/yanleigis/article/details/2233674 目录(?)[+] 五实现 一 加载A ...
随机推荐
- 新应用上线 Snippet
Snippet 是一款代码片段收集工具,经过一天三夜的开发终于上线了. 应用地址:snippets.barretlee.com 源码地址:barretlee/snippets 由于使用原生 JS 开发 ...
- C++右值引用浅析
一直想试着把自己理解和学习到的右值引用相关的技术细节整理并分享出来,希望能够对感兴趣的朋友提供帮助. 右值引用是C++11标准中新增的一个特性.右值引用允许程序员可以忽略逻辑上不需要的拷贝:而且还可以 ...
- Jvm --- 常用工具
jps:虚拟机进程状况工具 JVM Process Status Tool. 可以列出所有目前正在运行虚拟机的进程. jps -l 详细参数: -q 输出LVMID,省略主类名称 -m 输出虚拟机进程 ...
- 自学MVC看这里——全网最全ASP.NET MVC 教程汇总
MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MVC技术的学习者提供一个整合学习入口.本文从 ...
- git常用操作命令
使用git进行版本控制,分为两部分: 一: 服务端 1.1 首先要申请一个git的账号,方便团队协作.推荐开源中国(www.oschina.net),相对于github来说,有两个优点:1.访问速度很 ...
- 使用WordPress搭建自己的博客
突然间发现自己在阿里上有一个免费的虚拟云空间,好像是什么时候阿里云搞活动赠送的.看了看还有不少时间,就决定自己搭建一个博客系统.说到搭建自己的博客,第一时间就想到WordPress,这个用起来应该是最 ...
- bitmap对海量无重复的整数排序--转
原文地址:http://blog.csdn.net/u013074465/article/details/46956295 现在有n个无重复的正整数(n 小于10的7次方),如果内存限制在1.5M以内 ...
- Linux用户体系和文件权限总结
一. Linux系统用户和用户组相关文件 1. /etc/passwd文件 这个passwd文件是Linux用户信息文件.文件格式说明如下: root:x:0:0:root:/r ...
- C# WinForm制作电子琴键盘
上一篇 http://hovertree.com/h/bjaf/y8qol2p4.htm 再上一篇的基础上,使用WinForm制作了一个电子琴键盘: 演示地址 http://hovertree.com ...
- 使用PD(PowerDesigner)图如何快速生成创建数据库表的SQL脚本
打开PD软件: 1.新建概念模型(conceptual Data Model) File-->New Model-->Conceptual Data Mode 或者点击工作区,右键--&g ...