将Arcengine拓扑错误的要素提取出来并导出为shape文件
拓扑错误提取:
private void PRV_GetErrorFeature(ITopologyRule IN_TopologyRule)
{
IEnvelope Temp_Envolope = (TP_MainTopology as IGeoDataset).Extent;
IErrorFeatureContainer Temp_ErrorContainer = TP_MainTopology as IErrorFeatureContainer;
//获取该种错误所有的错误要素
IEnumTopologyErrorFeature Temp_EnumErrorFeature = Temp_ErrorContainer.get_ErrorFeatures(((IGeoDataset)FDS_MainFeatureDataset).SpatialReference, IN_TopologyRule, Temp_Envolope, true, true);
//提取一个错误要素
ITopologyErrorFeature Temp_ErrorFeature = Temp_EnumErrorFeature.Next();
if (Temp_ErrorFeature != null)
{
//作为搭建模型的要素
IFeature Temp_MoudleFeature = Temp_ErrorFeature as IFeature;
//生成要素类需要CLSID和EXCLSID
IFeatureClassDescription Temp_FeatureClassDescription = new FeatureClassDescriptionClass();
IObjectClassDescription Temp_ObjectClassDescription = (IObjectClassDescription)Temp_FeatureClassDescription;
//以模型要素为模板构建一个要素类
FDS_MainFeatureDataset.CreateFeatureClass(IN_TopologyRule.ToString(), Temp_MoudleFeature.Fields, Temp_ObjectClassDescription.InstanceCLSID, Temp_ObjectClassDescription.ClassExtensionCLSID, Temp_MoudleFeature.FeatureType, "Shape", "");
//打开生成的目标要素类并加入集合留待输出时使用
IFeatureClass Temp_TargetFeatureClass = (FDS_MainFeatureDataset.Workspace as IFeatureWorkspace).OpenFeatureClass(IN_TopologyRule.ToString());
LI_TopoErrorFeatureClass.Add(Temp_TargetFeatureClass);
//将所有错误要素添加进目标要素类
IWorkspaceEdit Temp_WorkspaceEdit = (IWorkspaceEdit)FDS_MainFeatureDataset.Workspace;
Temp_WorkspaceEdit.StartEditing(true);
Temp_WorkspaceEdit.StartEditOperation();
IFeatureBuffer Temp_FeatureBuffer = Temp_TargetFeatureClass.CreateFeatureBuffer();
//在目标要素类中插入所有错误要素
IFeatureCursor featureCursor = Temp_TargetFeatureClass.Insert(true); ;
while (Temp_ErrorFeature != null)
{
IFeature Temp_Feature = Temp_ErrorFeature as IFeature;
//给目标要素附属性
Temp_FeatureBuffer.set_Value(1, Temp_ErrorFeature.OriginClassID);
Temp_FeatureBuffer.set_Value(2, Temp_ErrorFeature.OriginOID);
Temp_FeatureBuffer.set_Value(5, Temp_ErrorFeature.TopologyRuleType);
Temp_FeatureBuffer.Shape = Temp_Feature.Shape;
object featureOID = featureCursor.InsertFeature(Temp_FeatureBuffer);
featureCursor.Flush();//保存要素
Temp_ErrorFeature = Temp_EnumErrorFeature.Next();
}
Temp_WorkspaceEdit.StopEditOperation();
Temp_WorkspaceEdit.StopEditing(true);
System.Runtime.InteropServices.Marshal.ReleaseComObject(featureCursor);
}
}
其中:
TP_MainTopology为验证后的拓扑,类行为ITopology
LI_TopoErrorFeatureClass为记录所有拓扑错误要素类的集合,类型为 List<IFeatureClass> LI_TopoErrorFeatureClass
FDS_MainFeatureDataset为存储要素类的要素数据集,类型为FeatureDataset
输出shape文件
private void PRV_OutPutToShape()
{
FeatureClassToShapefile GP_FeatureClassToShape = new FeatureClassToShapefile();
foreach (IFeatureClass Each_FeatureClass in LI_TopoErrorFeatureClass)
{
GP_FeatureClassToShape.Input_Features = Each_FeatureClass;
GP_FeatureClassToShape.Output_Folder = "E:\\";
GP_Tool.Execute(GP_FeatureClassToShape,null);
}
}