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); }
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); }
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); }
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"); } } } } }
public BreakPointInfo(int breakindex, TransportationMode mode, int seg) { BreakIndex = breakindex; TransportMode = mode; segmentLength = seg; }