Example #1
0
        public void TestAddOne()
        {
            var db = new RestrictionsDb(1024);

            db.Add(1, 2, 3);

            var enumerator = db.GetEnumerator();

            Assert.IsTrue(enumerator.MoveTo(1));
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(1, enumerator[0]);
            Assert.AreEqual(2, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);
            Assert.IsFalse(enumerator.MoveNext());

            enumerator = db.GetEnumerator();
            Assert.IsTrue(enumerator.MoveTo(2));
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(1, enumerator[0]);
            Assert.AreEqual(2, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);
            Assert.IsFalse(enumerator.MoveNext());

            enumerator = db.GetEnumerator();
            Assert.IsTrue(enumerator.MoveTo(3));
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(1, enumerator[0]);
            Assert.AreEqual(2, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);
            Assert.IsFalse(enumerator.MoveNext());
        }
Example #2
0
        /// <summary>
        /// Gets the get restriction function for the given profile.
        /// </summary>
        /// <param name="db">The router db.</param>
        /// <param name="profile">The vehicle profile.</param>
        /// <param name="first">When true, only restrictions starting with given vertex, when false only restrictions ending with given vertex already reversed, when null all restrictions are returned.</param>
        public static Func <uint, IEnumerable <uint[]> > GetGetRestrictions(this RouterDb db, Profiles.Profile profile, bool?first)
        {
            var vehicleTypes = new List <string>(profile.VehicleTypes);

            vehicleTypes.Insert(0, string.Empty);

            var restrictionDbs = new RestrictionsDb[vehicleTypes.Count];

            for (var i = 0; i < vehicleTypes.Count; i++)
            {
                RestrictionsDb restrictionsDb;
                if (db.TryGetRestrictions(vehicleTypes[i], out restrictionsDb))
                {
                    restrictionDbs[i] = restrictionsDb;
                }
            }

            return((vertex) =>
            {
                var restrictionList = new List <uint[]>();
                for (var i = 0; i < restrictionDbs.Length; i++)
                {
                    var restrictionsDb = restrictionDbs[i];
                    if (restrictionsDb == null)
                    {
                        continue;
                    }

                    var enumerator = restrictionsDb.GetEnumerator();
                    if (enumerator.MoveTo(vertex))
                    {
                        while (enumerator.MoveNext())
                        {
                            if (first.HasValue && first.Value)
                            {
                                if (enumerator[0] == vertex)
                                {
                                    restrictionList.Add(enumerator.ToArray());
                                }
                            }
                            else if (first.HasValue && !first.Value)
                            {
                                if (enumerator[(int)enumerator.Count - 1] == vertex)
                                {
                                    var array = enumerator.ToArray();
                                    array.Reverse();
                                    restrictionList.Add(array);
                                }
                            }
                            else
                            {
                                restrictionList.Add(enumerator.ToArray());
                            }
                        }
                    }
                }
                return restrictionList;
            });
        }
Example #3
0
        /// <summary>
        /// Setups default add-on processors.
        /// </summary>
        private void InitializeDefaultProcessors(bool processRestrictions)
        {
            // add all vehicle relation processors.
            foreach (var vehicle in _vehicleCache.Vehicles)
            {
                if (vehicle is Itinero.Profiles.DynamicVehicle)
                {
                    var dynamicVehicle = vehicle as Itinero.Profiles.DynamicVehicle;
                    this.Processors.Add(new DynamicVehicleRelationTagProcessor(dynamicVehicle));
                    this.Processors.Add(new DynamicVehicleNodeTagProcessor(_db, dynamicVehicle, (node) =>
                    {
                        var index = _nodeIndex.TryGetIndex(node.Id.Value);
                        if (index == long.MaxValue)
                        { // node is not a vertex.
                            return(Constants.NO_VERTEX);
                        }
                        return(this.AddCoreNode(node.Id.Value, node.Latitude.Value, node.Longitude.Value));
                    }));
                }
            }

            // add restriction processor if needed.
            if (processRestrictions)
            {
                this.Processors.Add(new RestrictionProcessor(_vehicleTypes, (node) =>
                {
                    uint vertex;
                    if (!_nodeIndex.TryGetCoreNode(node, out vertex))
                    {
                        return(uint.MaxValue);
                    }
                    return(vertex);
                },
                                                             (node) =>
                {
                    var index = _nodeIndex.TryGetIndex(node.Id.Value);
                    if (index == long.MaxValue)
                    { // node is not a vertex.
                        return(Constants.NO_VERTEX);
                    }
                    return(this.AddCoreNode(node.Id.Value, node.Latitude.Value, node.Longitude.Value));
                },
                                                             (vehicleType, sequence) =>
                {
                    if (vehicleType == null)
                    {
                        vehicleType = string.Empty;
                    }
                    RestrictionsDb restrictions;
                    if (!_db.TryGetRestrictions(vehicleType, out restrictions))
                    {
                        restrictions = new RestrictionsDb();
                        _db.AddRestrictions(vehicleType, restrictions);
                    }

                    restrictions.Add(sequence.ToArray());
                }));
            }
        }
