选择集的秘密
Posted by 蒋波涛 29 May,2005 Views 1093 (4)Comment
map对象在ARCMAP里面是一个核心的组成部分,我们需要认识到MAP对象具有两面性,一方面是数据的容器,一方面是数据的显示器,做容器的时候,实现的是imap接口;做显示器的时候,实行的是iactiveview接口。要素选择集不是特殊的对象,仅仅是要素的特殊状态。在ARCMAP里面能够显示出来的图形分为两部分,一是放在数据库里面的要素feature,一个是放在MXD文件里面的元素element。而在要素和元素中,有一种特殊的“状态”——选择集。当我们在map中选择了一些要素后,这些要素的边界会显亮,这些要素就处于选择集selection的状态了。
要素Selection是一个ifeaturelayer对象的要素选择集,它是与某个图层联系起来的,也是包含在某个图层中的,实际上,featureselection并不是特殊的对象,它也是一个要素,但是这个要素仅仅是被标识为“被选择的状态”而没有放到一个特殊的地方。
尽管要素选择集是与某个图层相关的,虽然map对象并没有直接持有这些选择集,但是它毕竟是这些选择集的二级容器,map提供了一个方法featureselection属性,这个属性将返回map中所有含有的selection;提供了selectByShape,这个方法可以选择map内所有图层的要素选择集;提供了selectFeature,这个方法可以把选择的要素放入某个图层的选择集中去。
要素选择集里面放的都是要素对象,看下面的代码:
Dim pEnumFeat as iEnumFeature
pEnumFeat=pMap.featureselection
Arcmap里面的selections有两种,feature selections和element selections,这两种都实现了iselectionset接口。在返回值的时候,前者都使用ienumfeature,后者常常使用ienumElement。当使用imap::featureselection获取的selection,我们还可以在这个里面做二次查询,这种做法是经常的。
如果是通过IActiveView::Selection获得selection,那么获得的Selection不是feature selection就是element selection,每次只能是一种,它取决于iactiveview的类型。
IenumFeature中包含的selection是来自map对象所有的featurelayer的。尽管每个featurelayer都有iselectionset和ienumfeature接口,但是它们只能查询本身的selection。由于ienumfeature是负责全部的图层,因此不能去查看某个feature属于哪个featurelayer。
我们下面来总结一下:
Imap::featureselection 获取map内全部的selection,返回为ienumfeature
Imap::selectByShape 通过一个形状生成map内所有图层中符合范围的要素选择集
Imap:: SelectFeature (Layer, Feature ) 将选择的pfeat放如layer作为layer的选择集
IfeatureSelection 是一个featurelayer的接口,管理具体某个图层的选择集
因此,当我们把一个要素设置为选择集后并且显示出来,其实是使用了MAP对象的两种身份,当我们清楚选择集的时候,也必须对这两部分做操作,一个是imap::clearselection,一个是iactiveview.refresh.