0

我是 DotSpatial 的初学者,我遇到了一个问题。我尝试使用内存功能(仅将它们保留在地图中),直到用户点击保存按钮。基本思想是,如果 FeatureSet 不完全存在,用户导入一些 dxf 文件并根据图层名称创建特征集,并且为 dxf 中的每条折线创建将添加到特征集中的特征。

 public IFeature AddPoligons(EntityObject polyline, List<Text> textInDxf)
{
    IFeatureSet featureSet = null;
    //Getting the right featureset from map
    foreach (var x in appManager.Map.GetPolygonLayers())
    {
        if (!string.Equals(x.DataSet.Name, layerName)) continue;

        featureSet = x.DataSet as FeatureSet;
        break;
    }
    var polygon = CreatePolygon(polyline);

    //Creating feature and adding to FeatureSet
    var feature = featureSet.AddFeature(polygon);

    //Populating DataRow with information
    AddinfoIntoDataTable(feature, polygon, textInDxf);
    return feature;
}

一切看起来都很好,地图用新的多边形更新,可以选择它们,从数据表中查看信息但是,当我尝试删除选定的特征(多边形)时,它会引发 IndexOutOfRange 异常。

我在那里做错了什么?

请帮忙!谢谢你,对我糟糕的英语感到抱歉。

PS 当我首先创建 featureSet 时,我将它保存在磁盘上,然后使用 Map.AddLayer() 方法加载到地图中。

4

1 回答 1

0

同时,我在 CodePlex-DotSpatial 论坛的某个地方找到了解决方案,并由 Jany 发布。这个想法是在针对 FeatureSet 的每个操作(添加、删除、移动)之后调用这段代码

featureLayer.DataSet.UpdateExtent();
featureLayer.DataSet.InitializeVertices();
featureLayer.LabelLayer?.CreateLabels();
if(save)
{
    featureLayer.DataSet.Save();
    featureLayer.DataSet.Close();
}
featureLayer.AssignFastDrawnStates();
AppManager.Map.Refresh();
AppManager.Map.ResetBuffer();

其中 featureLayer 是 IFeatureLayer。

有一个问题:

如果我们使用 AppManager.Serialization.SaveProject() 保存项目,然后打开项目 AppManager.Serialization.OpenProject() 问题再次出现。作为解决方案,我在打开项目后调用我的 Save 方法,简而言之,如下所示:

public void Save()
{
     foreach(var featureLayer in AppManager.Map.GetPolygonLayers())
     {
         featureLayer.DataSet.Save();
    }
}

希望对某人有所帮助。

于 2017-04-28T21:09:14.817 回答