11

11

再谈要素选择集

在我们查询数据的过程中,一直遇到选择集的问题。我们知道,要得到符合某种准则的数据,一般而言有两种不同的手段,一是使用select方法,它返回的是一个指向数据的Cursor对象;另一种是构造选择集(SelectionSet),然后在选择集中再得到Cursor,后者虽然走了弯路,但是在显示的效果上却比前者好,即得到的要素选择集在Map上会呈高亮显示。
我们通过IMap::SelectByShape方法得到过选择集,使用要素图层的IFeatureSelection接口也可以得到选择集,但是这些都仅仅是在“表面”探讨,那么,要素选择集在地理数据库中到底表现为什么东西呢?
SelectionSet对象是程序获得的被选择的行对象集合,这些行只能来自单个表或要素类,但是一个表或者要素类可以产生多个选择集对象。选择集有两种形式,它要么是基于与被选择的行对象的OID集合,要么就是一个实实在在的行对象本身,在后面这种情况下,选择集会提供方法让程序员与在选择集中的行对象进行交互。至于使用何种方式来得到选择集,我们可以使用SelectionType属性来设置。
选择集的类型如果是esriSelectionIDSet,那代表选择集使用的是一个OID集合,这些OID值可能保存在一个物理表中,也可能保存在内存中,这取决于数据源的类型;当它为esriSelectionTypeSnapShot时,它表明选择集使用的是保存在内存中的实际的行对象;如果是esriSelectionTypeHybird,那情况就比较灵活,当选择数量少的时候选择集使用在内存中的行对象,当数量多时则使用OID集合。
使用标识集合(如OID集合)可以表示数目巨大的选择集,它也是程序最常使用的一种方式,当数据源每一次被选择的对象还需要进行查询的时候,这种方式可以保证选择集是动态的,而且在数据源改变的时候自动变化。Snapshot类型选择集数度最快,而且一但选择集构造完成后就不再要求与数据源发生查询,但是它对少量数据是有效的,如果选择的数据多,占用内存大时,它的优势就发挥不出来了;Hybird类型选择集包含了前两者的有点,它可以依据选择数据的大小而自动选用不同的选择方式,但是这个选择数据的大小并不能由程序来控制。
下面是一个在要素类中构造要素选择集的例子:
Dim pSelectionSet As ISelectionSet
pSelectionSet = pFeatureClass.Select(pQueryFilter, esriSelectionType.esriSelectionTypeHybrid, esriSelectionOption.esriSelectionOptionNormal, Nothing)
上面代码段中的Select方法的最后一个参数被设置为Nothing,这是它的缺省设置,这个参数被用于传递一个存储ID集合的工作空间,而这个ID集合结构如同一个二维表,这个表是临时的,且保存在同一个数据库中。如果程序员是在基于文件的工作空间中构造的选择集,则这个表被保存在内存中。无论是哪一种情况,这个参数设置为Nothing都是合适的。

SelectionSet对象主要实现的是ISelectionSet接口,它用于管理和查询选择集。
ISelectionSet::Search方法通常用于在选择集内进行再选择,它返回的是一个Cursor对象,当然它也需要一个过滤器对象才行。当程序员使用QueryFilter对象时,选择集的类型一律是使用的标识集合,即使它开始是Snapshot类型的选择集。ISelectionSet::Select方法则用于在目前的选择集中构造一个新的选择集对象,它也是使用一个过滤器对象来进行设置的。
Add、AddList和ReomveList方法可以用于选择集中添加和移除对象,这些方法都是通过OID属性来完成的。ISelectionSet::Combine方法则可以用于绑定两个选择集,这两个选择集必须是来自同一个目标表或者要素类。
SelectionSet对象也支持ISelectionSet2接口,它提供了方法用于更新或删除选择集中的对象,更新和删除都使用到了Curor对象。关于更新、删除等操作使用的Cursor对象,当然是其类型是不同的,关于这些内容,可以参看Cursor对象一节。
下面的代码段是使用IDataStatistics对象获得某个数值字段的平均值:
Dim pFeatureSelection As IFeatureSelection
pFeatureSelection = pFeatureLayer

Dim pSelectionSet As ISelectionSet
pSelectionSet = pFeatureSelection.SelectionSet
‘ 得到要素类中全部的要素
Dim pFeatureCursor As IFeatureCursor
pSelectionSet.Search( Nothing, True, pFeatureCursor)
‘ 设置IDataStatistics对象的属性
Dim pDataStats As IDataStatistics
pDataStats = New DataStatistics
pDataStats.Cursor = pFeatureCursor
pDataStats.Field = "POP1990"

MessageBox.show(pDataStats.Statistics.Mean)

为了选择要素,我们不一定非要使用选择集,实际上使用IFeatureSelection::SelectFeatures方法更为简单,它可以将我们已经得到的要素添加到一个选择集中去。这个方法非常在一定情况下是非常有用的。

[转自http://www.hmgis.cn/post/56.html]


文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: GIS
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.