Esempio n. 1
0
        public override async Task <ExtendRouteResponseMessage> ExtendRoute(ExtendRouteRequestMessage request, ServerCallContext context)
        {
            var mediatorRequest  = new ExtendRouteQuery(request.Tracks.Select(x => convertTrack(x)).ToList(), request.Step);
            var mediatorResponse = await mediator.Send(mediatorRequest);

            var result = new ExtendRouteResponseMessage();

            result.Tracks.AddRange(mediatorResponse.Select(x => convertTrack(x)));
            return(result);
        }
Esempio n. 2
0
        public Task <List <Track> > Handle(ExtendRouteQuery request, CancellationToken cancellationToken)
        {
            List <Track> resultTracks     = new List <Track>();
            List <Coord> finalTrackCoords = new List <Coord>();
            List <Coord> points           = new List <Coord>();
            double       step             = request.Step;

            foreach (var track in request.Tracks)
            {
                cancellationToken.ThrowIfCancellationRequested();

                finalTrackCoords.Clear();

                for (int i = 0; i < track.Count - 1; i++)
                {
                    Coord p1 = track[i], p2 = track[i + 1];
                    bool  backDirection = false;
                    if (p1.Lat > p2.Lat)
                    {
                        backDirection = true;
                        p1            = p2;
                        p2            = track[i];
                    }

                    double a = (p1.Long - p2.Long) / (p1.Lat - p2.Lat);
                    double b = p2.Long - p2.Lat * a;

                    points.Clear();
                    for (double j = p1.Lat + step; j < p2.Lat; j += step)
                    {
                        double y = a * j + b;
                        points.Add(new Coord(j, y));
                    }
                    if (backDirection)
                    {
                        points.Reverse();
                        finalTrackCoords.Add(p2);
                    }
                    else
                    {
                        finalTrackCoords.Add(p1);
                    }

                    finalTrackCoords.AddRange(points);
                }

                resultTracks.Add(new Track(finalTrackCoords));
            }

            return(Task.FromResult(resultTracks));
        }