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;
});
}