Esempio n. 1
0
        /// <summary>
        /// Tries to calculate an earliest arrival route from stop1 to stop2.
        /// </summary>
        public Result <Route> TryEarliestArrival(DateTime departureTime, uint stop1, uint stop2, Func <uint, bool> useAgency)
        {
            var tripEnumerator = _transitDb.GetTripsEnumerator();
            var transfersDb    = _transitDb.GetTransfersDb(_transferProfile);
            var profileSearch  = new ProfileSearch(_transitDb, departureTime, transfersDb, (t, day) =>
            {
                if (tripEnumerator.MoveTo(t))
                {
                    if (useAgency(tripEnumerator.AgencyId))
                    {
                        return(true);
                    }
                }
                return(false);
            });

            profileSearch.SetSourceStop(stop1, (uint)(departureTime - departureTime.Date).TotalSeconds);
            profileSearch.SetTargetStop(stop2, 0);
            profileSearch.Run();
            if (!profileSearch.HasSucceeded)
            {
                return(new Result <Route>(profileSearch.ErrorMessage, (message) =>
                {
                    return new RouteNotFoundException(message);
                }));
            }

            // generate route.
            var routeBuilder = new ProfileSearchRouteBuilder(profileSearch);

            routeBuilder.Run();
            if (!routeBuilder.HasSucceeded)
            {
                return(new Result <Route>(routeBuilder.ErrorMessage, (message) =>
                {
                    return new RouteBuildFailedException(message);
                }));
            }
            return(new Result <Route>(routeBuilder.Route));
        }
Esempio n. 2
0
        public void TestOneHopWithWalkingAfter()
        {
            // build dummy db.
            var db = new TransitDb();

            db.AddStop(0, 0, db.StopAttributes.Add(new Attribute("name", "stop1")));
            db.AddStop(1, 1, db.StopAttributes.Add(new Attribute("name", "stop2")));
            db.AddTrip(0, 0, db.TripAttributes.Add(new Attribute("name", "trip1")));
            db.AddConnection(0, 1, 0, 8 * 3600, 8 * 3600 + 10 * 60);
            db.SortConnections(DefaultSorting.DepartureTime, null);

            // run algorithm.
            var departureTime = new System.DateTime(2017, 05, 10, 07, 30, 00);
            var algorithm     = new ProfileSearch(db, departureTime,
                                                  (profileId, day) => true);

            algorithm.SetSourceStop(0, 07 * 3600 + 30 * 60); // a 15 min walk.
            algorithm.SetTargetStop(1, 15 * 60);
            algorithm.Run();

            // build route.
            var routeBuilder = new ProfileSearchRouteBuilder(algorithm, false);

            routeBuilder.Run();
            var route = routeBuilder.Route;

            Assert.IsNotNull(route);

            Assert.IsNotNull(route.Shape);
            Assert.AreEqual(3, route.Shape.Length);
            Assert.AreEqual(0, route.Shape[0].Latitude);
            Assert.AreEqual(0, route.Shape[0].Longitude);
            Assert.AreEqual(0, route.Shape[1].Latitude);
            Assert.AreEqual(0, route.Shape[1].Longitude);
            Assert.AreEqual(1, route.Shape[2].Latitude);
            Assert.AreEqual(1, route.Shape[2].Longitude);

            Assert.IsNotNull(route.Stops);
            Assert.AreEqual(3, route.Stops.Length);
            var stop = route.Stops[0];

            Assert.IsNotNull(stop.Attributes);
            Assert.AreEqual(1, stop.Attributes.Count);
            Assert.IsTrue(stop.Attributes.Contains("name", "stop1"));
            Assert.AreEqual(0, stop.Shape);
            Assert.AreEqual(0, stop.Coordinate.Latitude);
            Assert.AreEqual(0, stop.Coordinate.Longitude);
            stop = route.Stops[1];
            Assert.IsNotNull(stop.Attributes);
            Assert.AreEqual(1, stop.Attributes.Count);
            Assert.IsTrue(stop.Attributes.Contains("name", "stop1"));
            Assert.AreEqual(1, stop.Shape);
            Assert.AreEqual(0, stop.Coordinate.Latitude);
            Assert.AreEqual(0, stop.Coordinate.Longitude);
            stop = route.Stops[2];
            Assert.IsNotNull(stop.Attributes);
            Assert.AreEqual(1, stop.Attributes.Count);
            Assert.IsTrue(stop.Attributes.Contains("name", "stop2"));
            Assert.AreEqual(2, stop.Shape);
            Assert.AreEqual(1, stop.Coordinate.Latitude);
            Assert.AreEqual(1, stop.Coordinate.Longitude);

            Assert.IsNotNull(route.ShapeMeta);
            Assert.AreEqual(3, route.ShapeMeta.Length);

            var meta = route.ShapeMeta[0];

            Assert.AreEqual(0, meta.Shape);
            Assert.IsNotNull(meta.Attributes);
            Assert.IsTrue(meta.Attributes.Contains(Itinero.Transit.Constants.TimeOfDayKey,
                                                   ((07 * 3600) + (30 * 60)).ToInvariantString()));
            Assert.AreEqual(0, meta.Time);

            meta = route.ShapeMeta[1];
            Assert.AreEqual(1, meta.Shape);
            Assert.IsNotNull(meta.Attributes);
            Assert.IsTrue(meta.Attributes.Contains(Itinero.Transit.Constants.TimeOfDayKey,
                                                   ((08 * 3600) + (00 * 60)).ToInvariantString()));
            Assert.AreEqual(30 * 60, meta.Time);

            meta = route.ShapeMeta[2];
            Assert.AreEqual(2, meta.Shape);
            Assert.IsNotNull(meta.Attributes);
            Assert.IsTrue(meta.Attributes.Contains(Itinero.Transit.Constants.TimeOfDayKey,
                                                   ((08 * 3600) + (10 * 60)).ToInvariantString()));
            Assert.AreEqual(meta.Time, 40 * 60);
        }
