年度变更建库软件5.0版本
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.

101 lines
3.7 KiB

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 PointCollectionEx
{
public static System.Collections.Generic.Dictionary<int, System.Collections.Generic.List<IPoint>> Sort(this IPointCollection pPointCollection, IPoint pPointRelation)
{
if (pPointCollection == null)
{
return null;
}
int num = 1;
System.Collections.Generic.Dictionary<int, System.Collections.Generic.List<IPoint>> dictionary = new System.Collections.Generic.Dictionary<int, System.Collections.Generic.List<IPoint>>();
System.Collections.Generic.List<IPoint> list = new System.Collections.Generic.List<IPoint>();
int i = 0;
int pointCount = pPointCollection.PointCount;
while (i < pointCount)
{
IPoint point = pPointCollection.get_Point(i);
if (list.Count > 0 && point.IsSamePoint(list[0], 0.001))
{
dictionary.Add(num, list);
list = new System.Collections.Generic.List<IPoint>();
num++;
}
else
{
list.Add(point);
}
i++;
}
int j = 1;
int count = dictionary.Count;
while (j <= count)
{
System.Collections.Generic.List<double> list2 = new System.Collections.Generic.List<double>();
list = dictionary[j];
int num2 = 0;
while (list.Count > num2)
{
IPoint other = list[num2];
double item = (pPointRelation as IProximityOperator).ReturnDistance(other);
list2.Add(item);
num2++;
}
int num3 = list2.IndexOf(list2.Min());
System.Collections.Generic.List<IPoint> list3 = new System.Collections.Generic.List<IPoint>();
int k = 0;
int count2 = list.Count;
while (k < count2)
{
int index;
if (k + num3 >= count2)
{
index = k + num3 - count2;
}
else
{
index = k + num3;
}
list3.Add(list[index]);
k++;
}
dictionary.Remove(j);
dictionary.Add(j, list3);
j++;
}
return dictionary;
}
public static int GetLongestLineSegmentStartPoint(this IPointCollection pPointCollection)
{
if (pPointCollection != null && pPointCollection.PointCount >= 2)
{
int result = -1;
double num = 0.0;
int i = 0;
int pointCount = pPointCollection.PointCount;
while (i < pointCount - 1)
{
IProximityOperator proximityOperator = pPointCollection.get_Point(i) as IProximityOperator;
IPoint other = pPointCollection.get_Point(i + 1);
double num2 = proximityOperator.ReturnDistance(other);
if (num < num2)
{
num = num2;
result = i;
}
i++;
}
return result;
}
return -1;
}
}
}