IFeatureClass 用于访问控制要素类行为和属性的成员 |
IFeatureClass.Search Method 返回搜索的对象指针。 [Visual Basic.NET] Public Function Search(ByVal filter As IQueryFilter, ByVal Recycling As Boolean) As IFeatureCursor [C#] public IFeatureCursor Search(IQueryFilter filter, bool Recycling); Search返回满足条件的IFeatureCursor。如果IQueryFilter没有给定值,feature cursor返回要素类的所有要素。 Recycling参数控制row的allocation行为。每次调用简单要素对象时,Recycling cursors可以rehydrate该对象,并可以最优化只读访问,例如在绘图时。多次调用cursor的NextFeature,维持recycling cursor返回的引用并不合法。不能修改要素对象返回的recycling cursor。使用Non-recycling cursor每次返回一个单独的要素。non-recycling返回的要素可以修改、存储各种行为。Geodatabase保证在编辑阶段non-recycling要素的唯一语义。如果搜索的要素已经被应用程序引用,将返回一个要素的地址。 Search方法返回的non-recycling要素指针并不用来更新cursor中的要素。Update方法返回的feature cursor可以用来更新要素。 [C#] //下面的例子使用属性查询和空间查询获得要素的子集。 //在要素类中,遍历所有要素,并计算它们的的总面积。 public void IFeatureClass_Search(IFeatureClass featureClass) { //在这个函数中将使用空间过滤器,并结合属性查询进行搜索。 //在搜索中不必执行两种过滤类型,可以单独使用每一种。 //创建一个envelope在空间上限制搜索。 //(注意:只有高级geometries、envelopes和geometrybags可以使用) ESRI.ArcGIS.Geometry.IEnvelope envelope=new ESRI.ArcGIS.Geometry.EnvelopeClass(); envelope.PutCoords(508786,681196,513033,684341); //创建一个空间查询 ISpatialFilter spatialFilter=new SpatialFilterClass(); //指定一个查询的的几何图形 spatialFilter.Geometry=(ESRI.ArcGIS.Geometry.IGeometry)envelope; //确定在要素类上查询的几何字段 string shpFld=featureClass.ShapeFieldName; spatialFilter.GeometryFiled=shpFld; //指定要使用的空间操作 spatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelIntersects; //创建where表达式,这里只要要素 //在envelope中有一个子类型"COM" spatialFilter.WhereClause="subtype='COM'"; //将spatial filter赋给IQueryFilter接口 IQueryFilter queryFilter=new QueryFilterClass(); queryFilter=(IQueryFilter)spatialFilter; //在要素类上进行搜索,使用cursor保存结果 IFeatureCursor featureCursor=featureClass.Search(queryFilter,false); //第一个返回的要素 IFeature feature=featureCursor.NextFeature(); //获得“Area”字段 IFields fields=featCursor.Fields; int areaIndex=fields.FindField("Area"); //保存总面积的变量 double searchedArea=0; //遍历所有要素计算总面积 while(feature!=null) { searchedArea=searcheArea+(double)feature.get_Value(areaIndex); feature=featureCursor.NextFeature(); } Console.WriteLine("The total area of searched features is {0}",searchedArea); System.Runtime.InteropServices.Marshal.ReleaseComObject(featureCursor); } IFeatureClass.Select Method 返回包含对象IDs的选择。 [Visual Basic.NET] Public Function Select(ByVal QueryFilter As IQueryFilter,ByVal selType As esriSelectionType, ByVal selOption As esriSelectonOption, ByVal selectionContainer As IWorkspace) As ISelectionSet [C#] public ISelectionSet Select(IQueryFilter QueryFilter, esriSelectionType selType, esriSelectionOption selOption, IWorkspace selectionContainer); Select返回一个满足条件的ISelectionSet。如果IQueryFilter中无值,将选择要素类的所有要素。调用IFeatureClass的Select方法同调用ITable中的相应方法效果相同。调用Select时,selectionContainer不需要参数。实参应为Null(C#,VB.Net)或者Nothing(VB6)。(注意:提供workspace类型的selectionContainer只读参数将会失败,因为Select会将选择的结果写入workspace。 IFeatureClass Select Example [Visual Basic 6.0] 下面的例子使用属性查询选择要素类的子集。 Dim pFeatcls As IFeatureClass Dim pFeatLayer As IFeatureLayer Dim pDoc As IMxDocumentDim pMap As IMap Set pDoc=ThisDocument Set pMap=pDoc.Maps.Item(0) Set pFeatLayer=pMap.Layer(0) Set pFeatcls=pFeatLayer.FeatureClass '创建一个query过滤器,并赋予一个where从句。 Dim pQFilt As IQueryFilter Set pQFilt=New QueryFilter pQFilt.WhereClause="Shape_Area>77000" '使用query过滤器选择要素 Dim pSelectionSet As ISelectionSet '当调用Select时,不需要selectionContainer参数,在VB6中应赋nothing Set pSelectionSet=pFeatcls.Select(pQFilt,esriSelectionTypeIDSet,esriSelectionOptionNormal,Nothing) '计算选中的数目 MsgBox pSelectionSet.Count [C#] public void IFeatureClass_Select_Example(IFeatureClass featureClass) { //创建查询过滤器并附予一个where从句 IQueryFilter queryFilter=new QueryFilterClass(); queryFilter.WhereClause="Shape_Area>77000"; //使用query过滤器选择要素 //调用Select时不需要selectionContainer参数。在C#和VB.Net中赋给其Null值 ISelectionSet selectionSet=featureClass.Select(queryFilter,esriSelectionType.esriSelectionTypeIDSet,esriSelectionOption.esriSelectionOptionNormal,null); //计算选择的要素数目 Console.WriteLine("{0}features where selected from{1} with where clause {2}",selectionSet.Count,featureClass.AliasName,queryFilter.WhereClause); } IObjectClass.RelationshipClasses Property 这个对象类参与的关系类。 [Visual Basic.NET] Public Function get_RelationshipClasses(ByVal Role As esriRelRole) As IEnumRelationshipClass [C#] public IEnumRelationshipClass get_RelationshipClasses(esriRelRole Role); 返回对象类参与的关系类的枚举。 geodatabase的对象类可能参与多个关系类。esriRelRole定义了对象类的角色(origin、destination或两者都有),RelationshipClasses属性根据其角色获得关系类的列表。这个属性返回一个IEnumRelationshipClass接口,使用它可以遍历返回的关系类。 |