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

2024-08-28 13:18

本文主要是介绍ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 要素的添加

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

  • Using IFeatureClass.CreateFeature followed by IFeature.Store
  • Using IFeatureClass.CreateFeatureBuffer with an insert cursor 

批量插入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 plain copy 在CODE上查看代码片 派生到我的代码片
  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);  

3. 属性的读取

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

方法一:

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ITable pTable = pLayer.FeatureClass as ITable;  
  2. clsFldValue = pTable.GetRow(i).get_Value(clsFldIndex); 
方法二:

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. IFeatureCursor FCursor = pLayer.FeatureClass.Search(new QueryFilterClass(), false);  
  2. IFeature feature = FCursor.NextFeature();  
  3. if (feature == nullreturn null;  
  4. (2)clsFldValue = feature.get_Value(clsFldIndex);  
  5. feature = FCursor.NextFeature(); 

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

完整测试代码如下:

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  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.   
  5.  int t = Environment.TickCount;  
  6.   
  7.  object clsFldValue=null;  
  8.  for (int i = 0; i < pLayer.FeatureClass.FeatureCount(null); i++)  
  9.  {  
  10.      clsFldValue = feature.get_Value(3);  
  11.      feature = FCursor.NextFeature();  
  12.  }  
  13.   
  14.  t = Environment.TickCount - t;  
  15.  MessageBox.Show(t.ToString());  
  16.   
  17.  ITable pTable = pLayer.FeatureClass as ITable;  
  18.   
  19.  t = Environment.TickCount;  
  20.   
  21.  for (int i = 0; i < pTable.RowCount(null); i++)  
  22.      clsFldValue = pTable.GetRow(i).get_Value(3);  
  23.  t = Environment.TickCount - t;  
  24.  MessageBox.Show(t.ToString());  

4.属性的更新

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

示例如下:

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

二、逐条更新记录

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

(1)

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

  1. ICursor pCursor =pTable.Update(nullfalse);  
  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


这篇关于ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114867

相关文章

Qt实现对Word网页的读取功能

《Qt实现对Word网页的读取功能》文章介绍了几种在Qt中实现Word文档(.docx/.doc)读写功能的方法,包括基于QAxObject的COM接口调用、DOCX模板替换及跨平台解决方案,重点讨论... 目录1. 核心实现方式2. 基于QAxObject的COM接口调用(Windows专用)2.1 环境

Python列表的创建与删除的操作指南

《Python列表的创建与删除的操作指南》列表(list)是Python中最常用、最灵活的内置数据结构之一,它支持动态扩容、混合类型、嵌套结构,几乎无处不在,但你真的会创建和删除列表吗,本文给大家介绍... 目录一、前言二、列表的创建方式1. 字面量语法(最常用)2. 使用list()构造器3. 列表推导式

HTML5的input标签的`type`属性值详解和代码示例

《HTML5的input标签的`type`属性值详解和代码示例》HTML5的`input`标签提供了多种`type`属性值,用于创建不同类型的输入控件,满足用户输入的多样化需求,从文本输入、密码输入、... 目录一、引言二、文本类输入类型2.1 text2.2 password2.3 textarea(严格

input的accept属性让文件上传安全高效

《input的accept属性让文件上传安全高效》文章介绍了HTML的input文件上传`accept`属性在文件上传校验中的重要性和优势,通过使用`accept`属性,可以减少前端JavaScrip... 目录前言那个悄悄毁掉你上传体验的“常见写法”改变一切的 html 小特性:accept真正的魔法:让

MyBatis-Plus逻辑删除实现过程

《MyBatis-Plus逻辑删除实现过程》本文介绍了MyBatis-Plus如何实现逻辑删除功能,包括自动填充字段、配置与实现步骤、常见应用场景,并展示了如何使用remove方法进行逻辑删除,逻辑删... 目录1. 逻辑删除的必要性编程1.1 逻辑删除的定义1.2 逻辑删php除的优点1.3 适用场景2.

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

C#实现插入与删除Word文档目录的完整指南

《C#实现插入与删除Word文档目录的完整指南》在日常的办公自动化或文档处理场景中,Word文档的目录扮演着至关重要的角色,本文将深入探讨如何利用强大的第三方库Spire.Docfor.NET,在C#... 目录Spire.Doc for .NET 库:Word 文档处理利器自动化生成:C# 插入 Word

MySQL中的DELETE删除数据及注意事项

《MySQL中的DELETE删除数据及注意事项》MySQL的DELETE语句是数据库操作中不可或缺的一部分,通过合理使用索引、批量删除、避免全表删除、使用TRUNCATE、使用ORDERBY和LIMI... 目录1. 基本语法单表删除2. 高级用法使用子查询删除删除多表3. 性能优化策略使用索引批量删除避免

Java多种文件复制方式以及效率对比分析

《Java多种文件复制方式以及效率对比分析》本文总结了Java复制文件的多种方式,包括传统的字节流、字符流、NIO系列、第三方包中的FileUtils等,并提供了不同方式的效率比较,同时,还介绍了遍历... 目录1 背景2 概述3 遍历3.1listFiles()3.2list()3.3org.codeha

在C#中读取文件的六种主流方法详解

《在C#中读取文件的六种主流方法详解》在C#中读取文件有多种方法,不同方式适用于不同场景(小型文件、大型文件、文本文件或二进制文件),本文给大家介绍了6种主流方法以及其适用场景,需要的朋友可以参考下... 目录方法1:File.ReadAllText(读取整个文本文件)方法2:File.ReadAllLin