public async Task UpdateDirections(string itemId, DirectionsResult directionsResult, int?preferredRoute) { var item = await digitServiceContext.FocusItems .Include(v => v.Directions) .Where(v => v.Id == itemId).SingleOrDefaultAsync(); item.Directions = item.Directions ?? new StoredDirectionsInfo(); item.Directions.DirectionsKey = directionsResult.CacheKey; item.Directions.PreferredRoute = null != directionsResult.TransitDirections ? preferredRoute : null; item.Directions.PlaceNotFound = null != directionsResult.NotFound && directionsResult.NotFound.Reason == TravelService.Models.DirectionsNotFoundReason.AddressNotFound; item.Directions.DirectionsNotFound = null != directionsResult.NotFound && directionsResult.NotFound.Reason == TravelService.Models.DirectionsNotFoundReason.RouteNotFound; item.Directions.TravelStatus = TravelStatus.UnStarted; await digitServiceContext.SaveChangesAsync(); }
private async Task <bool> RouteUpdateRequired(string userId, DirectionsResult res, FocusItem item, Location location, DateTimeOffset now) { if (item.DirectionsMetadata.TravelStatus == TravelStatus.Finished) { return(false); } if (null == location) { return(false); } var traceMeasures = await travelServiceClient .Directions[res.CacheKey] .Itineraries[item.DirectionsMetadata.PeferredRoute] .Trace(new TraceLocation() { Accuracy = new TraceLocationAccuracy() { Confidence = 0.68, Radius = location.Accuracy }, Coordinate = new Coordinate(location.Latitude, location.Longitude), Timestamp = location.Timestamp }); await logger.LogForFocusItem(userId, item.Id, $"Traced {Math.Round(traceMeasures.ConfidenceOnRoute * 100)}% on route at accuracy of " + $"{location.Accuracy}, " + $" with delay of {traceMeasures.PositionOnRoute.Delay}", DigitTraceAction.TraceOnRoute, new Dictionary <string, object>() { { "lng", location.Longitude }, { "lat", location.Latitude } }); if (traceMeasures.ConfidenceOnRoute > 0.3) { if (traceMeasures.PositionOnRoute.Delay < FocusConstants.MaxAllowedDelay && (-FocusConstants.MaxAllowedEarly) < traceMeasures.PositionOnRoute.Delay) { return(false); } } return(true); }
private async Task AddDirections() { //Adding a waypoint var waypoints = new List <DirectionsWaypoint>(); waypoints.Add(new DirectionsWaypoint() { Location = "Bethlehem, PA", Stopover = true }); //Direction Request DirectionsRequest dr = new DirectionsRequest(); dr.Origin = "Allentown, PA"; dr.Destination = "Bronx, NY"; dr.Waypoints = waypoints; dr.TravelMode = TravelMode.Driving; dr.DrivingOptions = new DrivingOptions() { DepartureTime = DateTime.Now.AddHours(1) }; //Calculate Route _directionsResult = await dirRend.Route(dr, new DirectionsRequestOptions() { StripLegsStepsLatLngs = false, StripOverviewPath = false, StripOverviewPolyline = false, StripLegsStepsPath = false, StripLegsSteps = false }); var routes = _directionsResult.Routes.SelectMany(x => x.Legs).ToList(); foreach (var route in routes) { _durationTotalString += route.DurationInTraffic?.Text; _distanceTotalString += route.Distance.Text; } }
private async Task <TransitDirections> GetFreshDirections(string userId, Event evt, FocusItem item, Location location) { string directionsKey = null; var address = await ResolveAddress(userId, evt); if (null != address && null != location) { try { var start = new Coordinate() { Lat = location.Latitude, Lng = location.Longitude }; DateTimeOffset directionRequestTime = DateTimeOffset.Now; if (item.DirectionsMetadata?.TravelStatus == TravelStatus.OnJourney) { directionRequestTime = location.Timestamp; } bool requestWithNow = evt.Start <= directionRequestTime; DirectionsResult directionsResult = null; const int preferredRoute = 0; if (!requestWithNow) { directionsResult = await travelServiceClient.Users[userId].Directions.Transit.Get(start, address, evt.Start); if (null != directionsResult.NotFound || directionsResult.TransitDirections.Routes[preferredRoute].DepatureTime < directionRequestTime) { requestWithNow = true; } } if (requestWithNow) { directionsResult = await travelServiceClient.Users[userId].Directions.Transit.Get(start, address, null, directionRequestTime); } directionsKey = directionsResult?.CacheKey; await focusStore.UpdateDirections(item.Id, directionsResult, null != directionsResult.NotFound?null : (int?)preferredRoute); item.DirectionsMetadata = new DirectionsMetadata() { Error = directionsResult.NotFound?.Reason, Key = directionsResult.CacheKey, PeferredRoute = preferredRoute }; if (null == directionsResult.NotFound) { await travelServiceClient.Directions[directionsResult.CacheKey] .Subscribe(new Uri(_options.DirectionsCallbackUri)); } return(directionsResult.TransitDirections); } catch (TravelServiceException ex) { await logger.LogForFocusItem(userId, item.Id, $"Error while retrieving directions for {evt.Subject}: {ex.Message}", logLevel : LogLevel.Error); } } // TODO maybe clear directions with focusStore.UpdateDirections return(null); }
public static Route SelectRoute(DirectionsResult directionsResult) { return(directionsResult?.TransitDirections?.Routes?.FirstOrDefault()); }