ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新

ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新

来自:http://blog.csdn.net/freewaywalker/article/details/23703863

分类: ArcNotes2014-04-14 20:56 1781人阅读 评论(0) 收藏 举报

1. 要素的添加

ArcGIS Engine中,主要有两个方法用于要素的添加:

批量插入feature,如果用feature.store()方法,在图层中一个个地插入要素,较之同时使用insert cursor与feature buffer方法,会慢很多。

因为后者触发的事件和复杂行为比较少(比如说没有引发因拓扑关系产生的行为)。

2. 要素的删除

删除feature,一个个删除就用IFeature.Delete方法即可,此处不再赘述,只写一种批量删除的方法,用于ITable是针对数据库进行操作的,所以速度很快。

The best approach to take when deleting features depends on two factors, how many features are being deleted and whether the data source is a local geodatabase or an ArcSDE geodatabase.

In the simplest case, a single feature that has already been retrieved can be deleted by callingIFeature.Delete. If bulk features are being deleted and the geodatabase is an ArcSDE geodatabase, the most efficient approach requires the use of a search cursor and the IFeature.Delete method.

On the other hand, if the geodatabase is a local geodatabase (a file or personal geodatabase), the most efficient method for bulk deletion is theITable.DeleteSearchedRows method.

示例:

[csharp] view plaincopy

  1. ///<summary>
  2. ///删除某featurelayer中所有feature
  3. ///</summary>
  4. ///<param name="pLayer">操作的涂层</param>
  5. ///<remarks>该方法可以给一个queryfilter,进行删除符合条件的features</remarks>
  6. private void DeleteAllFeatures(IFeatureLayer pLayer, <code></code>IQueryFilter queryFilter)
  7. {
  8. ITable pTable = pLayer.FeatureClass as ITable;
  9. pTable.DeleteSearchedRows(queryFilter);
  10. }

3. 属性的读取

在获取属性表的值时有多种方法:

方法一:

[csharp] view plaincopy

  1. ITable pTable = pLayer.FeatureClass as ITable;
  2. clsFldValue = pTable.GetRow(i).get_Value(clsFldIndex);

方法二:

[csharp] view plaincopy

  1. IFeatureCursor FCursor = pLayer.FeatureClass.Search(new QueryFilterClass(), false);
  2. IFeature feature = FCursor.NextFeature();
  3. if (feature == null) return null;
  4. clsFldValue = feature.get_Value(clsFldIndex);
  5. feature = FCursor.NextFeature();

用Environment.TickCount进行代码执行时间测试,结果发现方法一读取整个表的时间为4984ms,而方法二读取同一个属性给的时间仅为32 ms,法二的执行效率是法一的156倍!!!

完整测试代码如下:

[csharp] view plaincopy

  1. IFeatureLayer pLayer = Utilities.GetLayerByName((string)cmbRegLayers.SelectedItem, m_mapControl) as IFeatureLayer;
  2. IFeatureCursor FCursor = pLayer.FeatureClass.Search(new QueryFilterClass(), false);
  3. IFeature feature = FCursor.NextFeature();
  4. int t = Environment.TickCount;
  5. object clsFldValue=null;
  6. for (int i = 0; i < pLayer.FeatureClass.FeatureCount(null); i++)
  7. {
  8. clsFldValue = feature.get_Value(3);
  9. feature = FCursor.NextFeature();
  10. }
  11. t = Environment.TickCount - t;
  12. MessageBox.Show(t.ToString());
  13. ITable pTable = pLayer.FeatureClass as ITable;
  14. t = Environment.TickCount;
  15. for (int i = 0; i < pTable.RowCount(null); i++)
  16. clsFldValue = pTable.GetRow(i).get_Value(3);
  17. t = Environment.TickCount - t;
  18. MessageBox.Show(t.ToString());

4.属性的更新

一、当将一批数据更新为某一相同的属性时,使用ITable.UpdateSearchedRows效率会很高。

示例如下:

[csharp] view plaincopy

  1. // Find the position of the field that will be updated.
  2. int typeFieldIndex = featureClass.FindField("TYPE");
  3. // Create a query filter defining which fields will be updated
  4. // (the subfields) and how to constrain which rows are updated
  5. // (the where clause).
  6. IQueryFilter queryFilter = new QueryFilterClass
  7. {
  8. SubFields = "TYPE", WhereClause = "LANE_COUNT = 4"
  9. };
  10. // Create a ComReleaser for buffer management.
  11. using(ComReleaser comReleaser = new ComReleaser())
  12. {
  13. // Create a feature buffer containing the values to be updated.
  14. IFeatureBuffer featureBuffer = featureClass.CreateFeatureBuffer();
  15. featureBuffer.set_Value(typeFieldIndex, "Highway");
  16. comReleaser.ManageLifetime(featureBuffer);
  17. // Cast the class to ITable and perform the updates.
  18. ITable table = (ITable)featureClass;
  19. IRowBuffer rowBuffer = (IRowBuffer)featureBuffer;
  20. table.UpdateSearchedRows(queryFilter, rowBuffer);
  21. }

二、逐条更新记录

这种方式中可有三种方法,如下:

(1)

[csharp] view plaincopy

  1. for (int i = 0; i < pTable.RowCount(null); i++)
  2. {
  3. pRow = pTable.GetRow(i);
  4. pRow.set_Value(2, i + 6);
  5. pRow.Store();
  6. }

(2)

[csharp] view plaincopy

  1. IFeatureCursor FCursor = pLayer.FeatureClass.Search(new QueryFilterClass(), false);
  2. IFeature feature = FCursor.NextFeature();
  3. for (int i = 0; i < featureNum; i++)
  4. {
  5. feature.set_Value(2, i);
  6. feature.Store();
  7. feature = FCursor.NextFeature();
  8. }

