ArcGIS Engine开发之属性查询
属性查询即基于空间数据的属性数据的查询,通过用户提交SQL语言中的where语句定义的查询条件,对属性数据进行搜索,从而得到查询结果的操作。
相关的类与接口
与属性查询功能相关的类主要有QureyFilter、QueryDef、Cursor、FeatureCursor等。涉及的接口有IQueryFilter、IQueryDef、ICursor、IFeatureCursor以及IFeatureSelection等。以上的类和接口都位于ArcGIS.Geodatabase命名空间中。
1.QueryFilter类
该类用于根据属性值或关系来过滤数据,它实现了IQueryFilter接口,该接口主要有以下的接口和方法。
1)WhereClause属性
设置用来过滤数据的where条件子句。该子句使用SQL表达式来定义过滤数据的条件,可以使用运算符、通配符、函数等字符来构成where子句。具体的语法根据数据源的不同而有所不同。
2)SubField属性
定义用于数过滤的属性字段列表,如果列表有多项,则每项之间用英文逗号隔开,默认为*,意味着返回结果中包含所有字段,否则可以自定义需要返回的字段。
2.QueryDef类
该类是ESRI的查询定义类,为ArcGIS Engine中的Class类,不能被直接创建,可以由IFeatureWorkspace接口的CreateQueryDef方法创建。它实现了IQueryDef接口,该接口的成员用来操作基于属性的查询,主要有一下的属性和方法:
1)Tables属性:该属性定义所查询表的名称和列表,如果列表有多项,则每项之间用英文逗号隔开。
2)WhereClause属性:该属性的方法与IQueryFilter接口中的WhereClause属性的用法相同。
3)SubField属性:该属性的用法与IQueryFilter接口中的SubField属性用法相同。
4)Evaluate方法:该方法定义的查询并返回结果集的游标,该游标为ICursor接口类型。
3.Cursor类
该类是ESRI的游标类,为ArcGIS Engine中的Class类,不能直接被创建,可以由相关接口中的方法创建。
游标的解释:游标是数据库中的概念,他是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果,用户可以从游标中逐一获取上述的执行结果。从本质上讲,游标是一种能够从包括多条数据记录的结果集中每次提取一条记录的机制,因此,ArcGIS中使用游标的概念来操作各类查询的结果。游标的接口主要包括ICursor接口和IFeatureCursor接口,IFeatureCursor接口继承与ICursor接口,ICursor接口主要用于操作数据行,IFeatureCursor接口主要用来操作要素Feature。
Cursor类主要实现了ICursor接口,该接口的成员用来获取枚举的行和列的集合,或用来更新、删除和插入数据行。使用NextRow方法,将游标的位置向前移动一位,并返回该位置的行对象。
4.FeatureCursor类
该类是ESRI的要素游标类,为ArcGIS Eninge中的Class类,不能被直接创建,同样可以由相关接口中的方法创建。它实现了IFeatureCursor接口,该接口的成员的用法和ICursor接口的成员用法类似,区别是其操作的对象是要素。重要使用NextFeature方法(IFeature NextFeature),将游标的位置向前移动一位,并返回给位置的要素对象。
5.FeatureLayer类
该类主要操作要素的集合及要素的可视化表达,它实现了IFeatureLayer接口和IFeatureSelection接口。
1)IFeatureLayer接口:该接口的成员主要是要素图层各类常用属性和操作。其与查询相关的属性和方法有:
(1)Selectable属性:用于获取或设置图层是否可被选择。
(2)FeatureClass属性:用于获取或设置图层的要素类
(3)Search方法:根据设置的查询条件创建查询结果的游标。其参数包括IQueryFilter接口的查询过滤器,以及布尔类型的参数来确定游标是否需要被回收。该方法的返回值为IFeatureCursor类型
2)IFeatureSelection接口:该接口的成员用来控制图层的要素选择集,其中与查询相关的属性和方法有:
(1)SelectionFeature方法:用于根据设置的查询条件和选择方法等来选择要素。其参数包括IQueryFilter接口的查询过滤器,esriSelectionResultEnum枚举类型的选择集生成方法,以及布尔型的参数控制是否只选择一个要素。该方法没有返回值。
(2)SelectionSet属性。设置或获取单个矢量图层的选择集,其值为ISelectionSet接口类型。
6.FeatureClass类
该类是Engine中的Class类,不能被直接创建,但可以通过多种方法获取某个图层的要素类,如果使用IFeatureLayer接口的FeatureClass属性。它实现了IFeatureClass接口,该接口的成员用于控制要素类的属性和行为,主要的方法:
1)search方法:根据查询条件进行查询并返回结果游标,该方法的用法与IFeatureLayer接口中的Search方法的用法相同。
2)Select方法:根据查询条件选择相应的要素,并将其放置在选择集中。其参数包括IQueryFilter接口查询过滤器,定义选择方式参数,定义查询的工作区的参数。其返回值为ISelectionSet接口类型。
最终运行截图

