一共分两部分:
http://www.51csharp.net/a/GIS/2009/1104/143.html
1、Feature的概念
Feature是二次开发中最常用的对象,feature是featureclass中一个记录,从object中派生出来的,因此也具有属性和方法,object又是从row中派生的,所以featureclass其实一张表,featured就是表中的一条记录,feature可以保存空间数据对象,要素中的几何型体对象定义了要素的类型,它可以保存的几何型体对象有点、点集、多边形、多义线。这些都是些简单的要素对象,在有些情况下要素还可以参与拓扑、网络运算。
2、Feature相关接口
Feature有派生出很多类,如:networkfeature、rastercatalogfeature、coverageannotationfeature、annotationfeature imensionfeature。feature的主要接口是Ifeature,其中的Extent用来返回要素对象的包络线,显示要素的空间范围;Featuretype返回要素的类型;Shape返回要素的几何型体对象;ShapeCopy得到几何型体对象的一个拷贝。
IfeatureBuffer中的Shape得到缓冲要素的几何型体对象。
IfeatureEdit中MoveSet、RotateSet、DeleteSet分别是移动、旋转、删除一个或者是多个要素组成的要素集上。Split主要是用来分割几何型体的,通过点分割线,通过多义线分割多边形,分割后旧的被删除,新的要素自动产生。因为每个要素都有对应的属性,要素改变了,其对应的属性也相应的要改变。
Splitattributes就是用来分割要素属性字段中的值。该方法可以在Split方法执行后自动执行。
IfeatureDraw中的InvalidArea属性得到一个绘画的区域。Draw在显示设备上绘制要素。
IfeatureChanges中OriginalShape得到要素的最初几何类型,ShapeChanged指示要素的几何类型是否改变。
IfeatureSimplify中的SimplifyGeometry按照该要素的拓扑规则进行拓扑一致。
3、Feature的编辑操作
对Feature的编辑分为以下几个部分:
1.新建,
2.修改,
3.删除。
涉及到的接口有以下几个:IWorkspaceEdit、IFeatureClass、IFeatureCursor、IFeature。其中IWorkspaceEdit用于启动编辑以开始编辑操作,结束编辑操作以结束编辑。IFeatureClass 是数据的所在地,IFeatureCursor 是一个游标提供访问数据的接口和修改数据的接口,IFeature 是对象的代表我们要编辑的目标。 编辑的过程如下:
1.添加一个Feature
//假设space是一个IWorkspaceEdit
//参数表示是否需要使用Undo/Redo功能,该功能的粒度是EditOperator.
spaceEdit.StartEditing(false);
spaceEdit.StartEditOperator();
//添加一个Feature
IFeature newFea=feaClass.createFeature();
//为Feature 添加属性设置图形
newFea.Store();//保存属性和图形
spaceEdit.StopEditOperator();//结束编辑操作
//结束编辑过程
//参数表示是否保存编辑
spaceEdit.StopEditing(true);
2.添加多个Feature
添加多个Feature也可以向上面一样使用多次就可以了, 当然也可以使用IFeatureCursor来添加数据。
3.修改Feature
添加Feature中的修改属性和图形部分,每次修改后一定要调用Store方法这样变化才可以保存下来。
4.删除
IFeatureCuror的DeleteFeature方法可以用来删除当前的Feature 。
注意事项
1.不能设置Feature的OID
2.不能设置Feature的Area
3.不能设置Feature的Lenght
第二部分
http://hi.baidu.com/am_lijunli/blog/item/8cec9e2b3cc5629c023bf6df.html
//IWorkspaceEdit Example
//e.g., nameOfFeatureClass = "States"
//on ArcSDE use ISqlSyntax::QualifyTableName for fully qualified table names.
public void IWorkspaceEdit_Example(IWorkspace workspace, string nameOfFeatureClass)
{
IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
IFeatureClass featureClass =featureWorkspace.OpenFeatureClass(nameOfFeatureClass);
IWorkspaceEdit workspaceEdit = (IWorkspaceEdit)workspace;
//start editing with undo redo functionality
workspaceEdit.StartEditing(true);
workspaceEdit.StartEditOperation();
IFeature feature = featureClass.GetFeature(1);
feature.Delete();
workspaceEdit.StopEditOperation();
Console.WriteLine("Would you like to undo your operation? Y or N");
string response = Console.ReadLine();
if(response.ToUpper() == "Y")
{
workspaceEdit.UndoEditOperation();
}
bool hasEdits = false;
workspaceEdit.HasEdits(ref hasEdits);
if (hasEdits)
{
Console.WriteLine("Would you like to save your edits? Y or N");
response = Console.ReadLine();
if (response.ToUpper() == "Y")
{
workspaceEdit.StopEditing(true);
}
else
{
workspaceEdit.StopEditing(false);
}
}
}
第三部分
http://bbs.esrichina-bj.cn/esri/archiver/tid-21681.html
适用于所有字段和属性:
Feature.OID应该是可以的
如果不行就这样:
Dim pFields As IFields=pFeatureClass.Fields
Dim fidIndex As Integer=pFields.FindField("FID")
pFeature.Value(fidIndex)就是对应Feature的FID