某个有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

 

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