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

C# 以编程方式在新Shapefile中设置属性表,c#,attributes,shapefile,dotspatial,C#,Attributes,Shapefile,Dotspatial,我有一个程序,可以将一个shapefile加载到内存中,根据业务逻辑对一些功能进行分组,从每组功能中创建一个shapefile,然后将文件保存到云位置,以便在其他应用程序中使用 这个过程中的一个关键点是属性表。我希望能够在新的shapefile中为特征设置自定义属性。使用下面的代码,我可以用所需的信息更新datatable,但一旦保存并处理shapefile对象,我就无法使它保持不变 var table = shapefile.DataTable; var i = 0; foreach(var

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

这个过程中的一个关键点是属性表。我希望能够在新的shapefile中为特征设置自定义属性。使用下面的代码,我可以用所需的信息更新datatable,但一旦保存并处理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中为我提供了一个正确填充的数据表,但是当我在MapWindow5中打开shapefile时,属性表中唯一的字段是自动生成的Id

很明显,我遗漏了一些我认为包含在“AcceptChanges()”或“Being/EndEdit()”中的“保存更改”步骤……还需要在表上调用什么才能使其更新


我有一种感觉,自从Codeplex Sunsette发布以来,我找不到一个教程介绍了这一点,但由于谷歌的帮助不大。

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

shapefile.Filename = $"{filePathWithName}.shp";
shapefile.UpdateAttributes();
这两行代码就在保存shapefile之前,我现在可以在MapWindow5中看到我梦想的属性表

注意

召唤

shapefile.UpdateAttributes();
如果不首先设置shapefile.Filename属性,将引发异常

更新属性显然需要保存到shapefile包的.dbf文件中,如果不知道该.dbf文件应该放在哪里,它就不能这样做。这需要对我进行一些重构,因为直到过程结束,输出shapefile才存在于内存之外