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

相关类与接口

空间查询相关的类主要是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开发之空间查询的更多相关文章

  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. 《Note --- Unreal --- MemPro (CONTINUE... ...)》

    Mem pro 是一个主要集成内存泄露检测的工具,其具有自身的源码和GUI,在GUI中利用"Launch" button进行加载自己待检测的application,目前支持的平台为 ...

  2. /etc/ppp/chap-secrets

    # Secrets for authentication using CHAP # client server secret IP addresses abc l2tpd * client:VPN 用 ...

  3. win7,M​i​n​d​m​a​n​a​g​e​r​2​0​1​2使用模板时弹出Runtime error R6025解决方法

    Mindjet.MindManager2012.v10.0在应用个别模板时提示"参数错误",然后自动关闭. 解决办法: 如果是win7系统,可以进入C:\Users\(用户名)\A ...

  4. 无限分级和tree结构数据增删改【提供Demo下载】

    无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...

  5. 新手如何在gdb中存活

    网络上已经有很多gdb调试的文章了,为什么我还要写这篇文章呢,因为本文是写给gdb新手的,目的就是通过一个简单的例子来让新手很快上手.一旦上手入门了,其他的问题就可以自己去搜索搞定了.右边是gdb的L ...

  6. [Intel Edison开发板] 02、Edison开发板入门

    一.前言 Start from the link: 开始学习的链接 上面链接是官网的教程,按照教程可以开发板入门: 其中第一步是了解开发板,涉及到如何组装.如何连线.一些主要的接口简单介绍等信息: 第 ...

  7. 多行文本溢出显示省略号(…) text-overflow: ellipsis

    详解text-overflow 语法: text-overflow:clip | ellipsis 默认值:clip 适用于:块级容器元素 继承性:无 动画性:否 计算值:指定值 取值: clip:当 ...

  8. JVM学习(4)——全面总结Java的GC算法和回收机制

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 一些JVM的跟踪参数的设置 Java堆的分配参数 -Xmx 和 –Xms 应该保持一个什么关系,可以让系统的 ...

  9. SQL连接

    SQL连接可以分为内连接.外连接.交叉连接. 数据库数据:             book表                                          stu表 1.内连接 ...

  10. 利用Python进行数据分析(12) pandas基础: 数据合并

    pandas 提供了三种主要方法可以对数据进行合并: pandas.merge()方法:数据库风格的合并: pandas.concat()方法:轴向连接,即沿着一条轴将多个对象堆叠到一起: 实例方法c ...