空间数据查询
三峡大学土木水电学院 肖泽云
空间数据查询按查询方式来分,主要分为两类:根据属性条件查询对象和根据几何条件查询对象。无论是根据属性还是根据几何来查询对象,都必须设置相应的查询条件。在ArcGIS Engine中,FeatureLayer对象和IFeatureClass对象有一个Search()方法专门用于空间数据查询,同时ArcGIS Engine中提供了一个IQueryFilter接口来设置查询的条件(属性条件和几何条件)。首先来看一下IFeatureLayer接口的Search()方法,其定义如下:
public IFeatureCursor Search (IQueryFilter queryFilter,bool recycling);
该方法有两个参数:第一个参数queryFilter为一个IQueryFilter对象,用于指定查询的条件了;第二个参数recycling为一个Bool数据类型,表示查询结果游标是否循环。该方法的返回值为一个IFeatureCursor对象,该游标对象表示查询的结果对象。下面就分别根据属性条件查询对象和根据几何条件查询对象来介绍空间数据查询的过程:
一、根据属性条件查询对象
首先新建一个项目,设置项目名称为“空间数据查询”,并在窗体上添加如下图所示控件(axMapControl1、axTOCControl1、axLicenseControl1、axToolbarControl1):
同时为了便于设置条件来查询对象,添加如下图所示控件(layerComboBox、queryFiltertextBox和根据属性条件查询对象):
其中,layerComboBox控件用于表示要查询的图层,queryFiltertextBox控件表示查询的条件。
1、定义刷新图层函数
在每次添加新数据或打开新地图时,都要更新layerComboBox控件中的显示项来表示当前地图中的图层。定义刷新图层函数RefreshLayer(),其代码如下:
private void RefreshLayer()
{
layerComboBox.Items.Clear();
for (int i = 0; i < axMapControl1.LayerCount; i++)
{
layerComboBox.Items.Add(axMapControl1.get_Layer(i).Name);
}
layerComboBox.Text = layerComboBox.Items[0].ToString();
}
2、根据属性条件查询对象
根据属性条件查询对象主要通过“根据属性条件查询对象”按钮的Click()事件来实现,下面介绍的代码都在“根据属性条件查询对象”按钮的Click()事件中编写。
1)获取查询的图层
首先要获取到查询的图层对象,如下定义:
ESRI.ArcGIS.Carto.IFeatureLayer pFeatureLayer=axMapControl1.get_Layer(layerComboBox.SelectedIndex) as ESRI.ArcGIS.Carto.IFeatureLayer;
if (pFeatureLayer == null)
{
MessageBox.Show("选择图层不是Feature图层!");
return;
}
如上代码中,定义一个IFeatureLayer对象,该图层对象即为layerComboBox控件中选择的图层,如果该图层不是FeatureLayer,则返回。
2)定义查询条件
首先定义一个查询过滤对象,如下代码所示(由于IQueryFilter接口位于Geodatabase库中,所以还需要添加引用Geodatabase库):
ESRI.ArcGIS.Geodatabase.IQueryFilter queryFilter = new ESRI.ArcGIS.Geodatabase.QueryFilterClass();
从queryFiltertextBox控件中获取查询条件,如下:
queryFilter.WhereClause = queryFiltertextBox.Text;
3)查询对象
定义一个游标对象IFeatureCursor表示查询到的结果,使用IFeatureLayer的Search()方法来查询,如下代码:
ESRI.ArcGIS.Geodatabase.IFeatureCursor featureCursor = pFeatureLayer.Search(queryFilter, false);
4)高亮显示数据
高亮显示数据可以使用axMapControl1的FlashShape()方法来实现,如下代码:
ESRI.ArcGIS.Geodatabase.IFeature pFeature ;
while((pFeature= featureCursor.NextFeature())!=null)
{
axMapControl1.FlashShape(pFeature.Shape);
}
添加一些相关错误处理方式,最后“根据属性条件查询对象”按钮的Click()事件代码如下:
private void 根据属性条件查询对象_Click(object sender, EventArgs e)
{
ESRI.ArcGIS.Carto.IFeatureLayer pFeatureLayer=axMapControl1.get_Layer(layerComboBox.SelectedIndex) as ESRI.ArcGIS.Carto.IFeatureLayer;
if (pFeatureLayer == null)
{
MessageBox.Show("选择图层不是Feature图层!");
return;
}
ESRI.ArcGIS.Geodatabase.IQueryFilter queryFilter = new ESRI.ArcGIS.Geodatabase.QueryFilterClass();
queryFilter.WhereClause = queryFiltertextBox.Text;
try
{
ESRI.ArcGIS.Geodatabase.IFeatureCursor featureCursor = pFeatureLayer.Search(queryFilter, false);
ESRI.ArcGIS.Geodatabase.IFeature pFeature;
while ((pFeature = featureCursor.NextFeature()) != null)
{
axMapControl1.FlashShape(pFeature.Shape);
}
}
catch (Exception pException)
{
MessageBox.Show(pException.Message);
}
}
值得注意的是:queryFiltertextBox控件中输入的查询条件需符号要求,如查询属性字段Elevation为800的数据对象,如果属性字段Elevation的数据类型为数值型(浮点型、整型、双精度),则直接输入“Elevation = 800”即可。如果属性字段Elevation的数据类型为Text,则输入“Elevation = ‘800’”,需要在值左右侧加上单引号。
运行程序,其结果如下图所示:
源码及开发文档下载地址(保存于网络硬盘,请勿直接复制链接下载!):
http://www.brsbox.com/filebox/up ... bbb3/dirids/1501532