使用内存中的 FeatureSet 和 Feature DotSpatial
Working with in memory FeatureSet and Feature DotSpatial
我是 DotSpatial 的初学者,遇到了一个问题。
我尝试使用内存功能(将它们仅保存在地图中),直到用户点击保存按钮。
基本思想是用户导入一些 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;
}
一切看起来都很好,地图更新了新的多边形,可以 select 它们,查看数据表中的信息但是,当我尝试删除 selected 特征(多边形)时它抛出IndexOutOfRange 异常。
我做错了什么?
请帮忙!谢谢你,对不起我糟糕的英语。
P.S。
当我首先创建 featureSet 时,我将其保存在磁盘上,然后使用 Map.AddLayer() 方法加载到地图中。
与此同时,我在 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();
}
}
希望对某人有所帮助。
我是 DotSpatial 的初学者,遇到了一个问题。 我尝试使用内存功能(将它们仅保存在地图中),直到用户点击保存按钮。 基本思想是用户导入一些 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;
}
一切看起来都很好,地图更新了新的多边形,可以 select 它们,查看数据表中的信息但是,当我尝试删除 selected 特征(多边形)时它抛出IndexOutOfRange 异常。
我做错了什么?
请帮忙!谢谢你,对不起我糟糕的英语。
P.S。 当我首先创建 featureSet 时,我将其保存在磁盘上,然后使用 Map.AddLayer() 方法加载到地图中。
与此同时,我在 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();
}
}
希望对某人有所帮助。