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利用root权限执行shell脚本
vi /etc/sudoers , 为apache用户赋予root权限,并且不需要密码,还有一步重要的修改(我被困扰的就是这个地方) root ALL=(ALL) ALL apache ALL= ...
- .JavaWeb文件上传和FileUpload组件使用
.JavaWeb文件上传 1.自定义上传 文件上传时的表单设计要符合文件提交的方式: 1.提交方式:post 2.表单中有文件上传的表单项:<input type="file" ...
- 一个标签的72变,打造一个纯CSS图标库
每次要用到图标的时候都会到 icono 去copypaste,但每次用到的时候尺寸都各不一样,总是要调整参数,巨烦.当然你可以会想到用zoom.scale来做缩放,但是这样的缩放会使得线宽也变粗了,不 ...
- C++模板编程:如何使非通用的模板函数实现声明和定义分离
我们在编写C++类库时,为了隐藏实现,往往只能忍痛舍弃模版的强大特性.但如果我们只需要有限的几个类型的模版实现,并且不允许用户传入其他类型时,我们就可以将实例化的代码放在cpp文件中实现了.然而,当我 ...
- Html5 希尔排序演示
希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本. 如下图所示: 代码如下: <!DOCTYPE html> <html& ...
- 给WinForm窗体添加快捷键 响应回车键、空格键
1.设置窗体KeyPreview属性为True 2.添加窗体的KeyDown事件 /// <summary> /// 窗体的keydown事件响应 添加快捷键 /// </summa ...
- JDBC基础
今天看了看JDBC(Java DataBase Connectivity)总结一下 关于JDBC 加载JDBC驱动 建立数据库连接 创建一个Statement或者PreparedStatement 获 ...
- Android之SQLite数据库使用
转载整理于:http://my.csdn.net/lmj623565791 我刚开始接触Android的时候甚至都不敢相信,Android系统竟然是内置了数据库的!好吧,是我太孤陋寡闻了.由于我之前是 ...
- .NET Core采用的全新配置系统[7]: 将配置保存在数据库中
我们在<聊聊默认支持的各种配置源>和<深入了解三种针对文件(JSON.XML与INI)的配置源>对配置模型中默认提供的各种ConfigurationSource进行了深入详尽的 ...
- JMS学习之路(一):整合activeMQ到SpringMVC
JMS的全称是Java Message Service,即Java消息服务.它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息.把它应用到实际的业务需求中的话我们可以 ...