arcengine 矢量要素编辑(转载)

it2024-10-27  16

一、添加点我们可以有多种方法添加点,但基本的思路一样,只是有少量的接口有变化。下边是通过FeatrueClass的CreateFeature()函数添加地物。 public void AddPointByStore() { //得到要添加地物的图层 IFeatureLayer l = MapCtr.Map.get_Layer(0) as IFeatureLayer; //定义一个地物类,把要编辑的图层转化为定义的地物类 IFeatureClass fc = l.FeatureClass ; //先定义一个编辑的工作空间,然后把转化为数据集,最后转化为编辑工作空间, IWorkspaceEdit w = (fc as IDataset).Workspace as IWorkspaceEdit; IFeature f ; IPoint p;

//开始事务操作 w.StartEditing (false); //开始编辑 w.StartEditOperation() ;

for (int i = 0 ; i< 100 ; i++ ) { //创建一个地物 f= fc.CreateFeature(); p = new PointClass(); //设置点的坐标 p.PutCoords (i,i); //确定图形类型 f.Shape = p; //保存地物 f.Store();

}

//结束编辑 w.StopEditOperation(); //结束事务操作 w.StopEditing(true); }

上边的代码能添加点地物,但不能作为最终的代码使用,细心的人会看到。这段代码只是把第一层加进来,然后在第一层上边添加点地物,如果第一层不是点层,该怎么办,那就要判断了。怎么判断我们以后再说。通过上边的代码,我们已经清楚地了解到,编辑地物的基本框架,这也是我们所说的事务,如果想操作能返回和重做,就必须把代码写在IWorkspaceEdit的StartEditing()和StopEditing()函数之间,把相关的操作写在IWorkspaceEdit的StartEditOperation()和StopEditOperation()之间。并且操作是利用IWorkspaceEdit接口完成的,所以要仔细理会IWorkspaceEdit接口的用处,如何工作空间都可以转化为IWorkspaceEdit的对象,当转化为IWorkspaceEdit定义的对象后,我们定义一个IFeature的对象,然后利用IFeatureClass的CreateFeature()函数创建一个地物,并赋值给定义的IFeature对象。接着设置IFeature对象的一些属性,如:坐标值,坐标系,地物类型等,最后是调用IFeature对象的Store()保存添加的地物。

上边的方法可以添加点地物,接着看看下边的代码。看有什么不同:

public void AddPointByWrite() { IFeatureLayer l = MapCtr.Map.get_Layer(0) as IFeatureLayer; IFeatureClass fc = l.FeatureClass ; IFeatureClassWrite fr = fc as IFeatureClassWrite ; IWorkspaceEdit w = (fc as IDataset).Workspace as IWorkspaceEdit;IFeature f ; IPoint p;

w.StartEditing (true); w.StartEditOperation() ;

for (int i = 0 ; i< 100 ; i++ ) { f= fc.CreateFeature(); p = new PointClass(); p.PutCoords (i,i); f.Shape = p; fr.WriteFeature (f); }

w.StopEditOperation(); w.StopEditing(true);

}

代码中用红色标记的两行就是不同的代码,其实他就是保存方式的不同而已。在这利用了IFeatureClassWrite 接口来保存数据。再看看下边的代码: public void AddPointByBuffer() { IFeatureLayer l = MapCtr.Map.get_Layer(0) as IFeatureLayer; IFeatureClass fc = l.FeatureClass ; IWorkspaceEdit w = (fc as IDataset).Workspace as IWorkspaceEdit;

w.StartEditing (true); w.StartEditOperation() ;

IPoint p; IFeatureBuffer f; IFeatureCursor cur = fc.Insert(true);

for (int i = 0 ; i< 100 ; i++ ) { f= fc.CreateFeatureBuffer(); p = new PointClass(); p.PutCoords (i,i); f.Shape = p; cur.InsertFeature (f); }

w.StopEditOperation(); w.StopEditing(true); } 其实不同的地方就两句代码,红色表示的。在这没有再定义地物接口了(IFeature),而是使用IFeatureBuffer 接口,保存的时候是使用InsertFeature()保存,这对大数据量处理的非常有好处。他是先把要添加的保存到缓冲区里。最后一次性保存。

二、添加线添加线的方法跟添加点一样,不同的只是地物类型不一样而已,我把代码贴出来,大家跟添加点的方式进行对比。这样便于记忆。也有利于理解。

public void AddLineByWrite() { IFeatureLayer l = MapCtr.Map.get_Layer(0) as IFeatureLayer; IFeatureClass fc = l.FeatureClass ; IFeatureClassWrite fr = fc as IFeatureClassWrite ;

IWorkspaceEdit w = (fc as IDataset).Workspace as IWorkspaceEdit; IFeature f ;

//可选参数的设置 object Missing = Type.Missing; IPoint p=new PointClass();

w.StartEditing (true); w.StartEditOperation() ;

for (int i = 0 ; i< 100 ; i++ ) { f = fc.CreateFeature(); //定义一个多义线对象 IPolyline PlyLine=new PolylineClass(); //定义一个点的集合 IPointCollection ptclo = PlyLine as IPointCollection; //定义一系列要添加到多义线上的点对象,并赋初始值 for(int j=0;j<4;j++) { p.PutCoords(j,j); ptclo.AddPoint(p,ref Missing,ref Missing); } f.Shape = PlyLine; fr.WriteFeature (f); }

w.StopEditOperation(); w.StopEditing(true);

}

至于添加线的其他两种方法,通过修改添加点的代码,就可以得到。可以自己想想然后测试,这样便于记忆和理解

 

转载自:http://hi.baidu.com/%C4%FE%CE%A8%CA%C7%C4%FE%CE%A8/blog/item/4ca9adec669bd0dbb3fb953c.html

转载于:https://www.cnblogs.com/wuhenke/archive/2012/05/25/2518306.html

相关资源:ArcEngine开发集锦
最新回复(0)