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

相关文章

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

Linux Mint Xia 22.1重磅发布: 重要更新一览

《LinuxMintXia22.1重磅发布:重要更新一览》Beta版LinuxMint“Xia”22.1发布,新版本基于Ubuntu24.04,内核版本为Linux6.8,这... linux Mint 22.1「Xia」正式发布啦!这次更新带来了诸多优化和改进,进一步巩固了 Mint 在 Linux 桌面

Redis过期键删除策略解读

《Redis过期键删除策略解读》Redis通过惰性删除策略和定期删除策略来管理过期键,惰性删除策略在键被访问时检查是否过期并删除,节省CPU开销但可能导致过期键滞留,定期删除策略定期扫描并删除过期键,... 目录1.Redis使用两种不同的策略来删除过期键,分别是惰性删除策略和定期删除策略1.1惰性删除策略

SpringBoot项目删除Bean或者不加载Bean的问题解决

《SpringBoot项目删除Bean或者不加载Bean的问题解决》文章介绍了在SpringBoot项目中如何使用@ComponentScan注解和自定义过滤器实现不加载某些Bean的方法,本文通过实... 使用@ComponentScan注解中的@ComponentScan.Filter标记不加载。@C

Java读取InfluxDB数据库的方法详解

《Java读取InfluxDB数据库的方法详解》本文介绍基于Java语言,读取InfluxDB数据库的方法,包括读取InfluxDB的所有数据库,以及指定数据库中的measurement、field、... 首先,创建一个Java项目,用于撰写代码。接下来,配置所需要的依赖;这里我们就选择可用于与Infl

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

MySQL中删除重复数据SQL的三种写法

《MySQL中删除重复数据SQL的三种写法》:本文主要介绍MySQL中删除重复数据SQL的三种写法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录方法一:使用 left join + 子查询删除重复数据(推荐)方法二:创建临时表(需分多步执行,逻辑清晰,但会