AE ShapeFile文件的读取和事务的控制对图层的插入
1、对shape file文件的读取,先窗口工作空间,然后从工作空间打开featureclass,最后创建图层置入featureclass,新建的图层就可以加入到map中了。

/// <summary>
/// 创建一个feature layer
/// </summary>
/// <param name="workspacePath"></param>
/// <param name="className"></param>
/// <returns></returns>
public IFeatureLayer CreateShapeFileLayerForShapeFile(string workspacePath,string className)
{
IFeatureWorkspace featureWorkspace = OpenFeatureWorkspaceForShapeFile(workspacePath);
if (featureWorkspace == null) return null;
IFeatureClass featureClass = featureWorkspace.OpenFeatureClass(className);
if (featureClass == null) return null;
IFeatureLayer flayer = new FeatureLayerClass();
flayer.Name = className;
flayer.FeatureClass = featureClass;
return flayer;
}/// <summary>
/// 打开一个feature workspace
/// </summary>
/// <param name="workspacePath"></param>
/// <returns></returns>
public IFeatureWorkspace OpenFeatureWorkspaceForShapeFile(string workspacePath)
{
IPropertySet properties = new PropertySetClass();
properties.SetProperty("DATABASE", workspacePath);
IWorkspaceFactory2 workspaceFactory = new ShapefileWorkspaceFactoryClass();
IFeatureWorkspace featureWorkspace = workspaceFactory.Open(properties, 0) as IFeatureWorkspace;
return featureWorkspace;
}
2、 事务控制,使用iworkspaceedit,获取workspaceedit时需要注意,要保证和你编辑的图层的工作空间一致,一个map中会有多个工作空间,获取dataset时注意,不要使用fclass.featuredataset,因为不是所有图层都在数据集中,一般shape文件的featureclass获取不到featuredataset。

if (flayer == null)
return null;
// 获取featureworkspace
IFeatureClass fclass = flayer.FeatureClass;
if (fclass == null)
return null;
IDataset dataset = fclass as IDataset;
if (dataset == null)
return null;
IWorkspaceEdit wsEditor = dataset.Workspace as IWorkspaceEdit;
wsEdit.StartEditing(false);// true代表开启操作事务控制,允许使用redo和undo
// 判定必要先决条件,如果不满足则不插入
if(fclass==null || geometry==null)
return false;
if(fclass.ShapeType!=geometry.GeometryType)
return false;
// 创建feature
IFeature feature = fclass.CreateFeature();
IFields fields = feature.Fields;
// 向feature插入图形
feature.Shape = geometry;
if (values != null)
{
// 如果传入值对,则对feature直接赋值
for (int i = 0; i < values.Count; i++)
{
int fieldIndex = fields.FindField(values.ElementAt(i).Key);
if (fieldIndex == -1)
continue;
// 验证后插入值
if(fields.get_Field(fieldIndex).CheckValue(values.ElementAt(i).Value))
feature.set_Value(fieldIndex, values.ElementAt(i).Value);
}
}
// 保存退出
feature.Store();
wsEdit.StopEditing(true);//true代表保持操作
结束!!