Esempio n. 3
0
        public void TestTwoHopsOneTransferCloseStopsSuccessful()
        {
            // build dummy db.
            var db = new TransitDb();

            db.AddStop(0, 0, db.StopAttributes.Add(new Attribute("name", "stop1")));
            db.AddStop(1, 1, db.StopAttributes.Add(new Attribute("name", "stop2")));
            db.AddStop(2, 2, db.StopAttributes.Add(new Attribute("name", "stop3")));
            db.AddStop(3, 3, db.StopAttributes.Add(new Attribute("name", "stop4")));
            db.AddTrip(0, 0, db.TripAttributes.Add(new Attribute("name", "trip1")));
            db.AddTrip(0, 0, db.TripAttributes.Add(new Attribute("name", "trip2")));
            db.AddConnection(0, 1, 0, 8 * 3600, 8 * 3600 + 10 * 60);
            db.AddConnection(2, 3, 1, 8 * 3600 + 15 * 60, 8 * 3600 + 25 * 60);

            db.SortConnections(DefaultSorting.DepartureTime, null);

            // build dummy transfers db.
            var transfersDb = new TransfersDb(1024);

            transfersDb.AddTransfer(1, 2, 100);

            // run algorithm.
            var departureTime = new System.DateTime(2017, 05, 10, 07, 30, 00);
            var algorithm     = new ProfileSearch(db, departureTime, transfersDb,
                                                  (profileId, day) => true);

            algorithm.SetSourceStop(0, 07 * 3600 + 30 * 60);
            algorithm.SetTargetStop(3, 0);
            algorithm.Run();

            // build route.
            var routeBuilder = new ProfileSearchRouteBuilder(algorithm, false);

            routeBuilder.Run();
            var route = routeBuilder.Route;

            Assert.IsNotNull(route);

            Assert.IsNotNull(route.Shape);
            Assert.AreEqual(6, route.Shape.Length);
            Assert.AreEqual(0, route.Shape[0].Latitude);
            Assert.AreEqual(0, route.Shape[0].Longitude);
            Assert.AreEqual(0, route.Shape[1].Latitude);
            Assert.AreEqual(0, route.Shape[1].Longitude);
            Assert.AreEqual(1, route.Shape[2].Latitude);
            Assert.AreEqual(1, route.Shape[2].Longitude);
            Assert.AreEqual(2, route.Shape[3].Latitude);
            Assert.AreEqual(2, route.Shape[3].Longitude);
            Assert.AreEqual(2, route.Shape[4].Latitude);
            Assert.AreEqual(2, route.Shape[4].Longitude);
            Assert.AreEqual(3, route.Shape[5].Latitude);
            Assert.AreEqual(3, route.Shape[5].Longitude);

            Assert.IsNotNull(route.Stops);
            Assert.AreEqual(6, route.Stops.Length);
            var stop = route.Stops[0];

            Assert.IsNotNull(stop.Attributes);
            Assert.AreEqual(1, stop.Attributes.Count);
            Assert.IsTrue(stop.Attributes.Contains("name", "stop1"));
            Assert.AreEqual(0, stop.Shape);
            Assert.AreEqual(0, stop.Coordinate.Latitude);
            Assert.AreEqual(0, stop.Coordinate.Longitude);
            stop = route.Stops[1];
            Assert.IsNotNull(stop.Attributes);
            Assert.AreEqual(1, stop.Attributes.Count);
            Assert.IsTrue(stop.Attributes.Contains("name", "stop1"));
            Assert.AreEqual(1, stop.Shape);
            Assert.AreEqual(0, stop.Coordinate.Latitude);
            Assert.AreEqual(0, stop.Coordinate.Longitude);
            stop = route.Stops[2];
            Assert.IsNotNull(stop.Attributes);
            Assert.AreEqual(1, stop.Attributes.Count);
            Assert.IsTrue(stop.Attributes.Contains("name", "stop2"));
            Assert.AreEqual(2, stop.Shape);
            Assert.AreEqual(1, stop.Coordinate.Latitude);
            Assert.AreEqual(1, stop.Coordinate.Longitude);
            stop = route.Stops[3];
            Assert.IsNotNull(stop.Attributes);
            Assert.AreEqual(1, stop.Attributes.Count);
            Assert.IsTrue(stop.Attributes.Contains("name", "stop3"));
            Assert.AreEqual(3, stop.Shape);
            Assert.AreEqual(2, stop.Coordinate.Latitude);
            Assert.AreEqual(2, stop.Coordinate.Longitude);
            stop = route.Stops[4];
            Assert.IsNotNull(stop.Attributes);
            Assert.AreEqual(1, stop.Attributes.Count);
            Assert.IsTrue(stop.Attributes.Contains("name", "stop3"));
            Assert.AreEqual(4, stop.Shape);
            Assert.AreEqual(2, stop.Coordinate.Latitude);
            Assert.AreEqual(2, stop.Coordinate.Longitude);
            stop = route.Stops[5];
            Assert.IsNotNull(stop.Attributes);
            Assert.AreEqual(1, stop.Attributes.Count);
            Assert.IsTrue(stop.Attributes.Contains("name", "stop4"));
            Assert.AreEqual(5, stop.Shape);
            Assert.AreEqual(3, stop.Coordinate.Latitude);
            Assert.AreEqual(3, stop.Coordinate.Longitude);

            Assert.IsNotNull(route.ShapeMeta);
            Assert.AreEqual(6, route.ShapeMeta.Length);

            var meta = route.ShapeMeta[0];

            Assert.AreEqual(0, meta.Shape);
            Assert.IsNotNull(meta.Attributes);
            Assert.IsTrue(meta.Attributes.Contains(Itinero.Transit.Constants.TimeOfDayKey,
                                                   ((07 * 3600) + (30 * 60)).ToInvariantString()));
            Assert.AreEqual(0, meta.Time);

            meta = route.ShapeMeta[1];
            Assert.AreEqual(1, meta.Shape);
            Assert.IsNotNull(meta.Attributes);
            Assert.IsTrue(meta.Attributes.Contains(Itinero.Transit.Constants.TimeOfDayKey,
                                                   ((08 * 3600) + (00 * 60)).ToInvariantString()));
            Assert.AreEqual(meta.Time, 30 * 60);

            meta = route.ShapeMeta[2];
            Assert.AreEqual(2, meta.Shape);
            Assert.IsNotNull(meta.Attributes);
            Assert.IsTrue(meta.Attributes.Contains(Itinero.Transit.Constants.TimeOfDayKey,
                                                   ((08 * 3600) + (10 * 60)).ToInvariantString()));
            Assert.AreEqual(meta.Time, 40 * 60);

            meta = route.ShapeMeta[3];
            Assert.AreEqual(3, meta.Shape);
            Assert.IsNotNull(meta.Attributes);
            Assert.IsTrue(meta.Attributes.Contains(Itinero.Transit.Constants.TimeOfDayKey,
                                                   ((08 * 3600) + (10 * 60) + 100).ToInvariantString()));
            Assert.AreEqual(meta.Time, 40 * 60 + 100);

            meta = route.ShapeMeta[4];
            Assert.AreEqual(4, meta.Shape);
            Assert.IsNotNull(meta.Attributes);
            Assert.IsTrue(meta.Attributes.Contains(Itinero.Transit.Constants.TimeOfDayKey,
                                                   ((08 * 3600) + (15 * 60)).ToInvariantString()));
            Assert.AreEqual(meta.Time, 45 * 60);

            meta = route.ShapeMeta[5];
            Assert.AreEqual(5, meta.Shape);
            Assert.IsNotNull(meta.Attributes);
            Assert.IsTrue(meta.Attributes.Contains(Itinero.Transit.Constants.TimeOfDayKey,
                                                   ((08 * 3600) + (25 * 60)).ToInvariantString()));
            Assert.AreEqual(meta.Time, 55 * 60);
        }