(3)

[csharp] view plaincopy

  1. ICursor pCursor =pTable.Update(null, false);
  2. pRow = pCursor.NextRow();
  3. for (int i = 0; i < pTable.RowCount(null); i++)
  4. {
  5. pRow.set_Value(2, i + 6);
  6. pCursor.UpdateRow(pRow);
  7. pRow = pCursor.NextRow();
  8. }

试验数据为320条记录,三种方法的运行时间为:法(1)为40297ms;法(2)34922ms为;法(3)为219ms.

可见运用IFeature和IRow的Store方法更新速度都很慢,用ICursor 的UpdateRow方法速度很快,分别是前两者效率的184倍、159倍!!

参考:

Creating features http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#//00010000049v000000

Updating Features http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#//0001000002rs000000

插入和删除Featureclass中feature的几种方法(VB.Net) http://www.cnblogs.com/wall/archive/2008/12/05/1348646.html

Arcengine效率探究之一——属性的读取 http://blog.csdn.net/lk103852503/article/details/6566652

Arcengine效率探究之二——属性的更新 http://blog.csdn.net/lk103852503/article/details/6570748

时间: 2024-10-08 06:19:24

ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新的相关文章

js 为对象添加和删除属性

对于一个普通的js对象: var obj = { name:"mary", age:21 } 如果我们要对它添加新属性的话可以使用下列方式: obj.address = "北京" //{name: "mary", age: "21", address: "beijing"} 删除属性,需要使用delete方法: delete obj.name //{age: "21", address:

ArcGIS Engine中添加点、线、面元素

转自原文ArcGIS Engine中添加点.线.面元素 //画点 IPoint pt = axMapControl1.ToMapPoint(e.x, e.y); IMarkerElement pMarkerElement = new MarkerElementClass(); IElement pElement = pMarkerElement as IElement; pElement.Geometry = pt; IGraphicsContainer pGraphicsContainer =

ArcGIS Engine检索要素集、要素类和要素

转自原文 ArcGIS Engine检索要素集.要素类和要素 [csharp] view plain copy print? /// <summary> /// 获取所有要素集 /// </summary> /// <param name="workspace">工作空间对象</param> /// <returns>要素集列表</returns> public static List<IFeatureDat

《ArcGIS Engine+C#实例开发教程》第四讲 状态栏信息的添加与实现

原文:<ArcGIS Engine+C#实例开发教程>第四讲 状态栏信息的添加与实现 摘要:在上一讲中,我们完成了 MapControl 和PageLayoutControl两种视图的同步工作,本讲我们将完成状态栏信息的添加与实现.应用程序的状态栏一般用来显示程序的当前状态,当前所使用的工具. GIS应用程序一般也在状态栏显示当前光标的坐标.比例尺等信息.学习完本讲内容,您将学会状态栏编程的基本方法,并且能够在我们的程序的状态栏中添加且显示以下信息:当前所用工具信息.当前比例尺.当前坐标.  

ArcGIS Engine中删除要素的几种方法总结

转自原文 ArcGIS Engine中删除要素的几种方法总结 /// <summary> /// 通过IFeature.Delete方法删除要素 /// </summary> /// <param name="pFeatureclass">要素类</param> /// <param name="strWhereClause">查询条件</param> public static void De

ArcGIS Engine开发之旅04---ARCGIS接口详细说明

原文 ArcGIS Engine开发之旅04---ARCGIS接口详细说明 ArcGIS接口详细说明... 1 1.IField接口(esriGeoDatabase)... 2 2.IFieldEdit接口(esriGeoDatabase)... 2 3.IFields接口(esriGeoDatabase)... 2 4. IRow接口(esriGeoDatabase)... 3 5. ITable接口(esriGeoDatabase)... 3 6. IArea接口(esriGeometry)

《ArcGIS Engine+C#实例开发教程》第八讲 属性数据表的查询显示

原文:<ArcGIS Engine+C#实例开发教程>第八讲 属性数据表的查询显示 第一讲 桌面GIS应用程序框架的建立 第二讲 菜单的添加及其实现 第三讲 MapControl与PageLayoutControl同步 第四讲 状态栏信息的添加与实现 第五讲 鹰眼的实现 第六讲 右键菜单添加与实现 教程Bug及优化方案1 第七讲 图层符号选择器的实现1 第七讲 图层符号选择器的实现2 第八讲 属性数据表的查询显示 摘要:这一讲中,我们将实现图层属性数据表的查询显示.在ArcMap中,单击图层右

ArcGIS engine中Display类库 (局部刷新)

转自原文 ArcGIS engine中Display类库 (局部刷新) Display类库包括了用于显示GIS数据的对象.除了负责实际输出图像的主要显示对象(display object)外,这个类库还包含了表示符号和颜色的对象,用于控制在显示(display)中绘制时实体的属性.这个类库也包含了用户与显示(display)交互时的可视化反馈的对象.完成这些功能的对象被归并到一组类库子系统中. 这些类库子系统是: n         Display n         Dynamic Displ

ArcGIS Engine开发前基础知识(4)

ArcGIS不同开发方式的比较 关于GIS应用软件的开发,通常有三种方式:C/S架构.网络GIS和移动GIS.ArcGIS平台提供了对三种开发方式的支持,对于采用从C/S架构的大多数开发者来讲,首先想到的是ArcGIS Engine进行开发.实际上,并不是所有的系统都必须采用这种方式,上述的三种开发方式(VBA.DLL和Add-in)在很多的时候也可以考虑. 作为VB的子集,VBA方式采用Visual Basic语言规范,简单易学,开发者只需要关注自己需要而ArcGIS没有直接提供的功能.对于广