public void OnRouteCalculated(object sender, BingRouteCalculatedEventArgs e)
        {
            SearchBoundingBox box     = e.CalculationResult.RouteResults[0].BoundingBox;
            GeoPoint          topleft = new GeoPoint
            {
                Latitude  = box.NorthLatitude,
                Longitude = box.WestLongitude,
            };
            GeoPoint bottomRight = new GeoPoint
            {
                Latitude  = box.SouthLatitude,
                Longitude = box.EastLongitude,
            };

            //Add devpress.map.core.dll
            mapControl1.ZoomToRegion(topleft, bottomRight, 0.4);
            RouteCalculationResult result = e.CalculationResult;

            if ((result.RouteResults != null) & (result.ResultCode == RequestResultCode.Success))
            {
                for (int rnum = 0; rnum < e.CalculationResult.RouteResults.Count; rnum++)
                {
                    if (e.CalculationResult.RouteResults[rnum].Legs != null)
                    {
                        //int legNum = 1;
                        foreach (BingRouteLeg leg in e.CalculationResult.RouteResults[rnum].Legs)
                        {
                            list.Add(float.Parse(leg.Distance.ToString("0.00")));
                        }
                    }
                }
            }
        }
 public TaskResponse(RouteCalculationResult routeCalcResult)
 {
     routeResult             = new Route();
     routeResult.mode        = routeCalcResult.Mode.ToString();
     routeResult.totalLength = routeCalcResult.TotalLength;
     routeResult.totalTime   = routeCalcResult.TotalTime;
     routeResult.checkpoints = routeCalcResult.Checkpoints.Select(cp => new Checkpoint(cp)).ToList();
 }
Exemple #3
0
        private void routeDataProvider_RouteCalculated(object sender, BingRouteCalculatedEventArgs e)
        {
            RouteCalculationResult result = e.CalculationResult;

            StringBuilder resultList = new StringBuilder();

            resultList.Append(String.Format("Status: {0}\n", result.ResultCode));
            resultList.Append(String.Format("Fault reason: {0}\n", result.FaultReason));
            resultList.Append(ProcessIntermediatePoints(result.IntermediatePoints));
            resultList.Append(ProcessRouteResults(result.RouteResults));

            tbResults.Text = resultList.ToString();
        }
        private void OnRouteCalculated(object sender, BingRouteCalculatedEventArgs e)
        {
            RouteCalculationResult result = e.CalculationResult;

            if ((result.RouteResults == null) ||
                (result.ResultCode == RequestResultCode.BadRequest))
            {
                rtbResults.Text = "The Bing Route service does not work for this location.";
                return;
            }

            StringBuilder resultList = new StringBuilder("");

            if (result.IntermediatePoints != null)
            {
                resultList.Append(String.Format("_________________________\n"));

                for (int i = 0; i < e.CalculationResult.IntermediatePoints.Count; i++)
                {
                    resultList.Append(
                        String.Format("Starting point {0}: {1} ({2})\n",
                                      i + 1,
                                      e.CalculationResult.IntermediatePoints[i].Description,
                                      e.CalculationResult.IntermediatePoints[i].Location)
                        );
                }
            }

            if ((result.RouteResults != null) & (result.ResultCode == RequestResultCode.Success))
            {
                for (int rnum = 0; rnum < e.CalculationResult.RouteResults.Count; rnum++)
                {
                    resultList.Append(String.Format("_________________________\n"));
                    resultList.Append(String.Format("Path {0}:\n", rnum + 1));
                    resultList.Append(String.Format(
                                          "Distance: {0}\n",
                                          e.CalculationResult.RouteResults[rnum].Distance
                                          ));
                    resultList.Append(String.Format(
                                          "Time: {0}\n",
                                          e.CalculationResult.RouteResults[0].Time
                                          ));

                    if (e.CalculationResult.RouteResults[rnum].Legs != null)
                    {
                        int legNum = 1;
                        foreach (BingRouteLeg leg in e.CalculationResult.RouteResults[rnum].Legs)
                        {
                            resultList.Append(String.Format("\tLeg {0}:\n", legNum++));
                            resultList.Append(String.Format("\tDistance: {0}\n", leg.Distance));
                            resultList.Append(String.Format("\tTime: {0}\n", leg.Time));
                            if (leg.Itinerary != null)
                            {
                                foreach (BingItineraryItem itineraryItem in leg.Itinerary)
                                {
                                    resultList.Append(String.Format(itineraryItem.Maneuver + "\n"));
                                    resultList.Append(String.Format(
                                                          "\t\tLocation: {0}\n",
                                                          itineraryItem.Location
                                                          ));
                                }
                            }
                        }
                    }
                }
            }
            rtbResults.Text = resultList.ToString();
        }
