ArcGIS之更新数据

        某个有20万数据的图层,更新一个字段,将DLMC 内的值“水田”修改为“田地”,其中“DLMC='水田'”的数据有1.5万。做如下测试

一、IWorkspace.ExecuteSQL

        在更新大数据量时挺快,但不支持空间筛选。某些情況下可能不支持IWorkspace.ExecuteSQL这个方法,执行前最好先使用IWorkspaceProperty判断是否支持ExecuteSQL方法。如MDB、GDB、database等支持,而ShapeFile, CAD, Coverage的workspace就不支持这个方法。

private static void UpdateByWorkspace(IFeatureClass pFeatureClass)
{
    IDataset pDataset = pFeatureClass as IDataset;
    IWorkspace pWorkspace = pDataset.Workspace;
    IWorkspaceProperties pWorkspaceProperties = pWorkspace as IWorkspaceProperties;
    IWorkspaceProperty pWorkspaceProperty = pWorkspaceProperties.get_Property(esriWorkspacePropertyGroupType.esriWorkspacePropertyGroup, 0);
    if (pWorkspaceProperty.IsSupported)
        pDataset.Workspace.ExecuteSQL($"UPDATE {pDataset.Name} set {pDataset.Name}.DLMC='田地' where {pDataset.Name}.DLMC='水田'");
}

耗时:2852ms

二、ITable.UpdateSearchedRows

       转成ITable后更新

public static void UpdateByTable(IFeatureClass pFeatureClass)
{
    ISpatialFilter pSpatialFilter = new SpatialFilterClass();
    pSpatialFilter.WhereClause = "DLMC = '水田'";  //更新条件
    int idx = pFeatureClass.FindField("DLMC"); //待更新字段索引
    ITable pTable = pFeatureClass as ITable;

    IRowBuffer rowBuffer = pTable.CreateRowBuffer();
    rowBuffer.set_Value(idx, "田地");
    (pFeatureClass as ITable).UpdateSearchedRows(pSpatialFilter, rowBuffer);
}

耗时:5288ms

三、IFeatureCursor.UpdateFeature

      游标方式更新。

public static void UpdateByCursor(IFeatureClass pFeatureClass)
{
    ISpatialFilter pSpatialFilter = new SpatialFilterClass();
    pSpatialFilter.WhereClause = "DLMC = '水田'";  //更新条件
    int idx = pFeatureClass.FindField("DLMC"); //待更新字段索引
    IFeatureCursor pFeatureCursor = pFeatureClass.Update(pSpatialFilter, true);
    IFeature pFeature = null;
    while ((pFeature = pFeatureCursor.NextFeature()) != null)
    {
        pFeature.Value[idx] = "田地";   //将原本的城市更新为A市
        pFeatureCursor.UpdateFeature(pFeature);
    }
    System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);
}

耗时:5283ms

四、IFeature.Store

       适用于更新单个要素,批量更新速度很慢。

public static void UpdateByFeature(IFeatureClass pFeatureClass)
{
    ISpatialFilter pSpatialFilter = new SpatialFilterClass();
    pSpatialFilter.WhereClause = "DLMC = '水田'";  //更新条件
    int idx = pFeatureClass.FindField("DLMC"); //待更新字段索引
    IFeatureCursor pFeatureCursor = pFeatureClass.Update(pSpatialFilter, true);
    IFeature pFeature = null;
    while ((pFeature = pFeatureCursor.NextFeature()) != null)
    {
        pFeature.Value[idx] = "田地";   //将原本的城市更新为A市
        pFeature.Store();
    }
    System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);

    //更新单个要素
    IFeature feature = pFeatureClass.GetFeature(1); // Get a known feature using its Object ID.
    feature.set_Value(idx, "My Value");
    feature.Store();   // Store the changes.
}

批量耗时:47608ms

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值