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

相关文章

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

基于Python实现读取嵌套压缩包下文件的方法

《基于Python实现读取嵌套压缩包下文件的方法》工作中遇到的问题,需要用Python实现嵌套压缩包下文件读取,本文给大家介绍了详细的解决方法,并有相关的代码示例供大家参考,需要的朋友可以参考下... 目录思路完整代码代码优化思路打开外层zip压缩包并遍历文件:使用with zipfile.ZipFil

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

CSS will-change 属性示例详解

《CSSwill-change属性示例详解》will-change是一个CSS属性,用于告诉浏览器某个元素在未来可能会发生哪些变化,本文给大家介绍CSSwill-change属性详解,感... will-change 是一个 css 属性,用于告诉浏览器某个元素在未来可能会发生哪些变化。这可以帮助浏览器优化

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

macOS无效Launchpad图标轻松删除的4 种实用方法

《macOS无效Launchpad图标轻松删除的4种实用方法》mac中不在appstore上下载的应用经常在删除后它的图标还残留在launchpad中,并且长按图标也不会出现删除符号,下面解决这个问... 在 MACOS 上,Launchpad(也就是「启动台」)是一个便捷的 App 启动工具。但有时候,应

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T