using ESRI.ArcGIS.Geometry; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace KGIS.PlatformPlugin.Commands.Tools.TraceTool { public static class PointEx { public static bool IsSamePoint(this IPoint pPoint, IPoint pPointCompare, double dTolerance = 0.001) { if (pPoint != null && pPointCompare != null) { IProximityOperator proximityOperator = pPoint as IProximityOperator; double num = proximityOperator.ReturnDistance(pPointCompare); return num <= 0.001; } return false; } public static bool IsOnLine(this IPoint pPoint, System.Collections.Generic.List listLines) { if (pPoint != null && listLines != null && listLines.Count >= 1) { int count = listLines.Count; for (int i = 0; i < count; i++) { IRelationalOperator relationalOperator = listLines[i] as IRelationalOperator; if (relationalOperator != null && (relationalOperator.Contains(pPoint) || relationalOperator.Touches(pPoint))) { return true; } } return false; } return false; } public static bool IsOnLine(this IPoint pPoint, IPolyline pPolyline) { if (pPoint != null && pPolyline != null) { IRelationalOperator relationalOperator = pPolyline as IRelationalOperator; return relationalOperator != null && (relationalOperator.Contains(pPoint) || relationalOperator.Touches(pPoint)); } return false; } public static bool IsOnRing(this IPoint pPoint, IPolygon pPolygon) { if (pPoint != null && pPolygon != null) { ITopologicalOperator topologicalOperator = pPolygon as ITopologicalOperator; IGeometry boundary = topologicalOperator.Boundary; IRelationalOperator relationalOperator = boundary as IRelationalOperator; return relationalOperator != null && (relationalOperator.Contains(pPoint) || relationalOperator.Touches(pPoint)); } return false; } public static bool IsInGeometry(this IPoint pPoint, IGeometry pGeometry) { if (pPoint != null && pGeometry != null) { IRelationalOperator relationalOperator = pGeometry as IRelationalOperator; return relationalOperator != null && (relationalOperator.Contains(pPoint) || relationalOperator.Touches(pPoint)); } return false; } public static IPoint[] Explode(this IMultipoint iMultiPoint) { IPoint[] array = null; IPointCollection pointCollection = iMultiPoint as IPointCollection; int pointCount = pointCollection.PointCount; if (pointCount != 1) { if (pointCount > 1) { array = new IPoint[pointCount]; for (int i = 0; i < pointCount; i++) { array[i] = new PointClass(); IPoint point = pointCollection.get_Point(i); array[i].X = point.X; array[i].Y = point.Y; } } return array; } return new IPoint[] { iMultiPoint as IPoint }; } } }