樱木 原文 AE中地图查询方式
地图查询主要有两种查询:空间查询和属性查询
所用到知识点:
1 Cursor(游标)对象
本质上是一个指向数据的指针,本身不包含数据内容,提供一个连接到ROW对象或者要素对象(Feature)的桥梁而已。
游标有三种类型,即查询游标、插入游标和更新游标。每一种游标都是通过与之相适应的方法来获得的,如Search、Insert和Update方法。更新和插入游标都需要使用一个过滤器(Filter)对象,因为它们首先必须获得需要进行操作的要素。
FeatureCursor是Cursor的一个子类,指向一个或多个要素,它实现了IFeatureCursor接口,ArcGIS Engine开发所对矢量图层实现查询功能都是实行IFeatureCursor;
其实凡是Search方法,如ILayer::Search、ITable::Search等都可以返回一个游标对象。这个Cursor指向了那些符合选择条件的要素
IFeatureCursor接口重要成员:
NextFeature(方法,将游标向前跳到下一个位置,并且返回该位置的Feature)
UpdateFeature(Feature)
(方法,对当前游标位置的Feature进行更新)
InsertFeature(buffer) (方法,用参数传进来的属性值插入一个新的要素到数据库中,返回该插入新的Feature的ID值,其中参数类型为IFeatureBuffer)
2 QueryFilter和SpatialFilter对象
ArcGIS Engine提供了QueryFilter和SpatialFilter两个过滤器对象来配合完成查询条件的设置,从而查询到想要的数据。 QueryFilter过滤器主要用于对属性数据查询条件的设置,它主要实现IQueryFilter接口从而实现属性查询功能。
IQueryFilter接口成员:
WhereClause(读写属性,为过滤器设置条件语句)
注意!各种不同的数据,设置条件查询语句的语法是不相同的,如一个shp文件在设置字段的时候要加“””双引号,而在SDE数据连接中,则什么都不加;在gdb文件的语句中,符号是“*”,而在SDE或者shp文件查询中则是“%”
SubFields(读写,为过滤器设置提供赛选的字段,用逗号来分隔每一个逗号,如果不设置该属性,则当做所有字段均为查找字段)
SpatialFilter过滤器主要用于空间范围查询条件的设置,它主要实现ISpatialFilter(继承 IQueryFilter接口)接口从而实现空间查询功能。
其中SpatialRel属性是一个确定查询几何对象与目标要素几何对象关系的枚举值。
3 要素选择集(FeatureSelection)对象
获得符合某种条件的数据,一般有两种不同的手段:
一种使用Search方法,它返回一个指向数据的查询Cursor对象:
IFeatureCursor pFeatCursor =
pFeatureLayer.Search(pFilter,false);
IFeature
pFeature=pFeatCursor.NextFeature();
另一种是使用SelectFeatures方法构造一个选择集(SelectionSet),然后在选择集中得到Cursor,后者麻烦了点,但是得到的要素选择集在Map上会高亮度显示。
IFeatureSelection pFSelection=pFeatureLayer as
IFeatureSelection;
pFSelection.SelectFeatures(pSpatialFilter,esriSelectionResultEnum.esriSelectionResultNew,false);
ISelectionSet
pSelectionset=pFSelection.SelectionSet;
ICursor pCursor;
pSelectionset.Search(null,true,out
pCursor);
IFeatureCursor pFeatCursor=pCursor as IFeatureCursor;
IFeature pFeature=pFeatCursor.NextFeature();
IFeatureSelection接口重要成员:
SelectFeatures (Filter, Method, justOne ) (方法,根据指定的标准过滤器filter和方法,选择要素,第一个参数为QueryFilter类型的变量,第二个参数为esriSelectionResultEnum类型的变量,第三个参数为布尔型变量,通常为false)
当然还有设置颜色的SelectionColor属性等;
4 SelectionSet对象
支持ISelectionSet接口,用于管理和查询一个选择集。
Search(IQueryFilter,bool,ref ICursor)用于在选择集内进行再选择,