|
|
|
|
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<IPolyline> 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
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|