示例#1
0
        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);
        }
示例#2
0
        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());
        }