//(注意:只有高级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中有一个子类型\
spatialFilter.WhereClause=\
//将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(\
//保存总面积的变量 double searchedArea=0;
//遍历所有要素计算总面积 while(feature!=null) {
searchedArea=searcheArea+(double)feature.get_Value(areaIndex); feature=featureCursor.NextFeature(); }
Console.WriteLine(\ System.Runtime.InteropServices.Marshal.ReleaseComObject(featureCursor); }
15.10、IFeatureClass.Select 方法
[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 [C#]
public void IFeatureClass_Select_Example(IFeatureClass featureClass) {
//创建查询过滤器并附予一个where从句
IQueryFilter queryFilter=new QueryFilterClass(); queryFilter.WhereClause=\ //使用query过滤器选择要素
//调用Select时不需要selectionContainer参数。在C#和VB.Net中赋给其Null值
ISelectionSet
selectionSet=featureClass.Select(queryFilter,esriSelectionType.esriSelectionTypeIDSet,esriSelectionOption.esriSelectionOptionNormal,null); //计算选择的要素数目
Console.WriteLine(\{2}\}
16. IFeatureCursor接口(esriGeoDatabase)
IFeatureCursor接口用于遍历从FeatureLayer等搜索出来的结果,可用来访问要素类中的一系列要素。虽然它并没有继承ICursor接口,但它的操作方法同ICursor一样,这样在处理features时,不像rows那样,可以不使用QI。 成员
DetleteFeature, Fields, FindField, Flush, InsertFeature, NextFeature, UpdateFeature.
16.1、IFeatureCursor.NextFeature方法
[C#]
public IFeature NextFeature();
IFeatureCursor.NextFeature方法,将游标向前跳到下一个位置,并且返回该位置的Feature. 当你使用cursor获取非geodatabase的要素时,返回的空间参考为指定的类型。
不能确保要素的几何图形仍然在该空间参考中。例如,若使用非recycling cursor,你获得的要素可以与其他人共享,任何人在任何时间都能改变其空间参考。如果想恢复或获得指定的空间参考,开发者要测试要素的空间参考或几何图形。
16.2、IFeatureCursor.UpdateFeature方法
[C#]
public void UpdateFeature(IFeature Object);
IFeatureCursor.UpdateFeature(Feature) 方法,对当前游标位置的Feature进行更新) [C#]
public void IFeatureCursor_UpdaterFeature_Example(IFeatureClass featureClass) {
IQeryFilter queryFilter=new QueryFilterClass(); queryFilter.WhereClause=\
IFeatureCursor updateCursor=featureClass.Update(queryFilter,false); int fieldIndex=featureClass.FindField(\ IFeature feature=updateCursor.NextFeature(); While(feature!=null) { m++;
feature.set_Value(fieldIndex,\ updateCursor.UpdateFeature(feature); feature=updateCursor.NextFeature(); }
System.Runtime.InteropServices.Marshal.ReleaseComObject(updateCursor);
16.3、IFeatureCursor.InsertFeature方法
用参数传进来的属性值插入一个新的要素到数据库中,返回该插入新的Feature的ID值,其中参数类型为IFeatureBuffer。
17. ISpatialFilter接口(esriGeoDatabase)
3sNews.Net——最具影响力的中国地理空间信息门户网站 M\
用于返回和修改filter使用的空间关系(空间拓扑查找的功能,即:在图形上通过某一范围查找空间制定要素)。是一个包含空间和属性限制的QueryFilter。因此可以使用SpatialFilter来限制从要素类中获得的要素集。ISpatialFilter继承IQueryFilter接口,因此可以指定一个whereclause、返回的colunms或者指定输出图形的空间参考。使用spatial filter执行空间查询,常将其作为IFeatureClass::Search、IFeatureClass::Select或feature layers上相似方法的参数。
17.1、ISpatialFilter.Geometry属性
Geometry是源图形,根据与其的关系执行空间选择。
17.2、ISpatialFilter. GeometryField属性
GeometryField是图形字段名,将其中的图形与源图形比较。
17.3、ISpatialFilter. SpatialRel属性
SpatialRel属性将一个esriSpatialRelEnum传入来指定空间关系。
ISpatialFilter Example [C#]
NOTE:要用到ISpatialFilter的三个方法Geometry,GeometryField和SpatialRel。 public void ISpatialFilter_(IFeatureClass featureClass) {
//Create a point to use for the search;
ESRI.ArcGIS.Geometry.IPoint point=new ESRI.ArcGIS.Geometry.PointClass(); point.PutCoords(-117.946,35.823);
//Getting a reference;
ISpatialFilter spatialFilter=new SpatialFilterClass();
//Setting the Geometry,GeometryField and SpatialRel parameters;
spatialFilter.Geometry=point;
spatialFilter.GeometryField=featureClass.ShapeFieldName; spatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelIntersects; //Execute the spatiafilter;
IFeatureCursor featureCursor=featureClass.Search(spatialFilter,false); }