public void Test_Calcolo_Distanze() { var punti = Points.Select(p => p.Destination.Location).Distinct(new Location_Comparer()).ToList(); punti.Clear(); for (int i = 0; i < 100; i++) punti.Add(new Location { Latitude = 44 + 0.0001 * i, Longitude = 12 + 0.0001 * i }); DateTime? start = null; var stop = start; var distanze = new List<DistanzaStimata>(); var mre = new ManualResetEvent(false); var jobs = new Queue<DistanzaStimata>(); var route = maps.ServiceHelper.GetRouteService(); //route.CalculateRouteCompleted += (sender, e) => //{ // var d = e.UserState as DistanzaStimata; // if (start == null) // start = DateTime.Now; // if (e.Error == null && d != null) // { // d.Km = e.Result.Result.Summary.Distance; // d.TimeInSeconds = e.Result.Result.Summary.TimeInSeconds; // } // lock (d) // Monitor.Pulse(d); // d.Done(); // if (distanze.All(a => a.Completed)) // { // stop = DateTime.Now; // mre.Set(); // } //}; var combos = new Utilities.Combinatorics.Combinations<Location>(punti, 2); foreach (var combinazione in combos) { var da = combinazione[0]; var a = combinazione[1]; var distanza = new DistanzaStimata { From = da, To = a }; distanze.Add(distanza); jobs.Enqueue(distanza); } //for (int i = 0; i < 10; i++) //{ // Task.Factory.StartNew(() => // { // while (jobs.Count > 0) // { // var distanza = jobs.Dequeue(); // var points = new[] { distanza.From, distanza.To }.Select(l => new maps.RouteService.Waypoint // { // Location = new maps.RouteService.Location { Latitude = l.Latitude, Longitude = l.Longitude } // }).To_ObservableCollection(); // var request = new maps.RouteService.RouteRequest // { // Credentials = new maps.RouteService.Credentials() { Token = maps.ServiceHelper.GeocodeServiceCredentials }, // Culture = System.Threading.Thread.CurrentThread.CurrentUICulture.ToString(), // Options = new maps.RouteService.RouteOptions { Optimization = maps.RouteService.RouteOptimization.MinimizeDistance }, // Waypoints = points // }; // route.CalculateRouteAsync(request, distanza); // lock (distanza) // Monitor.Wait(distanza); // } // }); //} var builder = new Route_Request_Builder(distanze); var requests = builder.Get_Requests().To_Queue(); var test = builder.Get_Requests(); var q1 = test.SelectMany(r => r.Get_Routes()).Where(r => !r.Completed); route.CalculateRouteCompleted += (sender, e) => { var d = e.UserState as Request; if (start == null) start = DateTime.Now; if (e.Error == null && d != null) { for (int i = 0; i < e.Result.Result.Legs.Count; i++) { var leg = e.Result.Result.Legs[i]; var r = d.Get_Routes().ElementAt(i); r.Km = leg.Summary.Distance; r.TimeInSeconds = leg.Summary.TimeInSeconds; r.Done(); } d.Done(); } lock (d) Monitor.Pulse(d); if (test.All(a => a.Completed)) { stop = DateTime.Now; mre.Set(); } }; for (int i = 0; i < 10; i++) { Task.Factory.StartNew(() => { while (requests.Count > 0) { var request = requests.Dequeue(); var points = request.Get_Locations().Select(l => new maps.RouteService.Waypoint { Location = new maps.RouteService.Location { Latitude = l.Latitude, Longitude = l.Longitude } }).To_ObservableCollection(); var routeRequest = new maps.RouteService.RouteRequest { Credentials = new maps.RouteService.Credentials() { Token = maps.ServiceHelper.GeocodeServiceCredentials }, Culture = System.Threading.Thread.CurrentThread.CurrentUICulture.ToString(), Options = new maps.RouteService.RouteOptions { Optimization = maps.RouteService.RouteOptimization.MinimizeDistance }, Waypoints = points }; route.CalculateRouteAsync(routeRequest, request); lock (request) Monitor.Wait(request); } }); } }
public Task<DistanzaStimata> Calcola_Distanza(Location da, Location a) { var points = new[] { da, a }.Select(l => new maps.RouteService.Waypoint { Location = new maps.RouteService.Location { Latitude = l.Latitude, Longitude = l.Longitude } }).To_ObservableCollection(); var tcs = new TaskCompletionSource<DistanzaStimata>(); var route = maps.ServiceHelper.GetRouteService(); route.CalculateRouteCompleted += (sender, e) => { var d = e.UserState as DistanzaStimata; d.Done(); if (e.Error != null || d == null) { tcs.TrySetException(e.Error); return; } d.Km = e.Result.Result.Summary.Distance; d.TimeInSeconds = e.Result.Result.Summary.TimeInSeconds; tcs.TrySetResult(d); }; var request = new maps.RouteService.RouteRequest { Credentials = new maps.RouteService.Credentials() { Token = maps.ServiceHelper.GeocodeServiceCredentials }, Culture = System.Threading.Thread.CurrentThread.CurrentUICulture.ToString(), Options = new maps.RouteService.RouteOptions { Optimization = maps.RouteService.RouteOptimization.MinimizeDistance }, Waypoints = points }; route.CalculateRouteAsync(request, new DistanzaStimata { From= da, To = a }); return tcs.Task; }
protected void Refresh_Routes_Old() { if (SelectedSimulation == null) { SelectedSimulation = new SimulationDto { Voyages = new ObservableCollection<VoyageDto>() }; SelectedSimulation.Starting_Address = "Home"; SelectedSimulation.Returning_Address = "Home"; SelectedSimulation.Starting_Latitude = 44.1383781433105; SelectedSimulation.Starting_Longitude = 12.2387800216675; SelectedSimulation.Returning_Latitude = 44.1383781433105; SelectedSimulation.Returning_Longitude = 12.2387800216675; for (int i = 0; i < 1; i++) { var v = new VoyageDto() { Orders = new ObservableCollection<int>() }; foreach(var order in Scenario.Orders) v.Orders.Add(order.Number); v.Departing = DateTime.Today.AddDays(1); v.Exitmated_Time = TimeSpan.FromDays(1); v.Extimated_Lenght_Km = 12; SelectedSimulation.Voyages.Add(v); } Simulations.Add(SelectedSimulation); } var service = maps.ServiceHelper.GetRouteService(); service.CalculateRouteCompleted += (sender, e) => { var voyage = e.UserState as VoyageDto; Routes.Add(new RouteViewModel(voyage, e.Result.Result.RoutePath.Points)); }; foreach (var route in SelectedSimulation.Voyages) { var wp = route.Orders.Select(v => new maps.RouteService.Waypoint { Description = v + "", Location = new maps.RouteService.Location { Latitude = GetOrder(v).Latitude, Longitude = GetOrder(v).Longitude } }).To_ObservableCollection(); wp.Add(new maps.RouteService.Waypoint { Description = SelectedSimulation.Starting_Address, Location = new maps.RouteService.Location { Latitude = SelectedSimulation.Starting_Latitude, Longitude= SelectedSimulation.Starting_Longitude } }); //wp.Add(new maps.RouteService.Waypoint { Description = SelectedSimulation.Returning_Address, Location = new maps.RouteService.Location { Latitude = SelectedSimulation.Returning_Latitude, Longitude =SelectedSimulation.Returning_Longitude } }); var request = new maps.RouteService.RouteRequest { Credentials = new maps.RouteService.Credentials() { Token = maps.ServiceHelper.GeocodeServiceCredentials }, Culture = System.Threading.Thread.CurrentThread.CurrentUICulture.ToString(), Waypoints = wp }; request.Options = new maps.RouteService.RouteOptions(); request.Options.RoutePathType = maps.RouteService.RoutePathType.Points; service.CalculateRouteAsync(request, route); } }