Example #1
0
        public static List <BreakPointInfo> AnalyzeOneTrajectory(GPSTrajectory traj)
        {
            if (traj.GPSCount <= 3)
            {
                throw new Exception("GPS轨迹数据点太少");
            }
            List <BreakPointInfo> breakinfo = new List <BreakPointInfo>();
            TransportationMode    last      = InWhichMode(traj[1].Velocity);
            int duration = 1;

            for (int i = 2; i < traj.GPSCount; i++)
            {
                TransportationMode mode = InWhichMode(traj[i].Velocity);
                if (mode != last)
                {
                    //检测到移动模式变化
                    BreakPointInfo bpinfo = new BreakPointInfo(i - 1, last, duration);
                    breakinfo.Add(bpinfo);
                    duration = 1;
                }
                else
                {
                    duration++;
                }
                last = mode;
            }
            //处理最后一个点
            if (duration != 1)
            {
                breakinfo.Add(new BreakPointInfo(traj.GPSCount - 1, last, duration));
            }
            return(breakinfo);
        }
Example #2
0
 public static PathTime GetBestTimeForPathByUser(String pathKey, String userName, TransportationMode mode = TransportationMode.Bike)
 {
     return _pathTimes
                 .Where(x => x.PathKey == pathKey && x.User == userName && x.Mode == mode)
                 .OrderBy(x => x.TotalTime)
                 .FirstOrDefault();
 }
 public PreviewCourse()
 {
     InitializeComponent();
     GetCurrentPosition();
     DataContext = this;
     //DataAccess.Load();
     currentMode = TransportationMode.Bike;
     InvertButton(Bike);
 }
Example #4
0
 protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
 {
     StartWatcher();
     var app = ((App)Application.Current);
     currentCourse = app.CurrentCourse;
     mode = app.CurrentMode;
     SetupSplits();
     InitMap();
     timer = new DispatcherTimer();
     timer.Tick += timer_Tick;
     timer.Interval = TimeSpan.FromSeconds(0.1);
 }
