以编程方式在新Shapefile中设置属性表

时间:2018-04-05 17:25:30

标签: c# attributes shapefile dotspatial

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

此过程中的一个关键点是属性表。我曾希望能够为新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。

我明显错过了某种" Save Changes"我认为步骤包含在" AcceptChanges()"或者"是/ EndEdit()" ...还需要在桌面上调用什么才能让它更新?

我有一种感觉,自Codeplex日落以来我无法找到的其中一个教程中有这个内容,但因为谷歌并没有提供帮助。

1 个答案:

答案 0 :(得分:1)

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

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

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

注意

致电

shapefile.UpdateAttributes();

没有先设置shapefile.Filename属性就会抛出异常。

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