2

我有一个程序,它将 shapefile 加载到内存中,根据业务逻辑对一些功能进行分组,从每组功能中创建一个 shapefile,然后将文件保存到云位置以供其他应用程序使用。

这个过程中的一个症结是属性表。我希望能够为新 shapefile 中的功能设置自定义属性。使用下面的代码,我可以使用所需的信息更新数据表,但是一旦我保存并处置 shapefile 对象,我就无法让它持续存在。

var table = shapefile.DataTable;
var i = 0;

foreach(var branchObject in branches)
{
    shapefile.AddFeature(branchObject.Feature);

    var row = table.Rows[i];
    row.BeginEdit();
    row["BranchName"] = branchObject.Name;
    row.EndEdit();
    i++;
}

table.AcceptChanges();

这为我在 shapefile 中提供了一个正确填充的 DataTable,但是当我在 MapWindow5 中打开 shapefile 时,属性表中的唯一字段是自动生成的 Id。

我显然错过了我认为包含在“AcceptChanges()”或“Being/EndEdit()”中的某种“保存更改”步骤......还需要在表格上调用什么来使其更新?

我有一种感觉,自 Codeplex 停止使用以来我无法找到的教程之一中涵盖了这一点,但谷歌并没有提供多大帮助。

4

1 回答 1

2

事实证明,我的 DataTable 和 DataRows 都很好。必须明确告诉 shapefile 在进行更改后更新其属性表。

shapefile.Filename = $"{filePathWithName}.shp";
shapefile.UpdateAttributes();

这两行代码就在保存shapefile之前,我现在可以在MapWindow5中看到我梦想的属性表。

注意

打电话

shapefile.UpdateAttributes();

不先设置 shapefile.Filename 属性将引发异常。

更新属性显然需要保存到 shapefile 包的 .dbf 文件中,并且在不知道 .dbf 文件应该去哪里的情况下无法做到这一点。这需要对我进行一些重构,因为输出 shapefile 直到过程结束才存在于内存之外。

于 2018-04-05T17:25:29.957 回答