Example #5
0
 public static PathTime GetNextSlowestTime(String pathKey, TimeSpan lastSplitTime, Int32 splitIndex, TransportationMode mode = TransportationMode.Bike)
 {
     try
     {
         return _pathTimes
             .Where(x => x.PathKey == pathKey && x.SplitTimes[splitIndex] > lastSplitTime && x.Mode == mode)
             .OrderBy(x => x.SplitTimes[splitIndex])
             .FirstOrDefault();
     }
     catch
     {
         return null;
     }
 }
 private void Blade_Click(object sender, RoutedEventArgs e)
 {
     InvertButton(Blade);
     currentMode = TransportationMode.Blade;
     GetTimesForCourse();
 }
 private void Run_Click(object sender, RoutedEventArgs e)
 {
     InvertButton(Run);
     currentMode = TransportationMode.Walk;
     GetTimesForCourse();
 }
        /// <summary>
        /// Creates a request with the Google Api to get distances between specified adresses.
        /// A result is added for each origin/destination pair.
        /// </summary>
        /// <param name="OriginAddresses">Origin adresses to calculate distances FROM</param>
        /// <param name="DestinationAddresses">Destination adresses to calculate distances TO</param>
        /// <param name="mode">Transportation mode to calculate distances for</param>
        /// <param name="transitDate">Optional transit date, defaults to next monday at 3 PM</param>
        /// <returns>A DistanceMatrixRequestResult which is a C# class representation of json returned by Google API</returns>
        private static DistanceMatrixRequestResult GetDistanceMatrixResult(IEnumerable <string> OriginAddresses, IEnumerable <string> DestinationAddresses, TransportationMode mode, DateTime?transitDate = null)
        {
            if (OriginAddresses == null || OriginAddresses.Count() == 0 || DestinationAddresses == null || DestinationAddresses.Count() == 0)
            {
                return(new DistanceMatrixRequestResult());
            }

            if (OriginAddresses.Count() * DestinationAddresses.Count() > 100)
            {
                throw new Exception("Google API does not allow more than 100 distances to be calculated per request");
            }

            RestClient client = new RestClient(ServiceUri);

            var request = new RestRequest("json", Method.GET);

            request.AddParameter("key", AppSettings.GoogleDistanceMatrixApiKey, ParameterType.GetOrPost);
            request.AddParameter("client", "gme-mentordanmark");
            request.AddParameter("channel", AppSettings.GoogleChannelName);
            request.AddParameter("destinations", string.Join("|", DestinationAddresses), ParameterType.GetOrPost);

            if (mode == TransportationMode.Walking)
            {
                request.AddParameter("mode", "walking", ParameterType.GetOrPost);
            }
            else if (mode == TransportationMode.Bicycling)
            {
                request.AddParameter("mode", "bicycling", ParameterType.GetOrPost);
            }
            else if (mode == TransportationMode.Driving)
            {
                request.AddParameter("mode", "driving", ParameterType.GetOrPost);
            }
            else if (mode == TransportationMode.Transit)
            {
                request.AddParameter("mode", "transit", ParameterType.GetOrPost);

                if (transitDate == null)
                {
                    // If no date is specified, use next monday at 15
                    transitDate = Calculator.NextSpecifiedWeekday(DateTime.Today, DayOfWeek.Monday).AddHours(15);
                }

                /*
                 * The desired time of departure. You can specify the time as an integer in seconds since midnight,
                 * January 1, 1970 UTC. Alternatively, you can specify a value of now, which sets the departure time to
                 * the current time (correct to the nearest second).
                 */

                var utcSeconds = transitDate.Value.ToUniversalTime().Subtract(new DateTime(1970, 1, 1)).TotalSeconds;

                request.AddParameter("departure_time", utcSeconds, ParameterType.GetOrPost);
            }
            else if (mode == TransportationMode.Unknown)
            {
                throw new Exception("Transportation mode unknown");
            }

            request.AddParameter("origins", string.Join("|", OriginAddresses), ParameterType.GetOrPost);

            var response = WebHelper.GetWebRequestResponse(client, request);

            var responseObject = (DistanceMatrixRequestResult)JsonConvert.DeserializeObject(response.Content, typeof(DistanceMatrixRequestResult));

            return(responseObject);
        }
        // Executing requests with the google Api
        #region Requests

        /// <summary>
        /// Creates a request with the Google Api to get distances between specified adresses.
        /// A result is added for each origin/destination pair.
        /// </summary>
        /// <param name="OriginAddresses">Origin adresses to calculate distances FROM</param>
        /// <param name="DestinationAddress">Destination adress to calculate distances TO</param>
        /// <param name="mode">Transportation mode to calculate distances for</param>
        /// <param name="transitDate">Optional transit date, defaults to next monday at 3 PM</param>
        /// <returns>A DistanceMatrixRequestResult which is a C# class representation of json returned by Google API</returns>
        private static DistanceMatrixRequestResult GetDistanceMatrixResult(IEnumerable <string> OriginAddresses, string DestinationAddress, TransportationMode mode, DateTime?transitDate = null)
        {
            return(GetDistanceMatrixResult(OriginAddresses, new List <string>()
            {
                DestinationAddress
            }, mode, transitDate));
        }
        /// <summary>
        /// Get distances between multiple origin adresseses and multiple destination addresses
        /// </summary>
        /// <param name="OriginAddresses">Origin adresses to calculate distance FROM</param>
        /// <param name="DestinationAddresses">Destination adresseses to calculate distances TO</param>
        /// <param name="mode">Transportation mode to calculate distances for</param>
        /// <param name="transitDate">Optional transit date, defaults to next monday at 3 PM</param>
        public static List <DistanceMatrixResult> CalculateDistances(List <MailingAddress> OriginAddresses, List <MailingAddress> DestinationAddresses, TransportationMode mode, DateTime?transitDate = null)
        {
            List <List <MailingAddress> > SplitAddresses = new List <List <MailingAddress> >(); // Splitting addresses into lists of 25 each to not exceed the per call limit of google distance matrix.
            var addrSize = 25;

            for (int i = 0; i < DestinationAddresses.Count; i += addrSize)
            {
                SplitAddresses.Add(DestinationAddresses.GetRange(i, Math.Min(addrSize, DestinationAddresses.Count - i)));
            }

            var results = new List <DistanceMatrixResult>();


            if (SplitAddresses.Any()) // if there is ANY destinations, call the google matrix api. Otherwise return a empty list.
            {
                foreach (var destinationAddressesList in SplitAddresses)
                {
                    var responseObject = GetDistanceMatrixResult(OriginAddresses.Select(a => a.FullAddress), destinationAddressesList.Where(o => o != null).Select(o => o.FullAddress).ToList(), mode, transitDate);

                    for (var i = 0; i < OriginAddresses.Count(); i++)
                    {
                        var row = responseObject.rows.ElementAt(i);

                        for (int y = 0; y < destinationAddressesList.Count(); y++)
                        {
                            var element = row.elements.ElementAt(y);

                            if (element.status == "OK")
                            {
                                results.Add(new DistanceMatrixResult()
                                {
                                    Mode = mode,
                                    DistanceInKilometers = (decimal)element.distance.value / 1000,
                                    Duration             = TimeSpan.FromSeconds(element.duration.value),
                                    DestinationAddressId = destinationAddressesList.ElementAt(y).ID,
                                    OriginAddressId      = OriginAddresses.ElementAt(i).ID,
                                    DestinationAddress   = destinationAddressesList.ElementAt(y).FullAddress,
                                    OriginAddress        = OriginAddresses.ElementAt(i).FullAddress
                                });
                            }
                            else
                            {
                                results.Add(new DistanceMatrixResult()
                                {
                                    ErrorCode            = element.status,
                                    Mode                 = TransportationMode.Unknown,
                                    DestinationAddressId = destinationAddressesList.ElementAt(y).ID,
                                    OriginAddressId      = OriginAddresses.ElementAt(i).ID,
                                    DestinationAddress   = destinationAddressesList.ElementAt(y).FullAddress,
                                    OriginAddress        = OriginAddresses.ElementAt(i).FullAddress
                                });
                            }
                        }
                    }
                }
            }
            return(results);
        }
        /// <summary>
        /// Get distances between multiple origin adresseses and a single destination address
        /// </summary>
        /// <param name="OriginAddresses">Origin adresses to calculate distance FROM</param>
        /// <param name="DestinationAddress">Destination adresses to calculate distances TO</param>
        /// <param name="mode">Transportation mode to calculate distances for</param>
        /// <param name="transitDate">Optional transit date, defaults to next monday at 3 PM</param>
        public static List <DistanceMatrixResult> CalculateDistances(List <MailingAddress> OriginAddresses, MailingAddress DestinationAddress, TransportationMode mode, DateTime?transitDate = null)
        {
            var originAddressesAsStringList = OriginAddresses.Where(o => o != null).Select(o => o.FullAddress).ToList();

            var responseObject = GetDistanceMatrixResult(originAddressesAsStringList, DestinationAddress.FullAddress, mode, transitDate);

            var results = new List <DistanceMatrixResult>();

            for (var i = 0; i < OriginAddresses.Count(); i++)
            {
                var row     = responseObject.rows.ElementAt(i);
                var element = row.elements.FirstOrDefault();

                if (element.status == "OK")
                {
                    results.Add(new DistanceMatrixResult()
                    {
                        Mode = mode,
                        DistanceInKilometers = (decimal)element.distance.value / 1000,
                        Duration             = TimeSpan.FromSeconds(element.duration.value),
                        DestinationAddressId = DestinationAddress.ID,
                        OriginAddressId      = OriginAddresses.ElementAt(i).ID,
                        DestinationAddress   = DestinationAddress.FullAddress,
                        OriginAddress        = OriginAddresses.ElementAt(i).FullAddress
                    });
                }
                else
                {
                    results.Add(new DistanceMatrixResult()
                    {
                        ErrorCode            = element.status,
                        Mode                 = TransportationMode.Unknown,
                        DestinationAddressId = DestinationAddress.ID,
                        OriginAddressId      = OriginAddresses.ElementAt(i).ID,
                        DestinationAddress   = DestinationAddress.FullAddress,
                        OriginAddress        = OriginAddresses.ElementAt(i).FullAddress
                    });
                }
            }
            return(results);
        }
        /// <summary>
        /// Get distances between a single origin adresses and a single destination address rom the Google Distance Matrix API
        /// </summary>
        /// <param name="OriginAddress">Origin adress to calculate distance FROM</param>
        /// <param name="DestinationAddress">Destination adresses to calculate distances TO</param>
        /// <param name="mode">Transportation mode to calculate distances for</param>
        /// <param name="transitDate">Optional transit date, defaults to next monday at 3 PM</param>
        public static List <DistanceMatrixResult> CalculateDistances(string OriginAddress, string DestinationAddress, TransportationMode mode, DateTime?transitDate = null)
        {
            var list = new string[1];

            list[0] = OriginAddress;
            var responseObject = GetDistanceMatrixResult(list, DestinationAddress, mode, transitDate);

            var results = new List <DistanceMatrixResult>();


            var row     = responseObject.rows.ElementAt(0);
            var element = row.elements.FirstOrDefault();

            if (element.status == "OK")
            {
                results.Add(new DistanceMatrixResult()
                {
                    Mode = mode,
                    DistanceInKilometers = (decimal)element.distance.value / 1000,
                    Duration             = TimeSpan.FromSeconds(element.duration.value),
                    DestinationAddress   = DestinationAddress,
                    OriginAddress        = OriginAddress
                });
            }
            else
            {
                results.Add(new DistanceMatrixResult()
                {
                    ErrorCode          = element.status,
                    Mode               = TransportationMode.Unknown,
                    DestinationAddress = DestinationAddress,
                    OriginAddress      = OriginAddress
                });
            }
            return(results);
        }
        /// <summary>
        /// Calculates the estimated time of arrival in seconds
        /// </summary>
        /// <param name="userCoordinate">The current coordinates of the user</param>
        /// <param name="shopCoordinate">The coordinates of the shop</param>
        /// <param name="transportationMode">The selected mode of transportation</param>
        /// <returns>ETA in seconds</returns>
        public async Task <int> CalculateEta(Coordinates userCoordinate, Coordinates shopCoordinate, TransportationMode transportationMode)
        {
            string apiKey      = Environment.GetEnvironmentVariable("MAPQUEST_API_KEY");
            string encodedUser = this.urlEncodeCoordinates(userCoordinate);
            string encodedShop = this.urlEncodeCoordinates(shopCoordinate);
            string transport   = null;

            switch (transportationMode)
            {
            case TransportationMode.Bicycle:
                transport = "bicycle ";
                break;

            case TransportationMode.Car:
                transport = "fastest";
                break;

            case TransportationMode.Foot:
                transport = "pedestrian";
                break;

            case TransportationMode.PublicTransport:
                throw new NotImplementedException("Public transport not supported by MapQuest");
            }

            string url = string.Format("https://www.mapquestapi.com/directions/v2/route?key={0}&from={1}&to={2}&outFormat=json&routeType={3}", apiKey, encodedUser, encodedShop, transport);


            using (HttpClient client = new HttpClient())
            {
                using (HttpResponseMessage res = await client.GetAsync(url))
                {
                    using (HttpContent content = res.Content)
                    {
                        string data = await content.ReadAsStringAsync();

                        if (data != null)
                        {
                            var response = JsonConvert.DeserializeObject <MapQuestResponse>(data);
                            return(response.Route.Time);
                        }
                        else
                        {
                            throw new InvalidOperationException("Invalid response from Mapquest");
                        }
                    }
                }
            }
        }
Example #14
0
 public BreakPointInfo(int breakindex, TransportationMode mode, int seg)
 {
     BreakIndex    = breakindex;
     TransportMode = mode;
     segmentLength = seg;
 }