Exemple #5
0
        private static void CalculateRoute(long routeCalculationId)
        {
            try
            {
                #region Prepare

                var dbSession        = SessionFactory.Instance.OpenSession();
                var routeCalculation = dbSession.Get <RouteCalculation>(routeCalculationId);

                var santas = dbSession.Query <Santa>().OrderBy(s => s.Id).ToList();

                var visits = dbSession.Query <Visit>()
                             .Where(v => v.Year == routeCalculation.Year && v.Id != routeCalculation.StarterVisitId)
                             .OrderBy(v => v.Id)
                             .ToList();

                visits.ForEach(v =>
                               v.Duration = 60 * (v.NumberOfChildren * routeCalculation.TimePerChildMinutes +
                                                  routeCalculation.TimePerChildOffsetMinutes));

                var startVisit = dbSession.Query <Visit>().First(v => v.Id == routeCalculation.StarterVisitId);

                routeCalculation.NumberOfSantas = santas.Count;
                routeCalculation.NumberOfVisits = visits.Count;

                var converter         = new PersistenceToCoreConverter();
                var optimizationInput = converter.Convert(routeCalculation.Days, startVisit, visits, santas);

                // remove unnecessary santas
                {
                    // maximum number of additional santas to reach the theoretical optimum
                    var maxAdditional = optimizationInput.NumberOfVisits() - optimizationInput.NumberOfSantas();
                    maxAdditional = Math.Max(0, maxAdditional);
                    routeCalculation.MaxNumberOfAdditionalSantas = Math.Min(routeCalculation.MaxNumberOfAdditionalSantas, maxAdditional);
                }

                routeCalculation.State = RouteCalculationState.Ready;

                var solverConfig = SolverConfigFactory.CreateSolverConfig(routeCalculation, optimizationInput);
                routeCalculation.AlgorithmData = JsonConvert.SerializeObject(solverConfig);
                dbSession.Update(routeCalculation);
                dbSession.Flush();
                #endregion Prepare

                #region Run
                routeCalculation.StartTime = DateTime.Now;

                var solver = SolverFactory.CreateSolver(optimizationInput, solverConfig);

                // note: Progress<> is not suitable here as it may use multiple threads
                var consoleProgress = new EventHandler <string>((s, m) =>
                {
                    OnConsoleProgressOnProgressChanged(s, m, routeCalculationId);
                });

                var progress = new EventHandler <ProgressReport>((s, report) =>
                {
                    OnProgressOnProgressChanged(s, report, routeCalculationId);
                });

                routeCalculation.State = RouteCalculationState.Running;
                dbSession.Update(routeCalculation);
                dbSession.Flush();

                var optimizationResult = solver.Solve(routeCalculation.TimeLimitMiliseconds,
                                                      progress, consoleProgress);

                // refresh session as changes where made in other sessions (progress)
                dbSession.Clear();
                routeCalculation = dbSession.Get <RouteCalculation>(routeCalculation.Id);
                var routeCalculationResult = new RouteCalculationResult
                {
                    OptimizationResult = optimizationResult,
                    VisitMap           = converter.VisitMap,
                    SantaMap           = converter.SantaMap,
                    ZeroTime           = converter.ZeroTime
                };
                routeCalculation.Result = JsonConvert.SerializeObject(routeCalculationResult);
                routeCalculation.State  = RouteCalculationState.Finished;

                #endregion Run

                routeCalculation.EndTime = DateTime.Now;
                dbSession.Update(routeCalculation);
                dbSession.Flush();
            }
            catch (Exception e)
            {
                var dbSession        = SessionFactory.Instance.OpenSession();
                var routeCalculation = dbSession.Get <RouteCalculation>(routeCalculationId);
                routeCalculation.State = RouteCalculationState.Cancelled;
                routeCalculation.StateText.Add(new RouteCalculationLog {
                    Log = $"Error: {e.Message}"
                });
                dbSession.Update(routeCalculation);
                dbSession.Flush();
            }
        }