我正在尝试提高一种方法的性能,该方法将点从一个坐标系重新投影到另一个坐标系。
List<Point> Reproject(List<Point> points, string sourceProjection, string destinationProjection)
为了进行坐标转换,我们将点传递到第 3 方库 (FME)。我目前想要实现的是获取点的输入列表,仅从该列表中选择不同的点,仅将这些点传递到转换引擎,然后重建原始列表并将其返回给客户端。
我的基本计划是使用 aDictionary<Point, int>
来获取所有不同的点并为它们分配一个索引,然后用索引重建原始列表。这是我为测试这种行为而编写的一些粗略代码:
var distinctPoints = new Dictionary<Point, int>();
var distinctPointsMapping = new Dictionary<int, int>();
var pointNumber = 0;
var distinctPointNumber = 0;
foreach (var point in points)
{
if (distinctPoints.ContainsKey(point))
{
distinctPointsMapping.Add(pointNumber, distinctPoints[point]);
}
else
{
distinctPoints.Add(point, distinctPointNumber);
distinctPointsMapping.Add(pointNumber, distinctPointNumber);
distinctPointNumber++;
}
pointNumber++;
}
Console.WriteLine("From an input of {0} points, I found {1} distinct points.", points.Count, distinctPointNumber);
var transformedPoints = new Point[distinctPointNumber]; // replace this with the call to the FME transformer
var returnVal = new List<Point>(points.Count);
pointNumber = 0;
foreach (var untransformedPoint in points)
{
var transformedPoint = transformedPoints[distinctPointsMapping[pointNumber]];
returnVal.Add(transformedPoint);
pointNumber++;
}
return returnVal;
我目前遇到的问题是在执行超过 8M 点时出现 OutOfMemoryException。我想知道是否有更好的方法来做到这一点?