Example #4
0
        public void TestAddRestrictionDb()
        {
            var routerDb     = new RouterDb();
            var restrictions = new RestrictionsDb();

            routerDb.AddRestrictions("vehicle", restrictions);

            Assert.IsTrue(routerDb.TryGetRestrictions("vehicle", out restrictions));
        }
Example #5
0
        public void TestAddMultipleSameStart()
        {
            var db = new RestrictionsDb(1024);

            db.Add(1, 2, 3);
            db.Add(1, 2, 3, 4);
            db.Add(1, 2, 3, 4, 5);

            var enumerator = db.GetEnumerator();

            Assert.IsTrue(enumerator.MoveTo(1));
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(1, enumerator[0]);
            Assert.AreEqual(2, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(4, enumerator.Count);
            Assert.AreEqual(1, enumerator[0]);
            Assert.AreEqual(2, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);
            Assert.AreEqual(4, enumerator[3]);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(5, enumerator.Count);
            Assert.AreEqual(1, enumerator[0]);
            Assert.AreEqual(2, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);
            Assert.AreEqual(4, enumerator[3]);
            Assert.AreEqual(5, enumerator[4]);
            Assert.IsFalse(enumerator.MoveNext());

            db.Switch(6, 1);

            Assert.IsTrue(enumerator.MoveTo(6));
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(6, enumerator[0]);
            Assert.AreEqual(2, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(4, enumerator.Count);
            Assert.AreEqual(6, enumerator[0]);
            Assert.AreEqual(2, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);
            Assert.AreEqual(4, enumerator[3]);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(5, enumerator.Count);
            Assert.AreEqual(6, enumerator[0]);
            Assert.AreEqual(2, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);
            Assert.AreEqual(4, enumerator[3]);
            Assert.AreEqual(5, enumerator[4]);
            Assert.IsFalse(enumerator.MoveNext());
        }
        private bool _firstPass = true; // flag for first/second pass.

        /// <summary>
        /// Setups default add-on processors.
        /// </summary>
        private void InitializeDefaultProcessors(bool processRestrictions)
        {
            // add all vehicle relation processors.
            foreach (var vehicle in _vehicleCache.Vehicles)
            {
                if (vehicle is Itinero.Profiles.DynamicVehicle)
                {
                    this.Processors.Add(new DynamicVehicleRelationTagProcessor(vehicle as Itinero.Profiles.DynamicVehicle));
                }
            }

            // add restriction processor if needed.
            if (processRestrictions)
            {
                this.Processors.Add(new RestrictionProcessor(_vehicleTypes, (node) =>
                {
                    uint vertex;
                    if (!_nodeIndex.TryGetCoreNode(node, out vertex))
                    {
                        return(uint.MaxValue);
                    }
                    return(vertex);
                },
                                                             (vehicleType, sequence) =>
                {
                    if (vehicleType == null)
                    {
                        vehicleType = string.Empty;
                    }
                    RestrictionsDb restrictions;
                    if (!_db.TryGetRestrictions(vehicleType, out restrictions))
                    {
                        restrictions = new RestrictionsDb();
                        _db.AddRestrictions(vehicleType, restrictions);
                    }

                    restrictions.Add(sequence.ToArray());
                }));
            }
        }
        /// <summary>
        /// Setups default add-on processors.
        /// </summary>
        private void InitializeDefaultProcessors(bool processRestrictions)
        {
            // check for bicycle profile and add cycle network processor by default.
            if (_vehicles.FirstOrDefault(x => x.UniqueName == "Bicycle") != null &&
                this.Processors.FirstOrDefault(x => x.GetType().Equals(typeof(CycleNetworkProcessor))) == null)
            { // bicycle profile present and processor not there yet, add it here.
                this.Processors.Add(new CycleNetworkProcessor());
            }

            // add restriction processor if needed.
            if (processRestrictions)
            {
                this.Processors.Add(new RestrictionProcessor(_vehicleTypes, (node) =>
                {
                    uint vertex;
                    if (!_coreNodeIdMap.TryGetFirst(node, out vertex))
                    {
                        return(uint.MaxValue);
                    }
                    return(vertex);
                },
                                                             (vehicleType, sequence) =>
                {
                    if (vehicleType == null)
                    {
                        vehicleType = string.Empty;
                    }
                    RestrictionsDb restrictions;
                    if (!_db.TryGetRestrictions(vehicleType, out restrictions))
                    {
                        restrictions = new RestrictionsDb();
                        _db.AddRestrictions(vehicleType, restrictions);
                    }

                    restrictions.Add(sequence.ToArray());
                }));
            }
        }
        /// <summary>
        /// Loads a test network from geojson.
        /// </summary>
        public static void LoadTestNetwork(this RouterDb db, string geoJson, float tolerance = 20)
        {
            var geoJsonReader = new NetTopologySuite.IO.GeoJsonReader();
            var features      = geoJsonReader.Read <FeatureCollection>(geoJson);

            foreach (var feature in features.Features)
            {
                if (feature.Geometry is Point)
                {
                    var  point = feature.Geometry as Point;
                    uint id;
                    if (feature.Attributes.Exists("id") &&
                        uint.TryParse(feature.Attributes["id"].ToInvariantString(), out id))
                    { // has and id, add as vertex.
                        db.Network.AddVertex(id,
                                             (float)point.Coordinate.Y,
                                             (float)point.Coordinate.X);
                    }
                }
            }

            foreach (var feature in features.Features)
            {
                if (feature.Geometry is LineString)
                {
                    if (feature.Attributes.Contains("restriction", "yes"))
                    {
                        continue;
                    }

                    var line    = feature.Geometry as LineString;
                    var profile = new Itinero.Attributes.AttributeCollection();
                    var names   = feature.Attributes.GetNames();
                    foreach (var name in names)
                    {
                        if (!name.StartsWith("meta:") &&
                            !name.StartsWith("stroke"))
                        {
                            profile.AddOrReplace(name, feature.Attributes[name].ToInvariantString());
                        }
                    }
                    var meta = new Itinero.Attributes.AttributeCollection();
                    foreach (var name in names)
                    {
                        if (name.StartsWith("meta:"))
                        {
                            meta.AddOrReplace(name.Remove(0, "meta:".Length),
                                              feature.Attributes[name].ToInvariantString());
                        }
                    }

                    var profileId = db.EdgeProfiles.Add(profile);
                    var metaId    = db.EdgeMeta.Add(meta);

                    var vertex1 = db.SearchVertexFor(
                        (float)line.Coordinates[0].Y,
                        (float)line.Coordinates[0].X, tolerance);
                    var distance = 0.0;
                    var shape    = new List <Coordinate>();
                    for (var i = 1; i < line.Coordinates.Length; i++)
                    {
                        var vertex2 = db.SearchVertexFor(
                            (float)line.Coordinates[i].Y,
                            (float)line.Coordinates[i].X, tolerance);
                        distance += Coordinate.DistanceEstimateInMeter(
                            (float)line.Coordinates[i - 1].Y, (float)line.Coordinates[i - 1].X,
                            (float)line.Coordinates[i].Y, (float)line.Coordinates[i].X);
                        if (vertex2 == Itinero.Constants.NO_VERTEX)
                        { // add this point as shapepoint.
                            shape.Add(line.Coordinates[i].FromCoordinate());
                            continue;
                        }
                        db.Network.AddEdge(vertex1, vertex2, new Itinero.Data.Network.Edges.EdgeData()
                        {
                            Distance = (float)distance,
                            MetaId   = metaId,
                            Profile  = (ushort)profileId
                        }, shape);
                        shape.Clear();
                        vertex1  = vertex2;
                        distance = 0;
                    }
                }
            }

            foreach (var feature in features.Features)
            {
                if (feature.Geometry is LineString &&
                    feature.Attributes.Contains("restriction", "yes"))
                {
                    var line     = feature.Geometry as LineString;
                    var sequence = new List <uint>();
                    sequence.Add(db.SearchVertexFor(
                                     (float)line.Coordinates[0].Y,
                                     (float)line.Coordinates[0].X, tolerance));
                    for (var i = 1; i < line.Coordinates.Length; i++)
                    {
                        sequence.Add(db.SearchVertexFor(
                                         (float)line.Coordinates[i].Y,
                                         (float)line.Coordinates[i].X, tolerance));
                    }

                    var vehicleType = string.Empty;
                    if (!feature.Attributes.TryGetValueAsString("vehicle_type", out vehicleType))
                    {
                        vehicleType = string.Empty;
                    }
                    RestrictionsDb restrictions;
                    if (!db.TryGetRestrictions(vehicleType, out restrictions))
                    {
                        restrictions = new RestrictionsDb();
                        db.AddRestrictions(vehicleType, restrictions);
                    }

                    restrictions.Add(sequence.ToArray());
                }
            }
        }
        public void TestNetwork12()
        {
            var routerDb = new RouterDb();

            routerDb.LoadTestNetwork(
                Assembly.GetExecutingAssembly().GetManifestResourceStream(
                    "Itinero.Test.test_data.networks.network12.geojson"));

            Assert.AreEqual(8, routerDb.Network.VertexCount);
            Assert.AreEqual(8, routerDb.Network.EdgeCount);

            var vertex0 = routerDb.Network.GetVertex(0);
            var vertex1 = routerDb.Network.GetVertex(1);
            var vertex2 = routerDb.Network.GetVertex(2);
            var vertex3 = routerDb.Network.GetVertex(3);
            var vertex4 = routerDb.Network.GetVertex(4);
            var vertex5 = routerDb.Network.GetVertex(5);
            var vertex6 = routerDb.Network.GetVertex(6);
            var vertex7 = routerDb.Network.GetVertex(7);
            var vertex8 = routerDb.Network.GetVertex(8);
            var vertex9 = routerDb.Network.GetVertex(9);

            var edge = routerDb.Network.GetEdgeEnumerator(0).First(x => x.To == 1);

            Assert.AreEqual(Coordinate.DistanceEstimateInMeter(vertex0, vertex1), edge.Data.Distance, 5);
            var profile = routerDb.EdgeProfiles.Get(edge.Data.Profile);

            Assert.AreEqual(1, profile.Count);
            Assert.IsTrue(profile.Contains("highway", "residential"));

            edge = routerDb.Network.GetEdgeEnumerator(1).First(x => x.To == 4);
            Assert.AreEqual(Coordinate.DistanceEstimateInMeter(vertex1, vertex4), edge.Data.Distance, 5);
            profile = routerDb.EdgeProfiles.Get(edge.Data.Profile);
            Assert.AreEqual(1, profile.Count);
            Assert.IsTrue(profile.Contains("highway", "residential"));

            edge = routerDb.Network.GetEdgeEnumerator(1).First(x => x.To == 2);
            Assert.AreEqual(Coordinate.DistanceEstimateInMeter(vertex1, vertex2), edge.Data.Distance, 5);
            profile = routerDb.EdgeProfiles.Get(edge.Data.Profile);
            Assert.AreEqual(1, profile.Count);
            Assert.IsTrue(profile.Contains("highway", "residential"));

            edge = routerDb.Network.GetEdgeEnumerator(2).First(x => x.To == 3);
            Assert.AreEqual(Coordinate.DistanceEstimateInMeter(vertex2, vertex3), edge.Data.Distance, 5);
            profile = routerDb.EdgeProfiles.Get(edge.Data.Profile);
            Assert.AreEqual(1, profile.Count);
            Assert.IsTrue(profile.Contains("highway", "residential"));

            edge = routerDb.Network.GetEdgeEnumerator(2).First(x => x.To == 5);
            Assert.AreEqual(Coordinate.DistanceEstimateInMeter(vertex2, vertex5), edge.Data.Distance, 5);
            profile = routerDb.EdgeProfiles.Get(edge.Data.Profile);
            Assert.AreEqual(1, profile.Count);
            Assert.IsTrue(profile.Contains("highway", "residential"));

            edge = routerDb.Network.GetEdgeEnumerator(4).First(x => x.To == 5);
            Assert.AreEqual(Coordinate.DistanceEstimateInMeter(vertex4, vertex5), edge.Data.Distance, 5);
            profile = routerDb.EdgeProfiles.Get(edge.Data.Profile);
            Assert.AreEqual(1, profile.Count);
            Assert.IsTrue(profile.Contains("highway", "residential"));

            edge = routerDb.Network.GetEdgeEnumerator(4).First(x => x.To == 6);
            Assert.AreEqual(Coordinate.DistanceEstimateInMeter(vertex4, vertex6), edge.Data.Distance, 5);
            profile = routerDb.EdgeProfiles.Get(edge.Data.Profile);
            Assert.AreEqual(1, profile.Count);
            Assert.IsTrue(profile.Contains("highway", "residential"));

            edge = routerDb.Network.GetEdgeEnumerator(5).First(x => x.To == 7);
            Assert.AreEqual(Coordinate.DistanceEstimateInMeter(vertex5, vertex7), edge.Data.Distance, 5);
            profile = routerDb.EdgeProfiles.Get(edge.Data.Profile);
            Assert.AreEqual(1, profile.Count);
            Assert.IsTrue(profile.Contains("highway", "residential"));

            RestrictionsDb restrictions = null;

            Assert.IsTrue(routerDb.TryGetRestrictions("motorcar", out restrictions));
            var enumerator = restrictions.GetEnumerator();

            Assert.IsTrue(enumerator.MoveTo(1));
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(1, enumerator[0]);
        }
Example #10
0
        /// <summary>
        /// Deserializes a database from the given stream.
        /// </summary>
        public static RouterDb Deserialize(Stream stream, RouterDbProfile profile)
        {
            // deserialize all basic data.
            // version1: OsmSharp.Routing state of layout.
            // version2: Added ShortcutsDbs.
            // version3: Add advanced profile serialization.
            // version4: Added missing restriction dbs.
            var version = stream.ReadByte();

            if (version != 1 && version != 2 && version != 3 && version != 4)
            {
                throw new Exception(string.Format("Cannot deserialize routing db: Invalid version #: {0}.", version));
            }

            var guidBytes = new byte[16];

            stream.Read(guidBytes, 0, 16);
            var guid = new Guid(guidBytes);

            var supportedVehicleInstances = new List <Vehicle>();

            if (version <= 2)
            { // just contains vehicle names.
                var supportedVehicles = stream.ReadWithSizeStringArray();
                foreach (var vehicleName in supportedVehicles)
                {
                    Profile vehicleProfile;
                    if (Profile.TryGet(vehicleName, out vehicleProfile))
                    {
                        supportedVehicleInstances.Add(vehicleProfile.Parent);
                    }
                    else
                    {
                        Itinero.Logging.Logger.Log("RouterDb", Logging.TraceEventType.Warning, "Vehicle with name {0} was not found, register all vehicle profiles before deserializing the router db.",
                                                   vehicleName);
                    }
                }
            }
            else
            { // contains the full vehicles.
                var lengthBytes = new byte[4];
                stream.Read(lengthBytes, 0, 4);
                var size = BitConverter.ToInt32(lengthBytes, 0);
                for (var i = 0; i < size; i++)
                {
                    var vehicle = Vehicle.Deserialize(stream);
                    supportedVehicleInstances.Add(vehicle);
                    vehicle.Register();
                }
            }

            var metaDb        = stream.ReadWithSizeAttributesCollection();
            var shorcutsCount = (int)0;

            if (version >= 2)
            { // when version < 1 there are no shortcuts and thus no shortcut count.
                shorcutsCount = stream.ReadByte();
            }
            var contractedCount = stream.ReadByte();

            var restrictionDbCount = 0;

            if (version >= 4)
            {
                restrictionDbCount = stream.ReadByte();
            }

            var profiles = AttributesIndex.Deserialize(new LimitedStream(stream), true);
            var meta     = AttributesIndex.Deserialize(new LimitedStream(stream), true);
            var network  = RoutingNetwork.Deserialize(stream, profile == null ? null : profile.RoutingNetworkProfile);

            // create router db.
            var routerDb = new RouterDb(guid, network, profiles, meta, metaDb, supportedVehicleInstances.ToArray());

            // read all shortcut dbs.
            for (var i = 0; i < shorcutsCount; i++)
            {
                var shortcutsName = stream.ReadWithSizeString();
                var shorcutsDb    = ShortcutsDb.Deserialize(stream);
                routerDb._shortcutsDbs[shortcutsName] = shorcutsDb;
            }

            // read all contracted versions.
            for (var i = 0; i < contractedCount; i++)
            {
                var profileName = stream.ReadWithSizeString();
                var contracted  = ContractedDb.Deserialize(stream, profile == null ? null : profile.ContractedDbProfile);
                routerDb._contracted[profileName] = contracted;
            }

            // read all restriction dbs.
            for (var i = 0; i < restrictionDbCount; i++)
            {
                var restrictionDbName = stream.ReadWithSizeString();
                var restrictionDb     = RestrictionsDb.Deserialize(stream, profile == null ? null : profile.RestrictionDbProfile);
                routerDb._restrictionDbs[restrictionDbName] = restrictionDb;
            }

            return(routerDb);
        }
Example #11
0
 /// <summary>
 /// Adds the restrictions for the given vehicle type.
 /// </summary>
 public void AddRestrictions(string vehicleType, RestrictionsDb restrictions)
 {
     _restrictionDbs[vehicleType] = restrictions;
 }
Example #12
0
 /// <summary>
 /// Returns true if this routing db has a restriction db for the given vehicle type.
 /// </summary>
 public bool TryGetRestrictions(string vehicleType, out RestrictionsDb restrictions)
 {
     return(_restrictionDbs.TryGetValue(vehicleType, out restrictions));
 }
Example #13
0
        public void TestSerializeDeserializeNoCacheProfile()
        {
            var db = new RestrictionsDb(1024);

            db.Add(1, 2, 3);
            db.Add(10, 11, 12);
            db.Add(10, 111, 222);
            db.Add(12, 2, 3);

            var stream = new MemoryStream();
            var size   = db.Serialize(stream);

            Assert.AreEqual(stream.Position, size);

            stream.Seek(0, SeekOrigin.Begin);
            db = RestrictionsDb.Deserialize(stream, RestrictionsDbProfile.NoCache);

            var enumerator = db.GetEnumerator();

            Assert.IsTrue(enumerator.MoveTo(12));
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(10, enumerator[0]);
            Assert.AreEqual(11, enumerator[1]);
            Assert.AreEqual(12, enumerator[2]);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(12, enumerator[0]);
            Assert.AreEqual(2, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);

            enumerator = db.GetEnumerator();
            Assert.IsTrue(enumerator.MoveTo(3));
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(1, enumerator[0]);
            Assert.AreEqual(2, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(12, enumerator[0]);
            Assert.AreEqual(2, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);

            db = new RestrictionsDb(1024);
            db.Add(1, 2, 3);
            db.Add(1, 2, 3, 4);

            stream.Dispose();
            stream = new MemoryStream();
            size   = db.Serialize(stream);
            Assert.AreEqual(stream.Position, size);

            stream.Seek(0, SeekOrigin.Begin);
            db = RestrictionsDb.Deserialize(stream, RestrictionsDbProfile.NoCache);

            enumerator = db.GetEnumerator();
            Assert.IsTrue(enumerator.MoveTo(1));
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(1, enumerator[0]);
            Assert.AreEqual(2, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(4, enumerator.Count);
            Assert.AreEqual(1, enumerator[0]);
            Assert.AreEqual(2, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);
            Assert.AreEqual(4, enumerator[3]);
            Assert.IsFalse(enumerator.MoveNext());
        }
Example #14
0
        public void TestSwitch()
        {
            var db = new RestrictionsDb(1024);

            db.Add(2, 1, 3);
            db.Switch(2, 1);

            var enumerator = db.GetEnumerator();

            Assert.IsTrue(enumerator.MoveTo(1));
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(1, enumerator[0]);
            Assert.AreEqual(2, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);
            Assert.IsFalse(enumerator.MoveNext());

            enumerator = db.GetEnumerator();
            Assert.IsTrue(enumerator.MoveTo(3));
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(1, enumerator[0]);
            Assert.AreEqual(2, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);
            Assert.IsFalse(enumerator.MoveNext());

            db = new RestrictionsDb(1024);
            db.Add(1, 2, 3);
            db.Add(1, 2, 3, 4);
            db.Switch(1, 10);

            enumerator = db.GetEnumerator();
            Assert.IsTrue(enumerator.MoveTo(10));
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(10, enumerator[0]);
            Assert.AreEqual(2, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(4, enumerator.Count);
            Assert.AreEqual(10, enumerator[0]);
            Assert.AreEqual(2, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);
            Assert.AreEqual(4, enumerator[3]);

            db.Switch(2, 20);

            enumerator = db.GetEnumerator();
            Assert.IsTrue(enumerator.MoveTo(10));
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(10, enumerator[0]);
            Assert.AreEqual(20, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(4, enumerator.Count);
            Assert.AreEqual(10, enumerator[0]);
            Assert.AreEqual(20, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);
            Assert.AreEqual(4, enumerator[3]);

            db.Switch(3, 30);

            enumerator = db.GetEnumerator();
            Assert.IsTrue(enumerator.MoveTo(10));
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(10, enumerator[0]);
            Assert.AreEqual(20, enumerator[1]);
            Assert.AreEqual(30, enumerator[2]);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(4, enumerator.Count);
            Assert.AreEqual(10, enumerator[0]);
            Assert.AreEqual(20, enumerator[1]);
            Assert.AreEqual(30, enumerator[2]);
            Assert.AreEqual(4, enumerator[3]);

            db.Switch(4, 40);

            enumerator = db.GetEnumerator();
            Assert.IsTrue(enumerator.MoveTo(10));
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(10, enumerator[0]);
            Assert.AreEqual(20, enumerator[1]);
            Assert.AreEqual(30, enumerator[2]);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(4, enumerator.Count);
            Assert.AreEqual(10, enumerator[0]);
            Assert.AreEqual(20, enumerator[1]);
            Assert.AreEqual(30, enumerator[2]);
            Assert.AreEqual(40, enumerator[3]);
            Assert.IsFalse(enumerator.MoveNext());

            db = new RestrictionsDb(1024);
            db.Add(1, 2, 3);
            db.Add(3, 2, 1);
            db.Add(3, 2, 1, 4);
            db.Add(1, 2, 3, 4);
            db.Switch(1, 10);
            db.Switch(2, 20);
            db.Switch(3, 30);
            db.Switch(4, 40);

            enumerator = db.GetEnumerator();
            Assert.IsTrue(enumerator.MoveTo(10));
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(10, enumerator[0]);
            Assert.AreEqual(20, enumerator[1]);
            Assert.AreEqual(30, enumerator[2]);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(30, enumerator[0]);
            Assert.AreEqual(20, enumerator[1]);
            Assert.AreEqual(10, enumerator[2]);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(4, enumerator.Count);
            Assert.AreEqual(30, enumerator[0]);
            Assert.AreEqual(20, enumerator[1]);
            Assert.AreEqual(10, enumerator[2]);
            Assert.AreEqual(40, enumerator[3]);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(4, enumerator.Count);
            Assert.AreEqual(10, enumerator[0]);
            Assert.AreEqual(20, enumerator[1]);
            Assert.AreEqual(30, enumerator[2]);
            Assert.AreEqual(40, enumerator[3]);
            Assert.IsFalse(enumerator.MoveNext());

            enumerator = db.GetEnumerator();
            Assert.IsTrue(enumerator.MoveTo(30));
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(10, enumerator[0]);
            Assert.AreEqual(20, enumerator[1]);
            Assert.AreEqual(30, enumerator[2]);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(30, enumerator[0]);
            Assert.AreEqual(20, enumerator[1]);
            Assert.AreEqual(10, enumerator[2]);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(4, enumerator.Count);
            Assert.AreEqual(30, enumerator[0]);
            Assert.AreEqual(20, enumerator[1]);
            Assert.AreEqual(10, enumerator[2]);
            Assert.AreEqual(40, enumerator[3]);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(4, enumerator.Count);
            Assert.AreEqual(10, enumerator[0]);
            Assert.AreEqual(20, enumerator[1]);
            Assert.AreEqual(30, enumerator[2]);
            Assert.AreEqual(40, enumerator[3]);
            Assert.IsFalse(enumerator.MoveNext());

            db = new RestrictionsDb(1024);
            db.Add(2, 1, 3);
            db.Switch(4, 1);
            db.Switch(4, 8);

            enumerator = db.GetEnumerator();
            Assert.IsTrue(enumerator.MoveTo(2));
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(2, enumerator[0]);
            Assert.AreEqual(8, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);
            Assert.IsFalse(enumerator.MoveNext());

            enumerator = db.GetEnumerator();
            Assert.IsTrue(enumerator.MoveTo(3));
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(3, enumerator.Count);
            Assert.AreEqual(2, enumerator[0]);
            Assert.AreEqual(8, enumerator[1]);
            Assert.AreEqual(3, enumerator[2]);
            Assert.IsFalse(enumerator.MoveNext());
        }
Example #15
0
        /// <summary>
        /// Setups default add-on processors.
        /// </summary>
        private void InitializeDefaultProcessors(bool processRestrictions)
        {
            // add all vehicle relation processors.
            bool isDynamic = false;

            foreach (var vehicle in _vehicleCache.Vehicles)
            {
                if (!(vehicle is DynamicVehicle dynamicVehicle))
                {
                    continue;
                }

                isDynamic = true;
                this.Processors.Add(new DynamicVehicleRelationTagProcessor(dynamicVehicle));
                this.Processors.Add(new DynamicVehicleNodeTagProcessor(_db, dynamicVehicle, MarkCore));
                if (processRestrictions)
                {
                    this.Processors.Add(
                        new DynamicVehicleNodeRestrictionProcessor(_db, dynamicVehicle, MarkCore, FoundRestriction));
                }
            }

            // add restriction processor if needed.
            if (processRestrictions)
            {
                // add node-based restriction processor if non of the profiles is dynamic.
                if (!isDynamic)
                {
                    this.Processors.Add(new NodeRestrictionProcessor(MarkCore, FoundRestriction));
                }

                this.Processors.Add(new RestrictionProcessor(_vehicleTypes, (node) =>
                {
                    if (!_nodeIndex.TryGetCoreNode(node, out var vertex))
                    {
                        return(uint.MaxValue);
                    }
                    return(vertex);
                }, MarkCore, FoundRestriction));
            }

            // a function to handle callbacks from processors handling restrictions.
            void FoundRestriction(string vehicleType, List <uint> sequence)
            {
                if (vehicleType == null)
                {
                    vehicleType = string.Empty;
                }
                if (!_db.TryGetRestrictions(vehicleType, out var restrictions))
                {
                    restrictions = new RestrictionsDb();
                    _db.AddRestrictions(vehicleType, restrictions);
                }

                restrictions.Add(sequence.ToArray());
            }

            // a function to handle callbacks from processor that want to mark nodes as core.
            uint MarkCore(Node node)
            {
                var index = _nodeIndex.TryGetIndex(node.Id.Value);

                if (index == long.MaxValue)
                { // node is not a vertex.
                    return(Itinero.Constants.NO_VERTEX);
                }
                return(this.AddCoreNode(node.Id.Value, (float)node.Latitude.Value, (float)node.Longitude.Value));
            }
        }
Example #16
0
 /// <summary>
 /// Creates a new restriction db meta-object.
 /// </summary>
 internal RestrictionsDbMeta(string vehicle, RestrictionsDb db)
 {
     this.Vehicle        = vehicle;
     this.RestrictionsDb = db;
 }