private Task MergeRoutes()

in Source/Requests/RouteRequest.cs [406:498]


        private Task<Route> MergeRoutes(Route[] routes)
        {
            return Task<Route>.Run(() =>
            {
                if (routes.Length > 0)
                {
                    var mergedRoute = routes[0];

                    for (var i = 1; i < routes.Length; i++)
                    {
                        if (routes[i] != null)
                        {
                            mergedRoute.Id = null;

                            if (mergedRoute.BoundingBox != null)
                            {
                                if (routes[i].BoundingBox != null)
                                {
                                    mergedRoute.BoundingBox[0] = Math.Min(mergedRoute.BoundingBox[0], routes[i].BoundingBox[0]);
                                    mergedRoute.BoundingBox[1] = Math.Min(mergedRoute.BoundingBox[1], routes[i].BoundingBox[1]);
                                    mergedRoute.BoundingBox[2] = Math.Max(mergedRoute.BoundingBox[2], routes[i].BoundingBox[2]);
                                    mergedRoute.BoundingBox[3] = Math.Max(mergedRoute.BoundingBox[3], routes[i].BoundingBox[3]);
                                }
                            }
                            else
                            {
                                mergedRoute.BoundingBox = routes[i].BoundingBox;
                            }

                            int routePathOffset = (mergedRoute.RoutePath != null) ? mergedRoute.RoutePath.Line.Coordinates.Length : 0;

                            //Merge the route legs.
                            var legs = mergedRoute.RouteLegs;

                            //Loop through each leg and offset path indicies to align with merged path.
                            for (var j = 0; j < routes[i].RouteLegs.Length; j++)
                            {
                                if (routes[i].RouteLegs[j].ItineraryItems != null)
                                {
                                    for (var k = 0; k < routes[i].RouteLegs[j].ItineraryItems.Length; k++)
                                    {
                                        for (var l = 0; l < routes[i].RouteLegs[j].ItineraryItems[k].Details.Length; l++)
                                        {
                                            for (var m = 0; m < routes[i].RouteLegs[j].ItineraryItems[k].Details[l].EndPathIndices.Length; m++)
                                            {
                                                routes[i].RouteLegs[j].ItineraryItems[k].Details[l].EndPathIndices[m] += routePathOffset;
                                            }

                                            for (var m = 0; m < routes[i].RouteLegs[j].ItineraryItems[k].Details[l].StartPathIndices.Length; m++)
                                            {
                                                routes[i].RouteLegs[j].ItineraryItems[k].Details[l].StartPathIndices[m] += routePathOffset;
                                            }
                                        }
                                    }
                                }

                                for (var k = 0; k < routes[i].RouteLegs[j].RouteSubLegs.Length; k++)
                                {
                                    routes[i].RouteLegs[j].RouteSubLegs[k].EndWaypoint.RoutePathIndex += routePathOffset;
                                    routes[i].RouteLegs[j].RouteSubLegs[k].StartWaypoint.RoutePathIndex += routePathOffset;
                                }
                            }

                            mergedRoute.RouteLegs = mergedRoute.RouteLegs.Concat(routes[i].RouteLegs).ToArray();

                            if (mergedRoute.RoutePath != null)
                            {
                                if (routes[i].RoutePath != null)
                                {
                                    mergedRoute.RoutePath.Line.Coordinates[0] = mergedRoute.RoutePath.Line.Coordinates[0].Concat(routes[i].RoutePath.Line.Coordinates[0]).ToArray();
                                }
                            }
                            else
                            {
                                mergedRoute.RoutePath = routes[i].RoutePath;
                            }

                            mergedRoute.TravelDistance += routes[i].TravelDistance;
                            mergedRoute.TravelDuration += routes[i].TravelDuration;
                            mergedRoute.TravelDurationTraffic += routes[i].TravelDurationTraffic;
                        }
                        else
                        {
                            throw new Exception("An error occured when calculating one of the route segments.");
                        }
                    }

                    return mergedRoute;
                }

                return null;
            });
        }