public class PolygonGapChecker : CheckProgressMessageSender, IChecker, ICheckProgressChangeEvent { private IFeatureLayer featureLayer; /// <summary> /// 待检查的面要素类图层 /// </summary> public IFeatureLayer FeatureLayer { set { if (value != null) { if (value.FeatureClass.ShapeType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon) featureLayer = value; else throw new new ArgumentException The ( " feature type class is not desired, the surface should be the feature class. " ); } the else the throw new new ArgumentException The ( " feature class object is passed null " ); } } Private int featureCount = - . 1 ; /// <Summary> /// number feature of the subject feature class /// </ Summary> public int FeatureCount { GET { return featureCount;}} // Private Double Distance = 0.2; /// <Summary> ///Distance value, a value greater than zero /// </ Summary> public Double Distance { SET {}} Private Double Tolerance = from 0.001 ; /// <Summary> /// tolerance value, a value greater than zero /// </ Summary> public Double tolerance { SET { IF (value <= 0 ) the throw new new ArgumentException the ( " tolerance should be a decimal greater than 0. " ); the else tolerance = value; } } // Private Double angle = 10.0; /// <Summary> /// angle value, a value greater than zero /// </ Summary> public Double Angle { SET {}} Private String workspacePath = String .Empty; /// <Summary> /// path or folder FGDB /// </ Summary> public String WorkspacePath { SET { IF (System.IO.Directory.Exists (value)) workspacePath = value; the else the throw new new ArgumentException The ( " path to a given FGDB or folder does not exist! " ); } } Private Readonly CheckerType checkerType = CheckerType surface gaps or holes;. /// <Summary> // check the type /// </ Summary> public checkerType checkerType { GET { return checkerType;}} /// <Summary> /// inspection method /// </ Summary> /// <Returns> check result feature class </ Returns> public the IFeatureClass the check () { IFeatureClass featureClass_cover; //IFeatureClass featureClass_erase; //IFeatureClass featureClass_erase_explode; IFeatureClass featureClass_result; IWorkspaceFactory workspaceFactory = new ShapefileWorkspaceFactory(); string featureClass_cover_Name=featureLayer.Name+"_cover.shp"; string featureClass_erase_Name = $"{workspacePath}\\{featureLayer.Name}_erase.shp"; string featureClass_result_Name = $"featureLayer.Name workspacePath} \\ {{} _gap.shp " ; IF (workspacePath.Split ( ' . ' .) .Last () The ToLower () == " GDB " ) { // determine the name of the feature class, such as workspace it is a file geodatabase feature class does not have a last name .shp. featureClass_cover_Name = featureClass_cover_Name.Replace ( " .shp " , "" ); featureClass_erase_Name = featureClass_erase_Name.Replace ( " .shp " , "" ); featureClass_result_Name = featureClass_result_Name.Replace(" .Shp " , "" ); // If the file geodatabase, FileGDBWorkspaceFactoryClass should instantiate an object. = WorkspaceFactory new new FileGDBWorkspaceFactoryClass (); } IFeatureWorkspace featureWorkspace = workspaceFactory.OpenFromFile (workspacePath, 0 ) AS IFeatureWorkspace; #region create Cover feature class to be erased FeatureClassCreator featureClassCreator = new new FeatureClassCreator (FeatureLayer, featureClass_cover_Name, esriGeometryType.esriGeometryPolygon, workspacePath) ; featureClass_cover = featureClassCreator.Create(); OnCheckProgresChange(checkProgressChangeEventHandler, ">>>成功创建Cover。"); IPolygon polygon_cover = new PolygonClass(); IPoint pointUpperLeft = new PointClass { X = (featureLayer.FeatureClass as IGeoDataset).Extent.UpperLeft.X - 100, Y = (featureLayer.FeatureClass as IGeoDataset).Extent.UpperLeft.Y-100 }; IPoint pointUpperRight = new PointClass { X = (featureLayer.FeatureClass as IGeoDataset).Extent.UpperRight.X + 100, Y = (featureLayer.FeatureClass as IGeoDataset).Extent.UpperRight.Y-100 }; IPoint pointLowerRight = new PointClass { X = (featureLayer.FeatureClass as IGeoDataset).Extent.LowerRight.X + 100, Y = (featureLayer.FeatureClass as IGeoDataset).Extent.LowerRight.Y+100 }; IPoint pointLowerLeft = new PointClass { X = (featureLayer.FeatureClass as IGeoDataset).Extent.LowerLeft.X - 100, Y = (featureLayer.FeatureClass as IGeoDataset).Extent.LowerLeft.Y+100 }; IPointCollection pointCollection_cover = polygon_cover as IPointCollection; pointCollection_cover.AddPoint(pointUpperLeft); pointCollection_cover.AddPoint(pointUpperRight); pointCollection_cover.AddPoint(pointLowerRight); pointCollection_cover.AddPoint(pointLowerLeft); pointCollection_cover.AddPoint(pointUpperLeft); IFeature feature_cover= featureClass_cover.CreateFeature(); feature_cover.Shape = polygon_cover; feature_cover.Store(); OnCheckProgresChange(checkProgressChangeEventHandler, ">>>成功创建Cover要素,准备执行Erase。"); #endregion Geoprocessor.Geoprocessor gp = new Geoprocessor.Geoprocessor { AddOutputsToMap = false, OverwriteOutput = true }; Erase erase = new Erase { in_features = $"{workspacePath}\\{featureClass_cover_Name}", erase_features = featureLayer, out_feature_class = featureClass_erase_Name, cluster_tolerance = this.tolerance, }; gp.Execute(erase, null); OnCheckProgresChange(checkProgressChangeEventHandler, ">>>成功创建Erase,准备执行Explode。"); MultipartToSinglepart multipartToSinglepart = new MultipartToSinglepart { in_features = featureClass_erase_Name, out_feature_class = featureClass_result_Name }; gp.Execute(multipartToSinglepart, null); featureClass_result = featureWorkspace.OpenFeatureClass(featureClass_result_Name.Replace($"{workspacePath}\\", "")); CheckAuxiliaryHelper.SpatialSearchAndDeleteFeatures(featureClass_result, pointUpperLeft, esriSpatialRelEnum.esriSpatialRelIntersects); featureClass_result.DeleteField(featureClass_result.Fields.Field[featureClass_result.FindField("ORIG_FID")]); CheckAuxiliaryHelper.DeleteFeatureClass(featureClass_cover_Name, featureWorkspace); CheckAuxiliaryHelper.DeleteFeatureClass(featureClass_erase_Name, featureWorkspace); return featureClass_result; } private CheckProgressChangeEventHandler checkProgressChangeEventHandler; /// <summary> /// 进度改变事件 /// </summary> public event CheckProgressChangeEventHandler CheckProgressChangeEvent { add { this.checkProgressChangeEventHandler += value; } remove { this.checkProgressChangeEventHandler-=value; } } }