IFeatureClass.GetFeatures Method
[Visual Basic.NET] Public Function GetFeatures(ByVal fids As Object,ByVal Recycling As Boolean) As IFeatureCursor
[C#] public IFeatureCursor GetFeatures(object fids,bool Recycling);
GetFeatures返回包含要素类所有要素OID的IFeatureCursor。这个方法可以用来遍历已知OID的要素集。
调用IFeatureClass的GetFeatures方法和调用ITable的GetRows方法效果相同,只是返回IFeatureCursor接口。
[C#]
//e.g,nameOfField=”Symbol”
public void IFeatureClass_GetFeatures(IFeatureClass featureClass,string nameOfField)
{
//get the index of the field we are interested in
int fieldIndexValue=featureClass.FindField(nameOfField);
System.Collections.Generic.List<int> constructoidList=new System.Collections.Generic.List<int>();
constructoidList.Add(1);
constructoidList.Add(2);
constructoidList.Add(3);
constructoidList.Add(4);
constructoidList.Add(10);
int[] oidList=constructoidList.ToArray();
IFeatureCursor featureCursor=featureClass.GetFeatures(oidList,false);
IFeature feature=featureCursor.NextFeature();
//loop through the returned features and get the value for the field
while(feature!=null)
{
//do something with each feature(ie update geometry or attribute)
Console.WriteLine("The {0} field contains a value of {1}",nameOfField,feature.get_Value(fieldIndexValue));
feature=featureCursor.NextFeature();
}
}
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接口,使用它可以遍历返回的关系类。