Esempio n. 4
0
        /// <summary>
        /// Tries to calculate an earliest arrival route from stop1 to stop2.
        /// </summary>
        public override Result <Route> TryEarliestArrival(DateTime departureTime,
                                                          RouterPoint sourcePoint, Profile sourceProfile, RouterPoint targetPoint, Profile targetProfile,
                                                          EarliestArrivalSettings settings)
        {
            // get the get factor function.
            var sourceGetFactor = _router.GetDefaultGetFactor(sourceProfile);
            var targetGetFactor = _router.GetDefaultGetFactor(targetProfile);

            // create the profile search.
            var tripEnumerator = _db.TransitDb.GetTripsEnumerator();
            var transfersDb    = _db.TransitDb.GetTransfersDb(_transferProfile);
            var profileSearch  = new ProfileSearch(_db.TransitDb, departureTime, transfersDb, _db.TransitDb.GetIsTripPossibleFunc());

            // search for sources.
            var departureTimeSeconds = (uint)(departureTime - departureTime.Date).TotalSeconds;
            var sourceSearch         = new ClosestStopsSearch(_db, sourceProfile, sourceGetFactor, sourcePoint,
                                                              settings.MaxSecondsSource, false);

            sourceSearch.StopFound = (s, t) =>
            {
                profileSearch.SetSourceStop(s, departureTimeSeconds + (uint)t);
                return(false);
            };

            // search for targets.
            var targetSearch = new ClosestStopsSearch(_db, targetProfile, targetGetFactor, targetPoint,
                                                      settings.MaxSecondsTarget, true);

            targetSearch.StopFound = (s, t) =>
            {
                profileSearch.SetTargetStop(s, (uint)t);
                return(false);
            };

            // create bidirectional helper if possible.
            SearchHelper helper = null;
            BidirectionalSearchHelper bidirectionalHelper = null;

            if (sourceProfile.Name == targetProfile.Name)
            { // profiles are the same.
                bidirectionalHelper = new BidirectionalSearchHelper(
                    sourceSearch.Search, targetSearch.Search);
                targetSearch.WasEdgeFound = bidirectionalHelper.TargetWasFound;
            }
            else
            { // profiles are different but the source can still reach the destination.
                helper = new SearchHelper(_router.Db, sourceSearch.Search, sourceProfile, targetPoint);
                sourceSearch.WasEdgeFound = helper.SourceWasFound;
            }

            // run source search.
            sourceSearch.Run();
            if (!sourceSearch.HasRun ||
                !sourceSearch.HasSucceeded)
            {
                return(new Result <Route>("Searching for source stops failed."));
            }

            // run target search.
            targetSearch.Run();
            if (!targetSearch.HasRun ||
                !targetSearch.HasSucceeded)
            {
                return(new Result <Route>("Searching for target stops failed."));
            }

            // run actual profile search.
            profileSearch.Run();
            if (!profileSearch.HasRun ||
                !profileSearch.HasSucceeded)
            {
                return(new Result <Route>("No route found."));
            }

            // build routes.
            var profileSearchRouteBuilder = new ProfileSearchRouteBuilder(profileSearch);

            profileSearchRouteBuilder.Run();
            if (!profileSearchRouteBuilder.HasRun ||
                !profileSearchRouteBuilder.HasSucceeded)
            {
                return(new Result <Route>(string.Format("Route could not be built: {0}.", profileSearchRouteBuilder.ErrorMessage)));
            }

            var sourceWeight  = sourceSearch.GetWeight(profileSearchRouteBuilder.Stops[0]);
            var targetWeight  = targetSearch.GetWeight(profileSearchRouteBuilder.Stops[profileSearchRouteBuilder.Stops.Count - 1]);
            var transitWeight = sourceWeight + profileSearchRouteBuilder.Duration + targetWeight;

            if (bidirectionalHelper != null &&
                bidirectionalHelper.HasSucceeded)
            { // there is a direct route to the target.
                if (transitWeight > bidirectionalHelper.BestWeight)
                {
                    if (!this.PreferTransit || bidirectionalHelper.BestWeight < this.PreferTransitThreshold)
                    { // transit it not preferred or belof threshold.
                        var path = bidirectionalHelper.GetPath();
                        return(new Result <Route>(
                                   CompleteRouteBuilder.Build(_router.Db, sourceProfile, sourcePoint, targetPoint, path)));
                    }
                }
            }
            else if (helper != null &&
                     helper.HasSucceeded)
            { // there is a direct route to the target.
                if (transitWeight > helper.BestWeight)
                {
                    if (!this.PreferTransit || bidirectionalHelper.BestWeight < this.PreferTransitThreshold)
                    { // transit it not preferred or belof threshold.
                        var path = helper.GetPath();
                        return(new Result <Route>(
                                   CompleteRouteBuilder.Build(_router.Db, sourceProfile, sourcePoint, targetPoint, path)));
                    }
                }
            }

            // build source/target routes.
            var sourceRoute = sourceSearch.GetRoute(profileSearchRouteBuilder.Stops[0]);
            var targetRoute = targetSearch.GetRoute(profileSearchRouteBuilder.Stops[profileSearchRouteBuilder.Stops.Count - 1]);

            // concatenate it all.
            var route = sourceRoute.Concatenate(profileSearchRouteBuilder.Route);

            route = route.Concatenate(targetRoute);

            return(new Result <Route>(route));
        }