使用内存FeatureSet和Feature DotSpatial

时间:2017-04-28 06:01:11

标签: dotspatial

我是DotSpatial的初学者,我遇到了问题。 我尝试使用内存功能(仅将其保留在Map中),直到用户点击“保存”按钮。 基本思想是用户导入一些dxf文件并根据图层名称创建特征集,如果FeatureSet并非全部准备就绪,并且对于来自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;
}

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

那里我做错了什么?

请帮忙!谢谢,对不起我的英语不好。

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

1 个答案:

答案 0 :(得分: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();
    }
}

希望能有所帮助。