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

相关类与接口

空间查询相关的类主要是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. [Django]用户权限学习系列之User权限基本操作指令

    针对Django 后台自带的用户管理系统,虽说感觉还可以,但是为了方便用户一些操作,特别设计自定义的用户权限管理系统. 在制作权限页面前,首先需要了解权限和用户配置权限的指令,上章讲到权限的添加,删除 ...

  2. BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2326  Solved: 1054[Submit][Status ...

  3. Android(4)—Mono For Android 第一个App应用程序

    0.前言 年前就计划着写这篇博客,总结一下自己做的第一个App,却一直被新项目所累,今天抽空把它写完,记录并回顾一下相关知识点,也为刚学习Mono的同学提供佐证->C#也是开发Android的! ...

  4. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

    --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...

  5. [.NET领域驱动设计实战系列]专题二:结合领域驱动设计的面向服务架构来搭建网上书店

    一.前言 在前面专题一中,我已经介绍了我写这系列文章的初衷了.由于dax.net中的DDD框架和Byteart Retail案例并没有对其形成过程做一步步分析,而是把整个DDD的实现案例展现给我们,这 ...

  6. Linux 系统中发博客必备的五大图片处理神器

    发博客时,总免不了要用图片说话.经过长时间的磨合,在 Linux 桌面系统下有几款图片处理软件我已经用得比较顺手了.这几款软件在 Linux 世界使用广泛,各个 Linux 发行版的软件仓库中都有自带 ...

  7. Rxjava cold/hot Observable

    create Observable分为cold以及hot两种,cold主要是静态的,每次subscribe都是从头开始互不干扰,而hot的在同一时刻获得的值是一致的 cold Observable 使 ...

  8. C# Azure 消息队列ServiceBus (服务总线队列)

    1. 前言 在阅读本文之前,可以查看微软官方的说明. https://www.azure.cn/documentation/articles/service-bus-create-queues/ 2. ...

  9. Android Toolbar 开发总结

    初识 Toolbar Toolbar是在 Android 5.0 开始推出的一个 Material Design 风格的导航控件 ,Google 非常推荐大家使用 Toolbar 来作为Android ...

  10. 初探AngularJS

    一.前言 早已听说AngularJS的大名,并在很久前也编写过些小demo,但是都没有系统学习过.由于,在下个版本项目中用到了AngularJS,so,那就一起再来研究研究呗. 说到,这个Angula ...