1. 要素的添加
ArcGIS Engine中,主要有两个方法用于要素的添加:
- Using IFeatureClass.CreateFeature followed by IFeature.Store
- Using IFeatureClass.CreateFeatureBuffer with an insert cursor
批量插入feature,如果用feature.store()方法,在图层中一个个地插入要素,较之同时使用insert cursor与feature buffer方法,会慢很多。
因为后者触发的事件和复杂行为比较少(比如说没有引发因拓扑关系产生的行为)。
1)、利用Insert Cursors和featureBuffer
IFeatureBuffer featureBuffer = featureClass.CreateFeatureBuffer();
IFeatureCursor featureCursor = featureClass.Insert(true);
object featureOID;
featureBuffer.set_Value(featureBuffer.Fields.FindField("InstBy"), "B Pierce");
for (int ic = 0; ic < 99; ic++)
{
featureBuffer.Shape = geometry;
featureOID = featureCursor.InsertFeature(featureBuffer);
}
featureBuffer.set_Value(featureBuffer.Fields.FindField("InstBy"), "K Johnston");
for (int ic = 0; ic < 99; ic++)
{
featureBuffer.Shape = geometry
featureOID = featureCursor.InsertFeature(featureBuffer);
}
featureCursor.Flush();
2)、直接进行数据插入(Feature.Store方法)
IFeature newLineFeature = LineFeaClass.CreateFeature();
newLineFeature.Shape = pFeature.Shape;
int ii = newLineFeature.Fields.FindField(AreaZonalName);
if (ii > 0)
{
newLineFeature.set_Value(ii, this.AnalysAreaComboBox.Text.Trim());
}
newLineFeature.Store();
注:最好将编辑操作对象中,如下:
IDataset dataset = (IDataset)featureClass;
IWorkspace workspace = dataset.Workspace;
// Cast the workspace to the IWorkspaceEdit interface.
IWorkspaceEdit workspaceEdit = (IWorkspaceEdit)workspace;
// Start an edit session and edit operation.
workspaceEdit.StartEditing(true);
workspaceEdit.StartEditOperation();
//在这里编写添加要素的代码。。。。。。。。。。。
// Stop editing.
workspaceEdit.StopEditOperation();
workspaceEdit.StopEditing(true);
2. 要素的删除
删除feature,一个个删除就用IFeature.Delete方法即可,此处不再赘述,只写一种批量删除的方法,用于ITable是针对数据库进行操作的,所以速度很快。
- private void DeleteAllFeatures(IFeatureLayer pLayer, <code></code>IQueryFilter queryFilter)
- {
- ITable pTable = pLayer.FeatureClass as ITable;
- pTable.DeleteSearchedRows(queryFilter);
- }
3. 属性的读取
在获取属性表的值时有多种方法:
方法一:
- ITable pTable = pLayer.FeatureClass as ITable;
- clsFldValue = pTable.GetRow(i).get_Value(clsFldIndex);
-
- 方法二:
- 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倍!!!
完整测试代码如下:
- 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效率会很高。
示例如下:
- // 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)
- for (int i = 0; i < pTable.RowCount(null); i++)
- {
- pRow = pTable.GetRow(i);
- pRow.set_Value(2, i + 6);
- pRow.Store();
- }
- 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();
- }
- 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倍!!