private async Task <List <ILineString> > ProlongLinesAccordingToOriginalGpx(List <ILineString> linesToProlong, List <ILineString> gpxItmLines) { var originalCoordinates = gpxItmLines.SelectMany(l => l.Coordinates).ToArray(); var prolongInputs = new List <GpxProlongerExecutorInput>(); var filteredOriginalCoordinates = new List <Coordinate>(); foreach (var coordinate in originalCoordinates) { if (linesToProlong.Any(l => l.Distance(new Point(coordinate)) < _options.MaxProlongLineLength)) { filteredOriginalCoordinates.Add(coordinate); if (!ReferenceEquals(coordinate, originalCoordinates.Last())) { continue; } } var coordinates = filteredOriginalCoordinates.ToArray(); if (coordinates.Length < 2) { continue; } prolongInputs.Insert(0, new GpxProlongerExecutorInput { OriginalCoordinates = coordinates, ExistingItmHighways = await GetExistingCloseLines(new List <ILineString> { _geometryFactory.CreateLineString(coordinates) }), MinimalDistance = _options.MaxDistanceToExisitngLineForMerge, MinimalAreaSize = _options.MinimalAreaSize }); filteredOriginalCoordinates.Clear(); } foreach (var input in prolongInputs) { input.LinesToProlong = linesToProlong; linesToProlong = _gpxProlongerExecutor.Prolong(input); } return(linesToProlong); }
public void Prolong_ClosingSelfLargeArea_ShouldProlong() { var lineToProlong = new LineString(new[] { new Coordinate(500, 0), new Coordinate(600, 0), new Coordinate(600, -10), new Coordinate(600, -20), new Coordinate(500, -20), new Coordinate(400, -20), new Coordinate(400, -10), new Coordinate(400, 0), new Coordinate(400, 10) }); var originlaCoordinates = new[] { new Coordinate(0, 0), new Coordinate(100, 0), new Coordinate(200, 0), new Coordinate(300, 0), new Coordinate(401, 0), new Coordinate(500, 0), new Coordinate(600, 0), new Coordinate(600, -10), new Coordinate(600, -20), new Coordinate(500, -20), new Coordinate(400, -20), new Coordinate(400, -10), new Coordinate(400, 0), new Coordinate(400, 10) }; var existingLines = new List <LineString>(); var input = new GpxProlongerExecutorInput { LinesToProlong = new List <ILineString> { lineToProlong }, OriginalCoordinates = originlaCoordinates, ExistingItmHighways = existingLines, MinimalDistance = 2, MinimalAreaSize = 1000 }; var results = _executor.Prolong(input); Assert.AreEqual(1, results.Count); Assert.AreEqual(lineToProlong.Coordinates.Last(), results.First().Coordinates.Last()); Assert.AreEqual(lineToProlong.Coordinates[7], results.First().Coordinates.First()); }