和查询相关的对象和接口
查询在GIS领域应该是一个很频繁的操作,在GIS中除了具有属性查询(和其他关系型数据库的查询类似),还提供了空间查询。在介绍查询的时候,让我们先了解下面的对象。
Table对象
Table是不含有空间信息的一张二维表,它主要实现了ITable接口。在这张二维表中,每一行称之为Row
(IRow),ITable接口 定义了对这张二维表行的插入,更新,查询,以及删除等操作。
独立表(standalone table):就是一个单独的不含空间信息的表也就是只能在ArcMap中Table of Contents
的Source选项卡中看到的。
对象类
对象类是在Table的基础上扩展起来的,因此在外观上来看,它也是一个二维表,也是用来存储非空间数
据,它与Table的区别在于它的一行是一个Object(对象),尽管在形式上也是一条记录,但它是具有属
性和行为的一个对象,而非简单的记录了。
FeatureClass对象
要素类是存储在工作空间中的一种数据组织方式,要素类是在对象类的基础上的进一步扩展,包含了现实
世界中的空间实体。要素类由要素组成(Feature),要素对应要素类中的一行,要素相当于空间对象
(Geometry )+相应的属性信息。IFeatureClass定义了对要素的查询,更新,删除等操作。关于ROW,Table,
对象类,Feature,要素类,我们可以从下面的图上得到启示:
FeatureClass对象实现了IFeatureClass接口,IFeatureClass对查询定义了两个方法
IFeatureClass.Search和IFeatureClass.Select。
Search方法需要传入两个参数,一个是过滤器;另外一个是布尔值,用于说明放回的要素游标是否被回收,
一般的,如果仅仅是为了读取数据,那么这个参数应该是true,如果要对选择出来的要素更新,那么这个
参数应该设置为false。那么这两个参数到底有什么意义,我们从下面的代码中看一下。
false 和true参数的差别
我们定义一个Search函数,通过传false和true来对这两个参数进行说明,代码如下:
void Search(IFeatureClass _pFeatureClass,bool _Bool)
{
IFeature pFt1, pFt2;
IFeatureCursor pFtCursor;
if (_Bool == false)
{
pFtCursor = _pFeatureClass.Search(null, _Bool);
pFt1 = pFtCursor.NextFeature();
while (pFt1 != null)
{
pFt2 = pFtCursor.NextFeature();
if (pFt1 == pFt2)
{
MessageBox.Show("Recycling 参数是 false");
}
pFt1 = pFtCursor.NextFeature();
}
}
else
{
pFtCursor = _pFeatureClass.Search(null, _Bool);
pFt1 = pFtCursor.NextFeature();
while (pFt1 != null)
{
pFt2 = pFtCursor.NextFeature();
if (pFt1 == pFt2)
{
MessageBox.Show("Recycling 参数是true");
}
pFt1 = pFtCursor.NextFeature();
}
}
}
Search和 Select方法的比较
Search返回游标,Select返回选择集