ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新
2015-08-25 16:12
405 查看
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
plaincopy
///<summary>
///删除某featurelayer中所有feature
///</summary>
///<param name="pLayer">操作的涂层</param>
///<remarks>该方法可以给一个queryfilter,进行删除符合条件的features</remarks>
private void DeleteAllFeatures(IFeatureLayer pLayer, <code></code>IQueryFilter queryFilter)
{
ITable pTable = pLayer.FeatureClass as ITable;
pTable.DeleteSearchedRows(queryFilter);
}
3. 属性的读取
在获取属性表的值时有多种方法:
方法一:
[csharp] view
plaincopy
ITable pTable = pLayer.FeatureClass as ITable;
clsFldValue = pTable.GetRow(i).get_Value(clsFldIndex);
方法二:
[csharp] view
plaincopy
IFeatureCursor FCursor = pLayer.FeatureClass.Search(new QueryFilterClass(), false);
IFeature feature = FCursor.NextFeature();
if (feature == null) return null;
clsFldValue = feature.get_Value(clsFldIndex);
feature = FCursor.NextFeature();
用Environment.TickCount进行代码执行时间测试,结果发现方法一读取整个表的时间为4984ms,而方法二读取同一个属性给的时间仅为32 ms,法二的执行效率是法一的156倍!!!
完整测试代码如下:
[csharp] view
plaincopy
IFeatureLayer pLayer = Utilities.GetLayerByName((string)cmbRegLayers.SelectedItem, m_mapControl) as IFeatureLayer;
IFeatureCursor FCursor = pLayer.FeatureClass.Search(new QueryFilterClass(), false);
IFeature feature = FCursor.NextFeature();
int t = Environment.TickCount;
object clsFldValue=null;
for (int i = 0; i < pLayer.FeatureClass.FeatureCount(null); i++)
{
clsFldValue = feature.get_Value(3);
feature = FCursor.NextFeature();
}
t = Environment.TickCount - t;
MessageBox.Show(t.ToString());
ITable pTable = pLayer.FeatureClass as ITable;
t = Environment.TickCount;
for (int i = 0; i < pTable.RowCount(null); i++)
clsFldValue = pTable.GetRow(i).get_Value(3);
t = Environment.TickCount - t;
MessageBox.Show(t.ToString());
4.属性的更新
一、当将一批数据更新为某一相同的属性时,使用ITable.UpdateSearchedRows效率会很高。
示例如下:
[csharp] view
plaincopy
// Find the position of the field that will be updated.
int typeFieldIndex = featureClass.FindField("TYPE");
// Create a query filter defining which fields will be updated
// (the subfields) and how to constrain which rows are updated
// (the where clause).
IQueryFilter queryFilter = new QueryFilterClass
{
SubFields = "TYPE", WhereClause = "LANE_COUNT = 4"
};
// Create a ComReleaser for buffer management.
using(ComReleaser comReleaser = new ComReleaser())
{
// Create a feature buffer containing the values to be updated.
IFeatureBuffer featureBuffer = featureClass.CreateFeatureBuffer();
featureBuffer.set_Value(typeFieldIndex, "Highway");
comReleaser.ManageLifetime(featureBuffer);
// Cast the class to ITable and perform the updates.
ITable table = (ITable)featureClass;
IRowBuffer rowBuffer = (IRowBuffer)featureBuffer;
table.UpdateSearchedRows(queryFilter, rowBuffer);
}
二、逐条更新记录
这种方式中可有三种方法,如下:
(1)
[csharp] view
plaincopy
for (int i = 0; i < pTable.RowCount(null); i++)
{
pRow = pTable.GetRow(i);
pRow.set_Value(2, i + 6);
pRow.Store();
}
(2)
[csharp] view
plaincopy
IFeatureCursor FCursor = pLayer.FeatureClass.Search(new QueryFilterClass(), false);
IFeature feature = FCursor.NextFeature();
for (int i = 0; i < featureNum; i++)
{
feature.set_Value(2, i);
feature.Store();
feature = FCursor.NextFeature();
}
(3)
[csharp] view
plaincopy
ICursor pCursor =pTable.Update(null, false);
pRow = pCursor.NextRow();
for (int i = 0; i < pTable.RowCount(null); i++)
{
pRow.set_Value(2, i + 6);
pCursor.UpdateRow(pRow);
pRow = pCursor.NextRow();
}
试验数据为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中,主要有两个方法用于要素的添加:
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
plaincopy
///<summary>
///删除某featurelayer中所有feature
///</summary>
///<param name="pLayer">操作的涂层</param>
///<remarks>该方法可以给一个queryfilter,进行删除符合条件的features</remarks>
private void DeleteAllFeatures(IFeatureLayer pLayer, <code></code>IQueryFilter queryFilter)
{
ITable pTable = pLayer.FeatureClass as ITable;
pTable.DeleteSearchedRows(queryFilter);
}
3. 属性的读取
在获取属性表的值时有多种方法:
方法一:
[csharp] view
plaincopy
ITable pTable = pLayer.FeatureClass as ITable;
clsFldValue = pTable.GetRow(i).get_Value(clsFldIndex);
方法二:
[csharp] view
plaincopy
IFeatureCursor FCursor = pLayer.FeatureClass.Search(new QueryFilterClass(), false);
IFeature feature = FCursor.NextFeature();
if (feature == null) return null;
clsFldValue = feature.get_Value(clsFldIndex);
feature = FCursor.NextFeature();
用Environment.TickCount进行代码执行时间测试,结果发现方法一读取整个表的时间为4984ms,而方法二读取同一个属性给的时间仅为32 ms,法二的执行效率是法一的156倍!!!
完整测试代码如下:
[csharp] view
plaincopy
IFeatureLayer pLayer = Utilities.GetLayerByName((string)cmbRegLayers.SelectedItem, m_mapControl) as IFeatureLayer;
IFeatureCursor FCursor = pLayer.FeatureClass.Search(new QueryFilterClass(), false);
IFeature feature = FCursor.NextFeature();
int t = Environment.TickCount;
object clsFldValue=null;
for (int i = 0; i < pLayer.FeatureClass.FeatureCount(null); i++)
{
clsFldValue = feature.get_Value(3);
feature = FCursor.NextFeature();
}
t = Environment.TickCount - t;
MessageBox.Show(t.ToString());
ITable pTable = pLayer.FeatureClass as ITable;
t = Environment.TickCount;
for (int i = 0; i < pTable.RowCount(null); i++)
clsFldValue = pTable.GetRow(i).get_Value(3);
t = Environment.TickCount - t;
MessageBox.Show(t.ToString());
4.属性的更新
一、当将一批数据更新为某一相同的属性时,使用ITable.UpdateSearchedRows效率会很高。
示例如下:
[csharp] view
plaincopy
// Find the position of the field that will be updated.
int typeFieldIndex = featureClass.FindField("TYPE");
// Create a query filter defining which fields will be updated
// (the subfields) and how to constrain which rows are updated
// (the where clause).
IQueryFilter queryFilter = new QueryFilterClass
{
SubFields = "TYPE", WhereClause = "LANE_COUNT = 4"
};
// Create a ComReleaser for buffer management.
using(ComReleaser comReleaser = new ComReleaser())
{
// Create a feature buffer containing the values to be updated.
IFeatureBuffer featureBuffer = featureClass.CreateFeatureBuffer();
featureBuffer.set_Value(typeFieldIndex, "Highway");
comReleaser.ManageLifetime(featureBuffer);
// Cast the class to ITable and perform the updates.
ITable table = (ITable)featureClass;
IRowBuffer rowBuffer = (IRowBuffer)featureBuffer;
table.UpdateSearchedRows(queryFilter, rowBuffer);
}
二、逐条更新记录
这种方式中可有三种方法,如下:
(1)
[csharp] view
plaincopy
for (int i = 0; i < pTable.RowCount(null); i++)
{
pRow = pTable.GetRow(i);
pRow.set_Value(2, i + 6);
pRow.Store();
}
(2)
[csharp] view
plaincopy
IFeatureCursor FCursor = pLayer.FeatureClass.Search(new QueryFilterClass(), false);
IFeature feature = FCursor.NextFeature();
for (int i = 0; i < featureNum; i++)
{
feature.set_Value(2, i);
feature.Store();
feature = FCursor.NextFeature();
}
(3)
[csharp] view
plaincopy
ICursor pCursor =pTable.Update(null, false);
pRow = pCursor.NextRow();
for (int i = 0; i < pTable.RowCount(null); i++)
{
pRow.set_Value(2, i + 6);
pCursor.UpdateRow(pRow);
pRow = pCursor.NextRow();
}
试验数据为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
相关文章推荐
- 无需编码实现UI动效:XCode+Canvas
- java中Double类型的运算精度丢失的问题 (小数点多出99999999999999)
- Win7与Ubuntu双系统安装的问题
- LeetCode -- Candy
- server 多线程
- 构建高可用linux服务器学习笔记
- 鼠标经过时改变DIV背景颜色的三种途径
- Android-基本控件(SeekBar 可拖动 滚动条的使用)
- SQL中的join操作总结(非常好)
- Java线性查找
- tcp/ip协议 卷一知识点整理
- Java Web学习路线
- mysql的常用操作
- 重建二叉树
- 计算屏幕大小
- 关于端口占用问题,利用tomcat发布工程,有时会出现由于端口被占用而发布不成功,就需要终止端口
- JS/JQ获取节点的同级,父级,子级元素
- 【python编程】python引导实例参考
- 详解js跨域问题
- 我不再一味相信书本上的知识,不再一味相信过去几二十多年对我的洗脑