代码:
public partial class FormQueryByAttribute : 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 FormQueryByAttribute()
{ InitializeComponent();
}
#region 窗体加载Load事件
private void FormQueryByAttribute_Load(object sender, EventArgs e)
{
try
{
//将当前图层列表清空
comBoxLayerName.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++)
{
//将图层的名称添加到comboxLayerName中
layerName = compositeLayer.get_Layer(j).Name;
comBoxLayerName.Items.Add(layerName);
}
}
//如果图层不是图层组类型,则直接添加名称
else
{
layerName = currentMap.get_Layer(i).Name;
comBoxLayerName.Items.Add(layerName);
}
}
//将comboxLayerName控件的默认选项设置为第一个图层名称
comBoxLayerName.SelectedIndex = ;
//将comboxselectMethod控件的默认选项设置为第一种选择方式
comBoxSelectMethod.SelectedIndex = ;
}
catch { }
}
#endregion
#region 图层名称下拉框中选择的图层发生改变时触发事件
private void comBoxLayerName_SelectedIndexChanged(object sender, EventArgs e)
{
//首先将字段列表和字段值列表清空
ListBoxFields.Items.Clear();
ListBoxValues.Items.Clear();
IField field;//设置临时变量存储使用的IField接口对象
for (int i = ; i < currentMap.LayerCount; i++)
{
if (currentMap.get_Layer(i) is GroupLayer)
{
ICompositeLayer compositeLayer = currentMap.get_Layer(i) as ICompositeLayer;
for (int j = ; i < compositeLayer.Count; j++)
{
//判断图层的名称是否与comBoxLayerName控件中选择的图层名称相同
if (compositeLayer.get_Layer(j).Name == comBoxLayerName.SelectedItem.ToString())
{
//如果相同则设置为整个窗体使用的IFeatureLayer接口对象
currentFeatureLayer = compositeLayer.get_Layer(j) as IFeatureLayer;
break;
}
}
}
else
{
//判断图层的名称是否与comboxLayerName控件中选择的图层名称相同
if (currentMap.get_Layer(i).Name == comBoxLayerName.SelectedItem.ToString())
{
//如果相同则设置为整个窗体所使用的IFeatureLayer接口对象
currentFeatureLayer = currentMap.get_Layer(i) as IFeatureLayer;
break;
}
}
}
//使用IFeatureClass接口对该图层的所有属性字段进行遍历,并填充listboxField控件
for (int i = ; i < currentFeatureLayer.FeatureClass.Fields.FieldCount; i++)
{
//根据索引值获取图层的字段
field = currentFeatureLayer.FeatureClass.Fields.get_Field(i);
//排除SHAPE字段,并在其他字段名称前后添加字符“\”
if (field.Name.ToUpper() != "SHAPE")
ListBoxFields.Items.Add("\"" + field.Name + "\"");
}
//更新labelSelectResult控件中的图层名称信息
labSelectResult.Text = currentFeatureLayer.Name + "WHERE:";
//将显示where语句的文本内容清除
txtSelectResult.Clear();
}
#endregion
#region 选择方式下拉框中选择的图层发生改变时触发事件
private void comBoxSelectMethod_SelectedIndexChanged(object sender, EventArgs e)
{
//首先将listboxvalue控件中的字段属性清空
ListBoxValues.Items.Clear();
//将获取唯一值按钮设置为可用状态
if (btnOnlyAttributeValue.Enabled == true)
{
btnOnlyAttributeValue.Enabled = true;
}
//设置窗体可用的字段名称
string str = ListBoxFields.SelectedItem.ToString();
str = str.Substring();
str = str.Substring(,str.Length-);
currentFileName = str;
}
#endregion
#region 获取唯一值按钮的单击事件
private void btnOnlyAttributeValue_Click(object sender, EventArgs e)
{
//将图层的某个字段进行唯一值获取操作,并将所有的唯一值显示在listBoxValues控件中
try
{
//使用FeatureClass对象的IDataset接口来获取dataset和workspace的信息
IDataset dataset = (IDataset)currentFeatureLayer.FeatureClass;
//使用IQueryDef接口的对象来定义和查询属性信息。通过IWorkspace接口的CreateQueryDef()方法创建该对象。
IQueryDef queryDef = ((IFeatureWorkspace)dataset.Workspace).CreateQueryDef();
//设置所需查询的表格名称为dataset的名称
queryDef.Tables = dataset.Name;
//设置查询的字段名称。可以联合使用SQL语言的关键字,如查询唯一值可以使用DISTINCT关键字。
queryDef.SubFields = "DISTINCT (" +currentFileName + ")";
//执行查询并返回ICursor接口的对象来访问整个结果的集合
ICursor cursor = queryDef.Evaluate();
//使用IField接口获取当前所需要使用的字段的信息
IFields fields = currentFeatureLayer.FeatureClass.Fields;
IField field = fields.get_Field(fields.FindField(currentFileName)); //对整个结果集合进行遍历,从而添加所有的唯一值
//使用IRow接口来操作结果集合。首先定位到第一个查询结果。
IRow row = cursor.NextRow();
//如果查询结果非空,则一直进行添加操作
while (row != null)
{
//对String类型的字段,唯一值的前后添加'和',以符合SQL语句的要求
if (field.Type == esriFieldType.esriFieldTypeString)
{
ListBoxValues.Items.Add("\'" + row.get_Value().ToString() + "\'");
}
else
{
ListBoxValues.Items.Add(row.get_Value().ToString());
}
//继续执行下一个结果的添加
row = cursor.NextRow();
}
}
catch (Exception ex)
{ } }
#endregion
#region 各按钮的单击事件
//关闭
private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
}
//清除
private void btnClear_Click(object sender, EventArgs e)
{
txtSelectResult.Clear();
}
//在字段列表中双击属性字段名称时发生
private void ListBoxFields_MouseDoubleClick(object sender, MouseEventArgs e)
{
//在结果中添加字段的名称
txtSelectResult.Text += ListBoxFields.SelectedItem.ToString();
}
//字段值列表中双击添加
private void ListBoxValues_MouseDoubleClick(object sender, MouseEventArgs e)
{
txtSelectResult.Text += ListBoxValues.SelectedItem.ToString();
}
//点击“+”时
private void btnEqual_Click(object sender, EventArgs e)
{
//添加到结果文本框中
txtSelectResult.Text += " " + btnEqual.Text + " "; }
//点击“Like”时
private void btnLike_Click(object sender, EventArgs e)
{
txtSelectResult.Text += " " + btnLike.Text + " ";
}
//
private void btnDayu_Click(object sender, EventArgs e)
{
txtSelectResult.Text += "" + btnDayu.Text + ""; } private void btnDayuEqual_Click(object sender, EventArgs e)
{
txtSelectResult.Text +=" "+btnDayuEqual.Text+" ";
} private void btnAnd_Click(object sender, EventArgs e)
{
txtSelectResult.Text += "" + btnAnd.Text + "";
} private void btnXiYu_Click(object sender, EventArgs e)
{
txtSelectResult.Text += "" + btnXiYu.Text + "";
} private void btnXiaoyuEqual_Click(object sender, EventArgs e)
{
txtSelectResult.Text += "" + btnXiaoyuEqual.Text + "";
} private void btnUnderLine_Click(object sender, EventArgs e)
{
txtSelectResult.Text += "" + btnUnderLine.Text + "";
} private void btnPersent_Click(object sender, EventArgs e)
{
txtSelectResult.Text += "" + btnPersent.Text + "";
} private void btnIs_Click(object sender, EventArgs e)
{
txtSelectResult.Text += "" +btnIs.Text+"";
} private void btnNot_Click(object sender, EventArgs e)
{
txtSelectResult.Text += "" + btnNot.Text + "";
} private void btnNoEqual_Click(object sender, EventArgs e)
{
txtSelectResult.Text += "" + btnNoEqual.Text + "";
}
#endregion
#region 定义执查询的方法
private void SelectFeatureByAttribute()
{
//使用FeatureLayer对象的IFeatureSelection接口执行查询操作。进行接口的转换。
IFeatureSelection featureSelection=currentFeatureLayer as IFeatureSelection;
//新建IQueryFilter接口的对象来进行Where语句定义
IQueryFilter queryFilter=new QueryFilterClass();
//设置Where语句内容
queryFilter.WhereClause=txtSelectResult.Text;
//通过接口转换使用Map对象的IActiveView接口来部分刷新地图窗口,从而高亮显示查询结果
IActiveView activeView =currentMap as IActiveView ;
//根据查询选择方式的不同,得到不同的选择集
switch(comBoxSelectMethod.SelectedIndex)
{
//在新建选择集的情况下
case :
//首先使用IMap接口的ClearSelection()方法清空地图选择集
currentMap.ClearSelection();
//根据定义的where语句使用IFeatureSelection接口的SelectFeature方法选择要素,并将其添加到选择集中
featureSelection.SelectFeatures(queryFilter,esriSelectionResultEnum.esriSelectionResultNew,false);
break;
case :
featureSelection .SelectFeatures(queryFilter,esriSelectionResultEnum.esriSelectionResultAdd,false);
break;
case :
featureSelection .SelectFeatures(queryFilter,esriSelectionResultEnum.esriSelectionResultXOR,false);
break;
case :
featureSelection .SelectFeatures(queryFilter,esriSelectionResultEnum.esriSelectionResultAdd,false);
break;
//默认为新建选择集的情况
default:
featureSelection .SelectFeatures(queryFilter,esriSelectionResultEnum.esriSelectionResultNew,false);
break;
}
//部分刷新操作,只刷新地理选择集的内容
activeView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection,null,activeView.Extent);
}
#endregion
//确定按钮
private void btnOk_Click(object sender, EventArgs e)
{
try
{
SelectFeatureByAttribute();
this.Close();
}
catch { }
}
//应用按钮
private void btnApply_Click(object sender, EventArgs e)
{
SelectFeatureByAttribute();
} }
代码2:主窗口中按钮事件
#region 属性查询的按钮事件
private void btnSearchAttribute_ItemClick(object sender, ItemClickEventArgs e)
{
//创建新建属性查询窗体
FormQueryByAttribute frmQureyByAttribute = new FormQueryByAttribute();
//将当前主窗体的MapControl控件中的Map对象赋值给FormQueryByAttribute窗体的CurrentMap属性
frmQureyByAttribute.CurrentMap = mainMapControl.Map;
//显示属性查询窗体
frmQureyByAttribute.Show();
}
#endregion
ArcGIS Engine开发之属性查询的更多相关文章
- ArcGIS Engine开发之图形查询
图形查询是以用户通过鼠标操作生成的图形几何体为输入条件进行查询的查询,其查询结果为该几何体空间范围内的所有要素.常用的查询方式包括点选.线选.多边形选择.圆形选择和矩形选择等. 相关类与接口 图像查询 ...
- ArcGIS Engine开发之空间查询
空间查询功能是通过用户选择的空间几何体以及该几何体与当前地图中要素之间的几何关系进行空间查找,从而得到查询结果的操作. 相关类与接口 空间查询相关的类主要是SpatialFilter类,其实现的接口主 ...
- 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开发前基础知识(3)
对象模型图 一.对象模型图中的类与接口 ArcGIS Engine 提供大量的对象,这些对象之间存在各种各样的关系,如继承.组合.关联等.对象模型图(Object model diagram,ODM) ...
- C#,ArcGIS Engine开发入门教程
C#,ArcGIS Engine开发入门教程 转自:http://blog.csdn.net/yanleigis/article/details/2233674 目录(?)[+] 五实现 一 加载A ...
- ArcGIS Engine开发鹰眼图的功能(基础篇)
鹰眼是用于调节全视域范围内主地图显示范围情况的副地图.它体现了地图整体与详细局部的关系. 用户可以通过鼠标单击或者画框等动作实现鹰眼与主地图的交互情况. 鹰眼功能的原理是通过主地图窗口的地图控件和鹰眼 ...
- ArcGIS Engine开发的ArcGIS 版本管理的功能
原文:ArcGIS Engine开发的ArcGIS 版本管理的功能 转自:http://blog.csdn.net/linghe301/article/details/7965901 这是以前的Arc ...
随机推荐
- PHP安装
工具 http://www.cnblogs.com/xiwang6428/p/4315049.html http://www.iteye.com/news/22672 1 安装:sudo apt-ge ...
- Merge Sorted Array
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:Yo ...
- 学习笔记:发现一个IE版本判断的好方法
web开发就不得不面对浏览器兼容性问题,特别是IE的兼容问题.在前端代码中经常要处理一些兼容格式,为了解决这个问题网上找了找识别浏览器版本的方法. 常规js方法 找到一个方法,还不错,可以识别出各 ...
- 【JavaScript吉光片羽】--- 滑动条
灯光的亮度控制需要一个滑动条,先借用lamp源码中Bar: var Bar = function (opt) { var defaults = { $id: "", // 进度条d ...
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总
--系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...
- 使用mapreduce计算环比的实例
最近做了一个小的mapreduce程序,主要目的是计算环比值最高的前5名,本来打算使用spark计算,可是本人目前spark还只是简单看了下,因此就先改用mapreduce计算了,今天和大家分享下这个 ...
- 借助亚马逊S3和RapidMiner将机器学习应用到文本挖掘
本挖掘典型地运用了机器学习技术,例如聚类,分类,关联规则,和预测建模.这些技术揭示潜在内容中的意义和关系.文本发掘应用于诸如竞争情报,生命科学,客户呼声,媒体和出版,法律和税收,法律实施,情感分析和趋 ...
- JavaScript权威设计--命名空间,函数,闭包(简要学习笔记十二)
1.作为命名空间的函数 有时候我们需要声明很多变量.这样的变量会污染全局变量并且可能与别人声明的变量产生冲突. 这时.解决办法是将代码放入一个函数中,然后调用这个函数.这样全局变量就变成了 局部变量. ...
- 从零开始编写自己的C#框架(13)——T4模板在逻辑层中的应用(二)
最近这段时间特忙,公事私事,忙得有时都没时间打开电脑了,这两周只能尽量更新,以后再将章节补回来. 直接进入主题,通过上一章节,大家明白了怎么使用模板类编写T4模板,本章进的是一些简单技巧的应用 1.首 ...
- 关于gitignore文件的创建与使用
在我们使用github提交本地代码时,有些库文件和日志文件是不必要提交的,那如何处理这个问题呢?这个时候我们就会用到.gitignore文件了. 该篇博客我会介绍如何创建.gitignore,以及如何 ...