Пример #1
0
        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();
        }
Пример #2
0
        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);
        }
Пример #3
0
        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;
            }
        }
Пример #4
0
        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);
        }
Пример #5
0
 public static Route SelectRoute(DirectionsResult directionsResult)
 {
     return(directionsResult?.TransitDirections?.Routes?.FirstOrDefault());
 }