You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							737 lines
						
					
					
						
							38 KiB
						
					
					
				
			
		
		
	
	
							737 lines
						
					
					
						
							38 KiB
						
					
					
				using System; | 
						|
using System.Collections.Generic; | 
						|
using System.Linq; | 
						|
using ESRI.ArcGIS.Carto; | 
						|
using ESRI.ArcGIS.Controls; | 
						|
using ESRI.ArcGIS.esriSystem; | 
						|
using ESRI.ArcGIS.Geodatabase; | 
						|
using ESRI.ArcGIS.Geometry; | 
						|
using KGIS.Framework.AE; | 
						|
using KGIS.Framework.AE.ExtensionMethod; | 
						|
using KGIS.Framework.Maps; | 
						|
using KGIS.Framework.Utils; | 
						|
using KGIS.Framework.Utils.ExtensionMethod; | 
						|
using KGIS.Framework.Utils.Helper; | 
						|
using Kingo.Plugin.EngineEditor.Common; | 
						|
using Kingo.PluginServiceInterface.Helper; | 
						|
 | 
						|
namespace Kingo.Plugin.EngineEditor.View | 
						|
{ | 
						|
    public partial class UCBoundaryFitting : BaseWindow | 
						|
    { | 
						|
        private IHookHelper m_hookHelper;//获取地图控件和主窗体 | 
						|
        private Dictionary<string, IFeatureLayer> keys { get; set; } | 
						|
        private EngineEditorClass _engineEdit = new EngineEditorClass(); | 
						|
        private IFeatureLayer SelectFeatureLayer = null; | 
						|
        public UCBoundaryFitting(object Helpers, EngineEditorClass m_engineEdit) | 
						|
        { | 
						|
            InitializeComponent(); | 
						|
            try | 
						|
            { | 
						|
                if (this.m_hookHelper == null) | 
						|
                    this.m_hookHelper = Helpers as IHookHelper; | 
						|
                //获取当前工程中的全部图层 | 
						|
                List<IFeatureLayer> featureLayers = MapsManager.Instance.MapService.GetAllVisibleLayerInMap<IFeatureLayer>(); | 
						|
                if (featureLayers != null && featureLayers.Count > 0) | 
						|
                { | 
						|
                    keys = new Dictionary<string, IFeatureLayer>(); | 
						|
                    foreach (IFeatureLayer iFeatureLayer in featureLayers) | 
						|
                    { | 
						|
                        if (!keys.ContainsKey(iFeatureLayer.Name)) | 
						|
                            keys.Add(iFeatureLayer.Name, iFeatureLayer); | 
						|
                    } | 
						|
                    targetName.ItemsSource = keys.Keys; | 
						|
                } | 
						|
                _engineEdit = m_engineEdit; | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("UCBoundaryFitting异常:" + ex.Message); | 
						|
                LogAPI.Debug("UCBoundaryFitting异常:" + ex.StackTrace); | 
						|
                MessageHelper.ShowError("初始化边界修复界面异常" + ex.Message); | 
						|
            } | 
						|
        } | 
						|
        #region 目标图层切换事件 | 
						|
        private void targetName_SelectionChanged(object sender, System.Windows.RoutedEventArgs e) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                if (keys != null) | 
						|
                { | 
						|
                    IFeatureLayer featureLayer = keys[targetName.SelectedItem.ToTrim()]; | 
						|
                    if (featureLayer == null) return; | 
						|
                    SelectFeatureLayer = featureLayer; | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("targetName_SelectionChanged异常:" + ex.Message); | 
						|
                LogAPI.Debug("targetName_SelectionChanged异常:" + ex.StackTrace); | 
						|
            } | 
						|
        } | 
						|
        #endregion | 
						|
 | 
						|
        #region 关闭窗体事件 | 
						|
        private void BaseWindow_Closed(object sender, EventArgs e) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                this.Close(); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("BaseWindow_Closed异常:" + ex.Message); | 
						|
                LogAPI.Debug("BaseWindow_Closed异常:" + ex.StackTrace); | 
						|
            } | 
						|
        } | 
						|
        #endregion | 
						|
 | 
						|
        #region 确定 | 
						|
        private void btnOK_Click(object sender, System.Windows.RoutedEventArgs e) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                if (_engineEdit.EditState != esriEngineEditState.esriEngineStateEditing) | 
						|
                { | 
						|
                    MessageHelper.ShowTips("请先开启编辑."); | 
						|
                    return; | 
						|
                } | 
						|
                IFeatureLayer TargetLayer = (_engineEdit as EngineEditorClass).TargetLayer as IFeatureLayer; | 
						|
                if (SelectFeatureLayer == null || SelectFeatureLayer.FeatureClass == null || SelectFeatureLayer.FeatureClass.FeatureCount(null) == 0) | 
						|
                { | 
						|
                    MessageHelper.ShowTips("请选择正确的参考图层."); | 
						|
                    return; | 
						|
                } | 
						|
                IEnumFeature enumFeature = m_hookHelper.FocusMap.FeatureSelection as IEnumFeature; | 
						|
                enumFeature.Reset(); | 
						|
                IFeature featuer = null; | 
						|
                while ((featuer = enumFeature.Next()) != null) | 
						|
                { | 
						|
                    try | 
						|
                    { | 
						|
                        _engineEdit.StartOperation(); | 
						|
                        IGeometry geometry = ExecuteRepair1(featuer); | 
						|
                        ITopologicalOperator topological = geometry as ITopologicalOperator; | 
						|
                        if (topological == null) continue; | 
						|
                        if (!topological.IsKnownSimple) | 
						|
                            topological.Simplify(); | 
						|
                        #region 检查图形是否存在尖锐角/狭长图形等问题 | 
						|
                        IPoint point = null; | 
						|
                        IPolyline polyline = null; | 
						|
                        if (AECommonHelper.SharpAngleDataCheck(geometry, ref point, ref polyline)) | 
						|
                        { | 
						|
                            if (polyline != null && point != null) | 
						|
                            { | 
						|
                                IPoint point1 = new PointClass(); | 
						|
                                var DistanceAlongCurve = 0.0001; | 
						|
                                var distanceFromCurve = 0.0001; | 
						|
                                bool bRightSide = true; | 
						|
                                polyline.QueryPointAndDistance(esriSegmentExtension.esriNoExtension, point, false, point1, ref DistanceAlongCurve, ref distanceFromCurve, bRightSide); | 
						|
                                IPointCollection points = geometry as IPointCollection; | 
						|
                                var index = -1; | 
						|
                                for (int i = 0; i < points.PointCount - 1; i++) | 
						|
                                { | 
						|
                                    IPoint tPoint = points.Point[i]; | 
						|
                                    var refdistance = Math.Sqrt((point.X - tPoint.X) * (point.X - tPoint.X) + (point.Y - tPoint.Y) * (point.Y - tPoint.Y)); | 
						|
                                    if (refdistance == 0 || Math.Abs(refdistance) < (1e-5)) | 
						|
                                    { | 
						|
                                        index = i; break; | 
						|
                                    } | 
						|
                                } | 
						|
                                if (index > -1) | 
						|
                                { | 
						|
                                    points.UpdatePoint(index, point1); | 
						|
                                } | 
						|
                            } | 
						|
                            //_engineEdit.AbortOperation(); | 
						|
                            //MessageHelper.ShowTips("修复后存在尖锐角/狭长图形,需手动修改."); | 
						|
                            //return; | 
						|
                        } | 
						|
                        #endregion | 
						|
 | 
						|
                        #region MyRegion | 
						|
 | 
						|
                        if (TargetLayer != null) | 
						|
                        { | 
						|
                            List<IFeature> referenceFeatures = FeatureAPI.Identify2(geometry, TargetLayer); | 
						|
                            if (referenceFeatures.Count > 1) | 
						|
                            { | 
						|
                                foreach (IFeature referenceFeature in referenceFeatures) | 
						|
                                { | 
						|
                                    if (featuer.OID == referenceFeature.OID) continue; | 
						|
                                    IGeometry Erasegeometry = FeatureAPI.Difference(referenceFeature.ShapeCopy, geometry); | 
						|
                                    referenceFeature.Shape = Erasegeometry; | 
						|
                                    referenceFeature.Store(); | 
						|
                                } | 
						|
                            } | 
						|
                        } | 
						|
                        #endregion | 
						|
                        featuer.Shape = geometry; | 
						|
                        FeatureAPI.SplitMultipartFeature(new List<IFeature>() { featuer });//拆分多部件 | 
						|
                        featuer.Store(); | 
						|
                        _engineEdit.StopOperation("边界修复"); | 
						|
                        m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground, null, m_hookHelper.ActiveView.Extent); | 
						|
                        MessageHelper.ShowTips("修复完成."); | 
						|
                        return; | 
						|
                    } | 
						|
                    catch (Exception ex) | 
						|
                    { | 
						|
                        _engineEdit.AbortOperation(); | 
						|
                        throw ex; | 
						|
                    } | 
						|
                } | 
						|
                if (featuer == null) | 
						|
                { | 
						|
                    MessageHelper.ShowTips("请选择要修复的图斑."); | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("btnOK_Click异常:" + ex.Message); | 
						|
                LogAPI.Debug("btnOK_Click异常:" + ex.StackTrace); | 
						|
                MessageHelper.ShowError("边界修复异常:" + ex.Message); | 
						|
            } | 
						|
        } | 
						|
        #endregion | 
						|
 | 
						|
        #region 取消 | 
						|
        private void btnCancel1_Click(object sender, System.Windows.RoutedEventArgs e) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                this.Close(); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("btnCancel1_Click异常:" + ex.Message); | 
						|
                LogAPI.Debug("btnCancel1_Click异常:" + ex.StackTrace); | 
						|
            } | 
						|
        } | 
						|
        #endregion | 
						|
 | 
						|
        /// <summary> | 
						|
        /// 执行修复逻辑 | 
						|
        /// </summary> | 
						|
        /// <param name="feature"></param> | 
						|
        /// <returns></returns> | 
						|
        private IGeometry ExecuteRepair(IFeature feature) | 
						|
        { | 
						|
            IGeometry geometry = null; | 
						|
            try | 
						|
            { | 
						|
                #region 创建一个点图层 | 
						|
                IFeatureLayer Point_Layer = GeoDBAPI.CreateFeatureLayerInmemeory("Point_Layer", "点", (SelectFeatureLayer.FeatureClass as IGeoDataset).SpatialReference, esriGeometryType.esriGeometryPoint, SelectFeatureLayer.FeatureClass.Fields); | 
						|
                (Point_Layer.FeatureClass as ITable).DeleteSearchedRows(null); | 
						|
                IFeatureBuffer buf = Point_Layer.FeatureClass.CreateFeatureBuffer(); | 
						|
                IFeatureCursor T_Cursor = Point_Layer.FeatureClass.Insert(true); | 
						|
                #endregion | 
						|
 | 
						|
                geometry = feature.ShapeCopy; | 
						|
                Dictionary<int, IPoint> repairpoints = Kingo.PluginServiceInterface.Helper.LayerHelper.GetAllPoints(geometry); | 
						|
                List<IFeature> referenceFeatures = FeatureAPI.Identify2(geometry, SelectFeatureLayer); | 
						|
                Dictionary<int, IPoint> repairpoints1 = new Dictionary<int, IPoint>(); | 
						|
                if (referenceFeatures != null && referenceFeatures.Count > 0) | 
						|
                { | 
						|
                    foreach (var Identify in referenceFeatures) | 
						|
                    { | 
						|
                        List<IGeometry> referenceline = FeatureAPI.FeatureToLine(Identify); | 
						|
                        foreach (var line in referenceline) | 
						|
                        { | 
						|
                            if (line.GeometryType == esriGeometryType.esriGeometryPolyline) | 
						|
                            { | 
						|
                                Dictionary<int, IPoint> ReferencePoints = Kingo.PluginServiceInterface.Helper.LayerHelper.GetAllPoints(Identify.ShapeCopy); | 
						|
                                if (Point_Layer != null && Point_Layer.FeatureClass != null) | 
						|
                                    (Point_Layer.FeatureClass as ITable).DeleteSearchedRows(null); | 
						|
                                foreach (var item in ReferencePoints) | 
						|
                                { | 
						|
                                    buf.Shape = item.Value; | 
						|
                                    T_Cursor.InsertFeature(buf); | 
						|
                                } | 
						|
                                T_Cursor.Flush(); | 
						|
                                foreach (var point in repairpoints) | 
						|
                                { | 
						|
                                    if (repairpoints1.ContainsKey(point.Key)) continue; | 
						|
                                    List<IFeature> Points = FeatureAPI.Snapping(point.Value, new List<IFeatureLayer>() { Point_Layer }); | 
						|
                                    var mindistance = -0.1; | 
						|
                                    IPoint ReferencePoint = new PointClass(); | 
						|
                                    foreach (var point_temp in Points) | 
						|
                                    { | 
						|
                                        IPoint Point = point_temp.ShapeCopy as IPoint; | 
						|
                                        var refdistance = Math.Sqrt((point.Value.X - Point.X) * (point.Value.X - Point.X) + (point.Value.Y - Point.Y) * (point.Value.Y - Point.Y)); | 
						|
                                        if (mindistance == -0.1) | 
						|
                                        { | 
						|
                                            mindistance = refdistance; | 
						|
                                            ReferencePoint = Point; | 
						|
                                            continue; | 
						|
                                        } | 
						|
                                        if (refdistance < mindistance) | 
						|
                                        { | 
						|
                                            ReferencePoint = Point; | 
						|
                                            mindistance = refdistance; | 
						|
                                        } | 
						|
                                    } | 
						|
                                    if (mindistance < AttributeValue.Text.ToDouble() && mindistance != -0.1 && mindistance != 0) | 
						|
                                    { | 
						|
                                        IPointCollection points = geometry as IPointCollection; | 
						|
                                        points.UpdatePoint(point.Key, ReferencePoint); | 
						|
                                        //MapsManager.Instance.MapService.DrawGraph(ReferencePoint, true, 0, 0, 255); | 
						|
                                        if (!repairpoints1.ContainsKey(point.Key)) | 
						|
                                            repairpoints1.Add(point.Key, point.Value); | 
						|
                                        continue; | 
						|
                                    } | 
						|
                                    IPolyline polyline = line as IPolyline; | 
						|
                                    IPoint point1 = new PointClass(); | 
						|
                                    var DistanceAlongCurve = 0.0001; | 
						|
                                    var distanceFromCurve = 0.0001; | 
						|
                                    bool bRightSide = true; | 
						|
                                    polyline.QueryPointAndDistance(esriSegmentExtension.esriNoExtension, point.Value, false, point1, ref DistanceAlongCurve, ref distanceFromCurve, bRightSide); | 
						|
                                    var distance = Math.Sqrt((point.Value.X - point1.X) * (point.Value.X - point1.X) + (point.Value.Y - point1.Y) * (point.Value.Y - point1.Y)); | 
						|
                                    if (distance < AttributeValue.Text.ToDouble() && distance != 0) | 
						|
                                    { | 
						|
                                        IPointCollection points = geometry as IPointCollection; | 
						|
                                        points.UpdatePoint(point.Key, point1); | 
						|
                                        //MapsManager.Instance.MapService.DrawGraph(ReferencePoint, true, 0, 0, 255); | 
						|
                                        if (!repairpoints1.ContainsKey(point.Key)) | 
						|
                                            repairpoints1.Add(point.Key, point.Value); | 
						|
                                        continue; | 
						|
                                    } | 
						|
                                } | 
						|
                            } | 
						|
                        } | 
						|
                    } | 
						|
                    #region 使用参考图形,修复 | 
						|
                    if (true) | 
						|
                    { | 
						|
                        repairpoints1 = new Dictionary<int, IPoint>(); | 
						|
                        referenceFeatures = FeatureAPI.Identify2(geometry, SelectFeatureLayer); | 
						|
                        if (referenceFeatures != null && referenceFeatures.Count > 0) | 
						|
                        { | 
						|
                            foreach (var Identify in referenceFeatures) | 
						|
                            { | 
						|
                                repairpoints = Kingo.PluginServiceInterface.Helper.LayerHelper.GetAllPoints(Identify.ShapeCopy); | 
						|
                                List<IGeometry> referenceline = FeatureAPI.PolygonToLine(geometry); | 
						|
                                foreach (var line in referenceline) | 
						|
                                { | 
						|
                                    if (line.GeometryType == esriGeometryType.esriGeometryPolyline) | 
						|
                                    { | 
						|
                                        Dictionary<int, IPoint> ReferencePoints = Kingo.PluginServiceInterface.Helper.LayerHelper.GetAllPoints(geometry); | 
						|
                                        if (Point_Layer != null && Point_Layer.FeatureClass != null) | 
						|
                                            (Point_Layer.FeatureClass as ITable).DeleteSearchedRows(null); | 
						|
                                        foreach (var item in ReferencePoints) | 
						|
                                        { | 
						|
                                            buf.Shape = item.Value; | 
						|
                                            T_Cursor.InsertFeature(buf); | 
						|
                                        } | 
						|
                                        T_Cursor.Flush(); | 
						|
                                        foreach (var point in repairpoints) | 
						|
                                        { | 
						|
                                            if (repairpoints1.ContainsKey(point.Key)) continue; | 
						|
                                            List<IFeature> Points = FeatureAPI.Snapping(point.Value, new List<IFeatureLayer>() { Point_Layer }); | 
						|
                                            if (Points.Count == 0) continue; | 
						|
                                            var mindistance = -0.1; | 
						|
                                            IPoint ReferencePoint = new PointClass(); | 
						|
                                            foreach (var point_temp in Points) | 
						|
                                            { | 
						|
                                                IPoint Point = point_temp.ShapeCopy as IPoint; | 
						|
                                                var refdistance = Math.Sqrt((point.Value.X - Point.X) * (point.Value.X - Point.X) + (point.Value.Y - Point.Y) * (point.Value.Y - Point.Y)); | 
						|
                                                if (mindistance == -0.1) | 
						|
                                                { | 
						|
                                                    mindistance = refdistance; | 
						|
                                                    ReferencePoint = Point; | 
						|
                                                    continue; | 
						|
                                                } | 
						|
                                                if (refdistance < mindistance) | 
						|
                                                { | 
						|
                                                    ReferencePoint = Point; | 
						|
                                                    mindistance = refdistance; | 
						|
                                                } | 
						|
                                            } | 
						|
                                            if (mindistance == 0) continue; | 
						|
                                            if (mindistance < AttributeValue.Text.ToDouble() && mindistance != -0.1 && mindistance != 0) | 
						|
                                            { | 
						|
                                                IPointCollection points = geometry as IPointCollection; | 
						|
                                                int index = -1; | 
						|
                                                foreach (var item in ReferencePoints) | 
						|
                                                { | 
						|
                                                    if (FeatureAPI.GetEqual(item.Value, ReferencePoint)) | 
						|
                                                    { | 
						|
                                                        index = item.Key; break; | 
						|
                                                    } | 
						|
                                                } | 
						|
                                                if (index == -1) continue; | 
						|
                                                points.UpdatePoint(index, ReferencePoint); | 
						|
                                                if (!repairpoints1.ContainsKey(point.Key)) | 
						|
                                                    repairpoints1.Add(point.Key, point.Value); | 
						|
                                                continue; | 
						|
                                            } | 
						|
                                        } | 
						|
                                    } | 
						|
                                } | 
						|
                            } | 
						|
                        } | 
						|
                    } | 
						|
                    #endregion | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("执行ExecuteRepair异常:" + ex.Message + ex.StackTrace); | 
						|
                return geometry; | 
						|
            } | 
						|
            return geometry; | 
						|
        } | 
						|
 | 
						|
        /// <summary> | 
						|
        /// 执行修复逻辑 | 
						|
        /// </summary> | 
						|
        /// <param name="feature"></param> | 
						|
        /// <returns></returns> | 
						|
        private IGeometry ExecuteRepair1(IFeature feature) | 
						|
        { | 
						|
            IGeometry geometry = null; | 
						|
            try | 
						|
            { | 
						|
                geometry = feature.ShapeCopy; | 
						|
                List<IPoint> repairpoints = Kingo.PluginServiceInterface.Helper.LayerHelper.GetMultipleRingPoints(geometry); | 
						|
                var count = 0; | 
						|
                foreach (var point in repairpoints) | 
						|
                { | 
						|
                    count++; | 
						|
                    if (count == 34) | 
						|
                    { | 
						|
 | 
						|
                    } | 
						|
                    var UpdatePoint = GetSnappingpoint(point, SelectFeatureLayer); | 
						|
                    if (UpdatePoint.Count == 0) | 
						|
                    { | 
						|
                        UpdatePoint = GetSnappingpoint(point, (_engineEdit as EngineEditorClass).TargetLayer as IFeatureLayer); | 
						|
                    } | 
						|
                    var Listpoint = UpdatePoint.OrderByDescending(x => x.Value).ToList(); | 
						|
                    IPoint moveToPoint = null; | 
						|
                    if (Listpoint.Count > 0) | 
						|
                    { | 
						|
                        #region 共点个数相同的情况下,取距离最近的点 | 
						|
                        var GroupBy = Listpoint.GroupBy(x => x.Value).ToList(); | 
						|
                        if (Listpoint.Count > 1) | 
						|
                        { | 
						|
                            double refdistance = -1; | 
						|
                            double mindistance = -1; | 
						|
                            var index = -1; | 
						|
                            for (int i = 0; i < Listpoint.Count; i++) | 
						|
                            { | 
						|
                                refdistance = Math.Sqrt((point.X - Listpoint[i].Key.X) * (point.X - Listpoint[i].Key.X) + (point.Y - Listpoint[i].Key.Y) * (point.Y - Listpoint[i].Key.Y)); | 
						|
                                if (mindistance == -1) | 
						|
                                { | 
						|
                                    mindistance = refdistance; | 
						|
                                    index = i; | 
						|
                                } | 
						|
                                else if (refdistance < mindistance) | 
						|
                                { | 
						|
                                    mindistance = refdistance; | 
						|
                                    index = i; | 
						|
                                } | 
						|
                            } | 
						|
                            if (index != -1) | 
						|
                            { | 
						|
                                moveToPoint = Listpoint[index].Key; | 
						|
                                Listpoint.RemoveAt(index); | 
						|
                            } | 
						|
                        } | 
						|
                        else | 
						|
                        { | 
						|
                            moveToPoint = Listpoint[0].Key; | 
						|
                            Listpoint.RemoveAt(0); | 
						|
                        } | 
						|
                        #endregion | 
						|
                    } | 
						|
                    if (moveToPoint != null) | 
						|
                    { | 
						|
                        IPointCollection points = geometry as IPointCollection; | 
						|
                        var index = -1; | 
						|
                        for (int i = 0; i < points.PointCount - 1; i++) | 
						|
                        { | 
						|
                            IPoint tPoint = points.Point[i]; | 
						|
                            var refdistance = Math.Sqrt((point.X - tPoint.X) * (point.X - tPoint.X) + (point.Y - tPoint.Y) * (point.Y - tPoint.Y)); | 
						|
                            if (refdistance == 0 || Math.Abs(refdistance) < (1e-5)) | 
						|
                            { | 
						|
                                index = i; break; | 
						|
                            } | 
						|
                        } | 
						|
                        if (index > -1) | 
						|
                        { | 
						|
                            points.UpdatePoint(index, moveToPoint); | 
						|
                        } | 
						|
                        //IHitTest iHitTest = geometry as IHitTest; | 
						|
                        //double hitDist = 0; int partIndex = 0; int vertexIndex = -1; bool bRightSide = false; | 
						|
                        //IPoint iHitPt = new ESRI.ArcGIS.Geometry.Point(); | 
						|
                        //if (iHitTest.HitTest(point, Convert.ToDouble(AttributeValue.Text.ToString()), esriGeometryHitPartType.esriGeometryPartVertex, | 
						|
                        //    iHitPt, ref hitDist, ref partIndex, ref vertexIndex, ref bRightSide)) | 
						|
                        //{ | 
						|
                        //    if (vertexIndex > -1) | 
						|
                        //        points.UpdatePoint(vertexIndex, moveToPoint); | 
						|
                        //} | 
						|
                        List<MovePointStruct> firstSnapPointList = Snapping(point, (_engineEdit as EngineEditorClass).TargetLayer as IFeatureLayer); | 
						|
                        if (firstSnapPointList != null && firstSnapPointList.Count > 1) | 
						|
                        { | 
						|
                            foreach (var item in firstSnapPointList) | 
						|
                            { | 
						|
                                IGeometryCollection collection = item.Geometry as IGeometryCollection; | 
						|
                                IGeometry geo = collection.get_Geometry(item.PartIndex); | 
						|
                                points = geo as IPointCollection; | 
						|
                                IPoint pt = points.get_Point(item.VertexIndex); | 
						|
                                points.UpdatePoint(item.VertexIndex, moveToPoint); | 
						|
                                item.Feature.Shape = item.Geometry; | 
						|
                                item.Feature.Store(); | 
						|
                            } | 
						|
                        } | 
						|
                    } | 
						|
                    if (Listpoint.Count > 0) | 
						|
                    { | 
						|
                        List<IGeometry> referenceline = FeatureAPI.PolygonToLine(geometry); | 
						|
                        foreach (var line in referenceline) | 
						|
                        { | 
						|
                            if (line.GeometryType == esriGeometryType.esriGeometryPolyline) | 
						|
                            { | 
						|
                                bool SplitHappened; | 
						|
                                int newPartIndex; | 
						|
                                int newSegmentIndex; | 
						|
                                for (int i = 0; i < Listpoint.Count; i++) | 
						|
                                { | 
						|
                                    if (Listpoint[i].Value > 1) | 
						|
                                    { | 
						|
                                        IPolyline polyline = line as IPolyline; | 
						|
                                        IPoint point1 = new PointClass(); | 
						|
                                        var DistanceAlongCurve = 0.0001; | 
						|
                                        var distanceFromCurve = 0.0001; | 
						|
                                        bool bRightSide = true; | 
						|
                                        polyline.QueryPointAndDistance(esriSegmentExtension.esriNoExtension, Listpoint[i].Key, false, point1, ref DistanceAlongCurve, ref distanceFromCurve, bRightSide); | 
						|
                                        var distance = Math.Sqrt((Listpoint[i].Key.X - point1.X) * (Listpoint[i].Key.X - point1.X) + (Listpoint[i].Key.Y - point1.Y) * (Listpoint[i].Key.Y - point1.Y)); | 
						|
                                        if (distance > 0.1 || distance < 0.0001) | 
						|
                                        { | 
						|
                                            continue; | 
						|
                                        } | 
						|
                                        (line as IPolyline).SplitAtPoint(Listpoint[i].Key, true, true, out SplitHappened, out newPartIndex, out newSegmentIndex); | 
						|
                                        geometry = ConstructPolygonFromPolyline((line as IPolyline)); | 
						|
                                    } | 
						|
                                } | 
						|
                            } | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
                #region 判断当前图斑是否压盖多个图斑且存在碎图斑 | 
						|
                var Identify2 = FeatureAPI.Identify2(geometry, SelectFeatureLayer); | 
						|
                if (Identify2 != null && Identify2.Count > 1) | 
						|
                { | 
						|
                    foreach (var feature1 in Identify2) | 
						|
                    { | 
						|
                        var geo = FeatureAPI.InterSect(geometry, feature1.ShapeCopy); | 
						|
                        if (geo.GetEllipseArea() < 0.1) | 
						|
                        { | 
						|
                            geometry = FeatureAPI.Difference(geometry, geo); | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
                #endregion | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("执行ExecuteRepair异常:" + ex.Message + ex.StackTrace); | 
						|
                return geometry; | 
						|
            } | 
						|
            return geometry; | 
						|
        } | 
						|
 | 
						|
        /// <summary> | 
						|
        /// 捕捉 | 
						|
        /// </summary> | 
						|
        /// <param name="x"></param> | 
						|
        /// <param name="y"></param> | 
						|
        /// <param name="iFeatureLyr"></param> | 
						|
        /// <param name="axMapControl1"></param> | 
						|
        /// <returns></returns> | 
						|
        private List<MovePointStruct> Snapping(IPoint point, IFeatureLayer m_featureLayer) | 
						|
        { | 
						|
            double tol = 0.1; | 
						|
            ITopologicalOperator pTopo = point as ITopologicalOperator; | 
						|
            IGeometry pGeometry = pTopo.Buffer(tol).Envelope as IGeometry; | 
						|
            IIdentify indentify = m_featureLayer as IIdentify; | 
						|
            if (indentify == null) | 
						|
                return null; | 
						|
            IArray pIDs = indentify.Identify(pGeometry); | 
						|
            if (pIDs == null || pIDs.Count == 0) | 
						|
                return null; | 
						|
            List<MovePointStruct> pointList = new List<MovePointStruct>(); | 
						|
            for (int index = 0; index < pIDs.Count; index++) | 
						|
            { | 
						|
                IFeatureIdentifyObj pFeatIdObj = pIDs.get_Element(index) as IFeatureIdentifyObj; | 
						|
                IRowIdentifyObject pRowObj = pFeatIdObj as IRowIdentifyObject; | 
						|
                IFeature iF = pRowObj.Row as IFeature; | 
						|
                IPoint iHitPt = new ESRI.ArcGIS.Geometry.Point(); | 
						|
                IHitTest iHitTest = iF.Shape as IHitTest; | 
						|
                double hitDist = 0; | 
						|
                int partIndex = 0; | 
						|
                int vertexIndex = 0; | 
						|
                bool bRightSide = false; | 
						|
                if (iHitTest.HitTest(point, tol, esriGeometryHitPartType.esriGeometryPartVertex, | 
						|
                    iHitPt, ref hitDist, ref partIndex, ref vertexIndex, ref bRightSide)) | 
						|
                { | 
						|
                    point = iHitPt; | 
						|
                    pointList.Add(new MovePointStruct() | 
						|
                    { | 
						|
                        Feature = iF, | 
						|
                        Geometry = iF.Shape, | 
						|
                        PartIndex = partIndex, | 
						|
                        VertexIndex = vertexIndex | 
						|
                    }); | 
						|
                } | 
						|
            } | 
						|
            this.m_hookHelper.ActiveView.Refresh(); | 
						|
            return pointList; | 
						|
        } | 
						|
 | 
						|
        /// <summary> | 
						|
        /// GetpointDic | 
						|
        /// </summary> | 
						|
        /// <param name="x"></param> | 
						|
        /// <param name="y"></param> | 
						|
        /// <param name="iFeatureLyr"></param> | 
						|
        /// <param name="axMapControl1"></param> | 
						|
        /// <returns></returns> | 
						|
        private Dictionary<IPoint, int> GetSnappingpoint(IPoint point, IFeatureLayer m_featureLayer) | 
						|
        { | 
						|
            Dictionary<IPoint, int> pointList = new Dictionary<IPoint, int>(); | 
						|
            try | 
						|
            { | 
						|
                double tol = Convert.ToDouble(AttributeValue.Text.ToString()); | 
						|
                ITopologicalOperator pTopo = point as ITopologicalOperator; | 
						|
                IGeometry pGeometry = pTopo.Buffer(tol).Envelope as IGeometry; | 
						|
                IIdentify indentify = m_featureLayer as IIdentify; | 
						|
                if (indentify == null) | 
						|
                    return null; | 
						|
                IArray pIDs = indentify.Identify(pGeometry); | 
						|
                if (pIDs == null || pIDs.Count == 0) | 
						|
                    return null; | 
						|
                for (int index = 0; index < pIDs.Count; index++) | 
						|
                { | 
						|
                    IFeatureIdentifyObj pFeatIdObj = pIDs.get_Element(index) as IFeatureIdentifyObj; | 
						|
                    IRowIdentifyObject pRowObj = pFeatIdObj as IRowIdentifyObject; | 
						|
                    IFeature iF = pRowObj.Row as IFeature; | 
						|
                    IPoint iHitPt = new ESRI.ArcGIS.Geometry.Point(); | 
						|
                    IHitTest iHitTest = iF.Shape as IHitTest; | 
						|
                    double hitDist = 0; | 
						|
                    int partIndex = 0; | 
						|
                    int vertexIndex = 0; | 
						|
                    bool bRightSide = false; | 
						|
                    if (iHitTest.HitTest(point, tol, esriGeometryHitPartType.esriGeometryPartVertex, | 
						|
                        iHitPt, ref hitDist, ref partIndex, ref vertexIndex, ref bRightSide)) | 
						|
                    { | 
						|
                        //point = iHitPt; | 
						|
                        IPolyline tempLine = new PolylineClass(); | 
						|
                        tempLine.FromPoint = iHitPt; | 
						|
                        bool isExit = false; | 
						|
                        foreach (var tempPoint in pointList.Keys) | 
						|
                        { | 
						|
                            tempLine.ToPoint = tempPoint; | 
						|
                            if (tempLine.Length < 0.001) isExit = true; | 
						|
                        } | 
						|
                        if (!isExit) | 
						|
                        { | 
						|
                            IArray pTempIDs = indentify.Identify(iHitPt); | 
						|
                            int num = 0; | 
						|
                            for (int i = 0; i < pTempIDs.Count; i++) | 
						|
                            { | 
						|
                                pFeatIdObj = pTempIDs.get_Element(i) as IFeatureIdentifyObj; | 
						|
                                pRowObj = pFeatIdObj as IRowIdentifyObject; | 
						|
                                iHitTest = ((pRowObj.Row as IFeature).Shape) as IHitTest; | 
						|
                                if (iHitTest.HitTest(iHitPt, 0.0001, esriGeometryHitPartType.esriGeometryPartVertex, | 
						|
                            iHitPt, ref hitDist, ref partIndex, ref vertexIndex, ref bRightSide)) | 
						|
                                { | 
						|
                                    num++; | 
						|
                                } | 
						|
                            } | 
						|
                            pointList.Add(iHitPt, num); | 
						|
                        } | 
						|
                    } | 
						|
                    else | 
						|
                    if (iHitTest.HitTest(point, tol, esriGeometryHitPartType.esriGeometryPartBoundary, iHitPt, ref hitDist, ref partIndex, ref vertexIndex, ref bRightSide)) | 
						|
                    { | 
						|
                        //取距离boundary最近的点 | 
						|
                        IGeometryCollection collection = iF.ShapeCopy as IGeometryCollection; | 
						|
                        IGeometry geo = collection.get_Geometry(partIndex); | 
						|
                        ISegmentCollection points = geo as ISegmentCollection; | 
						|
                        ISegment pt = points.Segment[vertexIndex]; | 
						|
                        IPoint point1 = new PointClass(); | 
						|
                        var DistanceAlongCurve = 0.0001; | 
						|
                        var distanceFromCurve = 0.0001; | 
						|
                        bRightSide = true; | 
						|
                        pt.QueryPointAndDistance(esriSegmentExtension.esriNoExtension, point, false, point1, ref DistanceAlongCurve, ref distanceFromCurve, bRightSide); | 
						|
 | 
						|
                        IPolyline tempLine = new PolylineClass(); | 
						|
                        tempLine.FromPoint = iHitPt; | 
						|
                        bool isExit = false; | 
						|
                        foreach (var tempPoint in pointList.Keys) | 
						|
                        { | 
						|
                            tempLine.ToPoint = tempPoint; | 
						|
                            if (tempLine.Length < 0.001) isExit = true; | 
						|
                        } | 
						|
                        if (!isExit) | 
						|
                        { | 
						|
                            pointList.Add(point1, 1); | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug($"GetSnappingpoint异常:{ex.Message + ex.StackTrace}"); | 
						|
            } | 
						|
            return pointList; | 
						|
        } | 
						|
 | 
						|
        /// <summary> | 
						|
        /// 线转面 | 
						|
        /// </summary> | 
						|
        /// <param name="pPolyline">线对象</param> | 
						|
        /// <returns>IGeometry 面对象</returns> | 
						|
        public static IGeometry ConstructPolygonFromPolyline(IPolyline pPolyline) | 
						|
        { | 
						|
            IGeometry newGeometry = null; | 
						|
            try | 
						|
            { | 
						|
                IGeometryCollection pPolygonGeoCol = new PolygonClass(); | 
						|
                if (pPolyline == null || pPolyline.IsEmpty) | 
						|
                { | 
						|
                    return pPolygonGeoCol as IGeometry; | 
						|
                } | 
						|
                IGeometryCollection pPolylineGeoCol = pPolyline as IGeometryCollection; | 
						|
                ISegmentCollection pSegCol = new RingClass(); | 
						|
                ISegment pSegment = null; | 
						|
                object missing = Type.Missing; | 
						|
                for (int i = 0; i < pPolylineGeoCol.GeometryCount; i++) | 
						|
                { | 
						|
                    ISegmentCollection pPolylineSegCol = pPolylineGeoCol.get_Geometry(i) as ISegmentCollection; | 
						|
                    for (int j = 0; j < pPolylineSegCol.SegmentCount; j++) | 
						|
                    { | 
						|
                        pSegment = pPolylineSegCol.get_Segment(j); | 
						|
                        pSegCol.AddSegment(pSegment, ref missing, ref missing); | 
						|
                    } | 
						|
                    pPolygonGeoCol.AddGeometry(pSegCol as IGeometry, ref missing, ref missing); | 
						|
                } | 
						|
                newGeometry = pPolygonGeoCol as IGeometry; | 
						|
                if (newGeometry != null && !newGeometry.IsEmpty) | 
						|
                { | 
						|
                    ITopologicalOperator topologicalOperator = newGeometry as ITopologicalOperator; | 
						|
                    if (!topologicalOperator.IsKnownSimple) | 
						|
                    { | 
						|
                        topologicalOperator.Simplify(); | 
						|
                    } | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                throw ex; | 
						|
            } | 
						|
            return newGeometry; | 
						|
        } | 
						|
    } | 
						|
}
 | 
						|
 |