/// <summary> /// Called when a backward vertex was found. /// </summary> /// <returns></returns> private bool BackwardVertexFound(Dykstra <T> dykstra, int i, uint pointer, uint vertex, T weight) { Dictionary <int, EdgePath <T> > bucket; if (_buckets.TryGetValue(vertex, out bucket)) { foreach (var pair in bucket) { var existing = _solutions[pair.Key][i]; var total = _weightHandler.Add(weight, pair.Value.Weight); var existingWeight = _weightHandler.Infinite; if (existing.Path != null) { existingWeight = existing.Path.Weight; } else if (existing.Path1 != null && existing.Path2 != null) { existingWeight = _weightHandler.Add(existing.Path1.Weight, existing.Path2.Weight); } if (_weightHandler.IsSmallerThan(total, existingWeight)) { // append the backward to the forward path. _solutions[pair.Key][i] = new Solution() { Path1 = pair.Value, Path2 = dykstra.GetPath(pointer) }; } } } return(false); }
/// <summary> /// Called when a forward vertex was found. /// </summary> /// <returns></returns> private bool ForwardVertexFound(Dykstra <T> dykstra, int i, uint pointer, uint vertex, T weight) { Dictionary <int, EdgePath <T> > bucket; if (!_buckets.TryGetValue(vertex, out bucket)) { bucket = new Dictionary <int, EdgePath <T> >(); _buckets.Add(vertex, bucket); bucket[i] = dykstra.GetPath(pointer); } else { EdgePath <T> existing; if (bucket.TryGetValue(i, out existing)) { if (_weightHandler.IsSmallerThan(weight, existing.Weight)) { bucket[i] = dykstra.GetPath(pointer); } } else { bucket[i] = dykstra.GetPath(pointer); } } return(false); }
/// <summary> /// Executes the actual run. /// </summary> protected override void DoRun() { _solutions = new Solution[_sources.Length][]; for (var s = 0; s < _sources.Length; s++) { _solutions[s] = new Solution[_targets.Length]; } // do forward searches into buckets. for (var i = 0; i < _sources.Length; i++) { var forward = new Dykstra <T>(_graph, _weightHandler, _sources[i], false, _max); forward.WasFound += (p, v, w) => { return(this.ForwardVertexFound(forward, i, p, v, w)); }; forward.Run(); } // do backward searches into buckets. for (var i = 0; i < _targets.Length; i++) { var backward = new Dykstra <T>(_graph, _weightHandler, _targets[i], true, _max); backward.WasFound += (p, v, w) => { return(this.BackwardVertexFound(backward, i, p, v, w)); }; backward.Run(); } this.HasSucceeded = true; }
/// <summary> /// Executes the actual algorithm. /// </summary> protected override void DoRun() { // create dykstra algorithm. // search forward starting from sourcePaths with no restrictions. var dykstra = new Dykstra(_geometricGraph.Graph, _getFactor, v => Constants.NO_VERTEX, _source, _limitInSeconds, false); dykstra.WasEdgeFound += (v1, v2, w1, w2, e, length) => { if (Visit == null) { return(false); } // Calculate weight at start vertex. uint edgeId; if (e > 0) { edgeId = (uint)e - 1; } else { edgeId = (uint)((-e) - 1); } var edge = _geometricGraph.GetEdge(edgeId); var shape = _geometricGraph.GetShape(edge); Visit?.Invoke(e, v1, w1, v2, w2, shape); return(false); // return false, returning true stops the search! }; dykstra.Run(); }
public void RoutingRegressionTest1() { var interpreter = new OsmRoutingInterpreter(); var tagsIndex = new TagsTableCollectionIndex(); // do the data processing. var memoryData = new DynamicGraphRouterDataSource<LiveEdge>(tagsIndex); var targetData = new LiveGraphOsmStreamTarget(memoryData, interpreter, tagsIndex); var dataProcessorSource = new XmlOsmStreamSource( Assembly.GetExecutingAssembly().GetManifestResourceStream("OsmSharp.Test.Unittests.test_routing_regression1.osm")); var sorter = new OsmStreamFilterSort(); sorter.RegisterSource(dataProcessorSource); targetData.RegisterSource(sorter); targetData.Pull(); var basicRouter = new Dykstra(); var router = Router.CreateLiveFrom(memoryData, basicRouter, interpreter); // resolve the three points in question. var point35 = new GeoCoordinate(51.01257, 4.000753); var point35resolved = router.Resolve(Vehicle.Car, point35); var point45 = new GeoCoordinate(51.01315, 3.999588); var point45resolved = router.Resolve(Vehicle.Car, point45); // route between 35 and 45. var routebefore = router.Calculate(Vehicle.Car, point35resolved, point45resolved); // route between 35 and 45. var routeafter = router.Calculate(Vehicle.Car, point35resolved, point45resolved); Assert.AreEqual(routebefore.TotalDistance, routeafter.TotalDistance); }
public void RoutingRegressionTest1() { var interpreter = new OsmRoutingInterpreter(); var tagsIndex = new TagsTableCollectionIndex(); // do the data processing. var memoryData = new DynamicGraphRouterDataSource <LiveEdge>(tagsIndex); var targetData = new LiveGraphOsmStreamTarget(memoryData, interpreter, tagsIndex); var dataProcessorSource = new XmlOsmStreamSource( Assembly.GetExecutingAssembly().GetManifestResourceStream("OsmSharp.Test.Unittests.test_routing_regression1.osm")); var sorter = new OsmStreamFilterSort(); sorter.RegisterSource(dataProcessorSource); targetData.RegisterSource(sorter); targetData.Pull(); var basicRouter = new Dykstra(); var router = Router.CreateLiveFrom(memoryData, basicRouter, interpreter); // resolve the three points in question. var point35 = new GeoCoordinate(51.01257, 4.000753); var point35resolved = router.Resolve(Vehicle.Car, point35); var point45 = new GeoCoordinate(51.01315, 3.999588); var point45resolved = router.Resolve(Vehicle.Car, point45); // route between 35 and 45. var routebefore = router.Calculate(Vehicle.Car, point35resolved, point45resolved); // route between 35 and 45. var routeafter = router.Calculate(Vehicle.Car, point35resolved, point45resolved); Assert.AreEqual(routebefore.TotalDistance, routeafter.TotalDistance); }
/// <summary> /// Creates a new bidirectional search helper. /// </summary> public BidirectionalSearchHelper(Dykstra sourceSearch, Dykstra targetSearch) { _sourceSearch = sourceSearch; _targetSearch = targetSearch; this.HasSucceeded = false; }
/// <summary> /// Tests routing from a serialized routing file. /// </summary> /// <param name="name"></param> /// <param name="stream"></param> /// <param name="testCount"></param> public static void TestSerializedRouting(string name, Stream stream, int testCount) { var vehicle = Vehicle.Car; var tagsIndex = new TagsTableCollectionIndex(); // creates a tagged index. // read from the OSM-stream. var reader = new OsmSharp.Osm.PBF.Streams.PBFOsmStreamSource(stream); var interpreter = new OsmRoutingInterpreter(); var data = new DynamicGraphRouterDataSource <LiveEdge>(tagsIndex); data.DropVertexIndex(); var targetData = new LiveGraphOsmStreamTarget(data, interpreter, tagsIndex); targetData.RegisterSource(reader); targetData.Pull(); data.RebuildVertexIndex(); // creates the live edge router. var router = new Dykstra(); var performanceInfo = new PerformanceInfoConsumer("LiveRouting"); performanceInfo.Start(); performanceInfo.Report("Routing {0} routes...", testCount); var successCount = 0; var totalCount = testCount; var latestProgress = -1.0f; while (testCount > 0) { var from = (uint)OsmSharp.Math.Random.StaticRandomGenerator.Get().Generate(data.VertexCount - 1) + 1; var to = (uint)OsmSharp.Math.Random.StaticRandomGenerator.Get().Generate(data.VertexCount - 1) + 1; var route = router.Calculate(data, interpreter, vehicle, from, to); if (route != null) { successCount++; } testCount--; // report progress. var progress = (float)System.Math.Round(((double)(totalCount - testCount) / (double)totalCount) * 100); if (progress != latestProgress) { OsmSharp.Logging.Log.TraceEvent("LiveRouting", TraceEventType.Information, "Routing... {0}%", progress); latestProgress = progress; } } performanceInfo.Stop(); OsmSharp.Logging.Log.TraceEvent("LiveRouting", OsmSharp.Logging.TraceEventType.Information, string.Format("{0}/{1} routes successfull!", successCount, totalCount)); }
/// <summary> /// Creates a new search helper. /// </summary> public SearchHelper(RouterDb routerDb, Dykstra search, Profile profile, RouterPoint target) { _search = search; _target = target; _targets = new HashSet <uint>(); _targetPaths = target.ToEdgePaths(routerDb, new DefaultWeightHandler(profile.GetGetFactor(routerDb)), false); for (var i = 0; i < _targetPaths.Length; i++) { _targets.Add(_targetPaths[i].Vertex); } }
public void TestLoopRestricted() { var graph = new Graph(1); graph.AddVertex(0); graph.AddVertex(1); graph.AddVertex(2); graph.AddVertex(3); graph.AddVertex(4); graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(100, 1)); graph.AddEdge(1, 4, EdgeDataSerializer.Serialize(100, 1)); graph.AddEdge(1, 2, EdgeDataSerializer.Serialize(100, 1)); graph.AddEdge(2, 3, EdgeDataSerializer.Serialize(100, 1)); graph.AddEdge(3, 1, EdgeDataSerializer.Serialize(100, 1)); var dykstra = new Dykstra(graph, (profile) => new Itinero.Profiles.Factor() { Direction = 0, Value = 1 }, (vertex) => { if (vertex == 0) { return(new uint[][] { new uint[] { 0, 1, 4 } }); } return(null); }, new EdgePath <float>[] { new EdgePath <float>(1, 50, 1, new EdgePath <float>()), new EdgePath <float>(0, 50, -1, new EdgePath <float>()) }, float.MaxValue, false); dykstra.Run(); Assert.IsTrue(dykstra.HasRun); Assert.IsTrue(dykstra.HasSucceeded); EdgePath <float> visit; Assert.IsTrue(dykstra.TryGetVisit(-1, out visit) && visit.Weight == 50); Assert.IsTrue(dykstra.TryGetVisit(1, out visit) && visit.Weight == 50); Assert.IsFalse(dykstra.TryGetVisit(-2, out visit)); Assert.IsTrue(dykstra.TryGetVisit(2, out visit) && visit.Weight == 450); Assert.IsTrue(dykstra.TryGetVisit(-3, out visit) && visit.Weight == 350); Assert.IsTrue(dykstra.TryGetVisit(3, out visit) && visit.Weight == 150); Assert.IsTrue(dykstra.TryGetVisit(-4, out visit) && visit.Weight == 250); Assert.IsTrue(dykstra.TryGetVisit(4, out visit) && visit.Weight == 250); Assert.IsTrue(dykstra.TryGetVisit(-5, out visit) && visit.Weight == 150); Assert.IsTrue(dykstra.TryGetVisit(4, out visit) && visit.Weight == 250); }
/// <summary> /// Checks if the given point is connected to the rest of the network. Use this to detect points on routing islands. /// </summary> /// <param name="radius">The radius metric, that can be a distance, time or custom metric.</param> /// <returns></returns> public sealed override Result <bool> TryCheckConnectivity(IProfileInstance profileInstance, RouterPoint point, float radius, bool?forward = null) { try { if (!_db.Supports(profileInstance.Profile)) { return(new Result <bool>("Routing profile is not supported.", (message) => { return new Exception(message); })); } // get the weight handler. var weightHandler = this.GetDefaultWeightHandler(profileInstance); var checkForward = forward == null || forward.Value; var checkBackward = forward == null || !forward.Value; if (checkForward) { // build and run forward dykstra search. var dykstra = new Dykstra(_db.Network.GeometricGraph.Graph, weightHandler, null, point.ToEdgePaths(_db, weightHandler, true), radius, false); dykstra.Run(); if (!dykstra.HasSucceeded || !dykstra.MaxReached) { // something went wrong or max not reached. return(new Result <bool>(false)); } } if (checkBackward) { // build and run backward dykstra search. var dykstra = new Dykstra(_db.Network.GeometricGraph.Graph, weightHandler, null, point.ToEdgePaths(_db, weightHandler, false), radius, true); dykstra.Run(); if (!dykstra.HasSucceeded || !dykstra.MaxReached) { // something went wrong or max not reached. return(new Result <bool>(false)); } } return(new Result <bool>(true)); } catch (Exception ex) { return(new Result <bool>(ex.Message, (m) => ex)); } }
public void TestTwoHopRestricted() { var graph = new Graph(1); graph.AddVertex(0); graph.AddVertex(1); graph.AddVertex(2); graph.AddVertex(3); graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(100, 1)); graph.AddEdge(1, 2, EdgeDataSerializer.Serialize(100, 1)); graph.AddEdge(2, 3, EdgeDataSerializer.Serialize(100, 1)); var dykstra = new Dykstra(graph, (profile) => new Itinero.Profiles.Factor() { Direction = 0, Value = 1 }, (vertex) => { if (vertex == 1) { return(new uint[][] { new uint[] { 1, 2, 3 } }); } return(null); }, new EdgePath <float>[] { new EdgePath <float>(0, 50, 1, new EdgePath <float>()), new EdgePath <float>(1, 50, -1, new EdgePath <float>()) }, float.MaxValue, new List <uint>(), false); dykstra.Run(); Assert.IsTrue(dykstra.HasRun); Assert.IsTrue(dykstra.HasSucceeded); EdgePath <float> visit; Assert.IsTrue(dykstra.TryGetVisit(-1, out visit)); Assert.AreEqual(-1, visit.Edge); Assert.AreEqual(50, visit.Weight); Assert.IsTrue(dykstra.TryGetVisit(1, out visit)); Assert.AreEqual(1, visit.Edge); Assert.AreEqual(50, visit.Weight); Assert.IsTrue(dykstra.TryGetVisit(2, out visit)); Assert.AreEqual(2, visit.Edge); Assert.AreEqual(150, visit.Weight); Assert.IsFalse(dykstra.TryGetVisit(-2, out visit)); Assert.IsFalse(dykstra.TryGetVisit(3, out visit)); Assert.IsFalse(dykstra.TryGetVisit(-2, out visit)); }
public void TestTriangle() { var graph = new Graph(1); graph.AddVertex(0); graph.AddVertex(1); graph.AddVertex(2); graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(100, 1)); graph.AddEdge(1, 2, EdgeDataSerializer.Serialize(100, 1)); graph.AddEdge(2, 0, EdgeDataSerializer.Serialize(100, 1)); var dykstra = new Dykstra(graph, (profile) => new Itinero.Profiles.Factor() { Direction = 0, Value = 1 }, null, new EdgePath <float>[] { new EdgePath <float>(0, 50, 1, new EdgePath <float>()), new EdgePath <float>(1, 50, -1, new EdgePath <float>()) }, float.MaxValue, false); dykstra.Run(); Assert.IsTrue(dykstra.HasRun); Assert.IsTrue(dykstra.HasSucceeded); EdgePath <float> visit; Assert.IsTrue(dykstra.TryGetVisit(-1, out visit)); Assert.AreEqual(-1, visit.Edge); Assert.AreEqual(50, visit.Weight); Assert.IsTrue(dykstra.TryGetVisit(1, out visit)); Assert.AreEqual(1, visit.Edge); Assert.AreEqual(50, visit.Weight); Assert.IsTrue(dykstra.TryGetVisit(2, out visit)); Assert.AreEqual(2, visit.Edge); Assert.AreEqual(150, visit.Weight); Assert.IsTrue(dykstra.TryGetVisit(-2, out visit)); Assert.AreEqual(-2, visit.Edge); Assert.AreEqual(250, visit.Weight); Assert.IsTrue(dykstra.TryGetVisit(3, out visit)); Assert.AreEqual(3, visit.Edge); Assert.AreEqual(250, visit.Weight); Assert.IsTrue(dykstra.TryGetVisit(-3, out visit)); Assert.AreEqual(-3, visit.Edge); Assert.AreEqual(150, visit.Weight); }
public void TestTwoEdges() { // build graph. var graph = new Graph(EdgeDataSerializer.Size); graph.AddVertex(0); graph.AddVertex(1); graph.AddVertex(2); graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(new EdgeData() { Distance = 100, Profile = 1 })); graph.AddEdge(1, 2, EdgeDataSerializer.Serialize(new EdgeData() { Distance = 100, Profile = 1 })); // build speed profile function. var speed = 100f / 3.6f; Func <ushort, Factor> getFactor = (x) => { return(new Factor() { Direction = 0, Value = 1.0f / speed }); }; // run algorithm. var sourceSearch = new Dykstra(graph, getFactor, null, new EdgePath <float>[] { new EdgePath <float>(0) }, 150 * 1 / speed, false); var targetSearch = new Dykstra(graph, getFactor, null, new EdgePath <float>[] { new EdgePath <float>(2) }, 150 * 1 / speed, true); var algorithm = new BidirectionalDykstra(sourceSearch, targetSearch, getFactor); algorithm.Run(); Assert.IsTrue(algorithm.HasRun); Assert.IsTrue(algorithm.HasSucceeded); Assert.AreEqual(1, algorithm.BestVertex); Assert.AreEqual(new uint[] { 0, 1, 2 }, algorithm.GetPath().ToListAsVertices().ToArray()); }
public void TestOneEdge() { // build graph. var graph = new Graph(EdgeDataSerializer.Size); graph.AddVertex(0); graph.AddVertex(1); graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(new EdgeData() { Distance = 100, Profile = 1 })); // build speed profile function. var speed = 100f / 3.6f; Func <ushort, Itinero.Profiles.Factor> getFactor = (x) => { return(new Itinero.Profiles.Factor() { Direction = 0, Value = 1.0f / speed }); }; // run algorithm. var algorithm = new Dykstra(graph, getFactor, null, new EdgePath <float>[] { new EdgePath <float>(0) }, float.MaxValue, false); algorithm.Run(); Assert.IsTrue(algorithm.HasRun); Assert.IsTrue(algorithm.HasSucceeded); EdgePath <float> visit; Assert.IsTrue(algorithm.TryGetVisit(0, out visit)); Assert.AreEqual(null, visit.From); Assert.AreEqual(0, visit.Vertex); Assert.AreEqual(0, visit.Weight); Assert.IsTrue(algorithm.TryGetVisit(1, out visit)); Assert.AreEqual(0, visit.From.Vertex); Assert.AreEqual(1, visit.Vertex); Assert.AreEqual(100 / speed, visit.Weight); }
/// <summary> /// Creates a router. /// </summary> /// <param name="interpreter"></param> /// <param name="manifestResourceName"></param> /// <returns></returns> protected override Router CreateRouter(IOsmRoutingInterpreter interpreter, string manifestResourceName) { TagsIndex tagsIndex = new TagsIndex(); // do the data processing. var memoryData = new RouterDataSource<Edge>(new Graph<Edge>(), tagsIndex); var targetData = new GraphOsmStreamTarget( memoryData, interpreter, tagsIndex, null, false); var dataProcessorSource = new XmlOsmStreamSource( Assembly.GetExecutingAssembly().GetManifestResourceStream(manifestResourceName)); var sorter = new OsmStreamFilterSort(); sorter.RegisterSource(dataProcessorSource); targetData.RegisterSource(sorter); targetData.Pull(); IRoutingAlgorithm<Edge> basicRouter = new Dykstra(); return Router.CreateFrom(memoryData, basicRouter, interpreter); }
public static void Test(IRoutingAlgorithmData <Edge> data, Vehicle vehicle, int testCount) { // creates the edge router. var router = new Dykstra(); var interpreter = new OsmRoutingInterpreter(); var performanceInfo = new PerformanceInfoConsumer("Routing"); performanceInfo.Start(); performanceInfo.Report("Routing {0} routes...", testCount); var successCount = 0; var totalCount = testCount; var latestProgress = -1.0f; while (testCount > 0) { var from = (uint)OsmSharp.Math.Random.StaticRandomGenerator.Get().Generate(data.VertexCount - 1) + 1; var to = (uint)OsmSharp.Math.Random.StaticRandomGenerator.Get().Generate(data.VertexCount - 1) + 1; var route = router.Calculate(data, interpreter, vehicle, from, to); if (route != null) { successCount++; } testCount--; // report progress. var progress = (float)System.Math.Round(((double)(totalCount - testCount) / (double)totalCount) * 100); if (progress != latestProgress) { OsmSharp.Logging.Log.TraceEvent("Routing", TraceEventType.Information, "Routing... {0}%", progress); latestProgress = progress; } } performanceInfo.Stop(); OsmSharp.Logging.Log.TraceEvent("Routing", OsmSharp.Logging.TraceEventType.Information, string.Format("{0}/{1} routes successfull!", successCount, totalCount)); }
/// <summary> /// Creates a new closest stop search. /// </summary> public ClosestStopsSearch(MultimodalDb multimodalDb, Profile profile, Func <ushort, Factor> getFactor, RouterPoint routerPoint, float maxSeconds, bool backward) { if (profile.Metric != ProfileMetric.TimeInSeconds) { // oeps, this profile is not time-based! throw new ArgumentOutOfRangeException( "The default closest stop search can only be used with profiles that use time in seconds as a metric."); } _multimodalDb = multimodalDb; _profile = profile; _getFactor = getFactor; _routerPoint = routerPoint; _maxSeconds = maxSeconds; _backward = backward; // build search. _dykstra = new Dykstra(_multimodalDb.RouterDb.Network.GeometricGraph.Graph, new DefaultWeightHandler(_getFactor), x => Itinero.Constants.NO_VERTEX, _routerPoint.ToEdgePaths(_multimodalDb.RouterDb, new DefaultWeightHandler(_getFactor), !_backward), _maxSeconds, _backward); }
/// <summary> /// Creates a router based on the resource. /// </summary> /// <param name="interpreter"></param> /// <param name="manifestResourceName"></param> /// <returns></returns> protected Router CreateReferenceRouter(IOsmRoutingInterpreter interpreter, string manifestResourceName) { TagsIndex tagsIndex = new TagsIndex(); // do the data processing. var memoryData = new RouterDataSource <Edge>(new Graph <Edge>(), tagsIndex); var targetData = new GraphOsmStreamTarget( memoryData, interpreter, tagsIndex, null, false); var dataProcessorSource = new XmlOsmStreamSource( Assembly.GetExecutingAssembly().GetManifestResourceStream(manifestResourceName)); var sorter = new OsmStreamFilterSort(); sorter.RegisterSource(dataProcessorSource); targetData.RegisterSource(sorter); targetData.Pull(); IRoutingAlgorithm <Edge> basicRouter = new Dykstra(); return(Router.CreateFrom(memoryData, basicRouter, interpreter)); }
/// <summary> /// Creates a router. /// </summary> /// <param name="interpreter"></param> /// <param name="manifestResourceName"></param> /// <returns></returns> protected override Router CreateRouter(IOsmRoutingInterpreter interpreter, string manifestResourceName) { TagsTableCollectionIndex tagsIndex = new TagsTableCollectionIndex(); // do the data processing. DynamicGraphRouterDataSource <LiveEdge> memoryData = new DynamicGraphRouterDataSource <LiveEdge>(tagsIndex); LiveGraphOsmStreamTarget target_data = new LiveGraphOsmStreamTarget( memoryData, interpreter, tagsIndex, null, false); XmlOsmStreamSource dataProcessorSource = new XmlOsmStreamSource( Assembly.GetExecutingAssembly().GetManifestResourceStream(manifestResourceName)); OsmStreamFilterSort sorter = new OsmStreamFilterSort(); sorter.RegisterSource(dataProcessorSource); target_data.RegisterSource(sorter); target_data.Pull(); IRoutingAlgorithm <LiveEdge> basicRouter = new Dykstra(); return(Router.CreateLiveFrom(memoryData, basicRouter, interpreter)); }
/// <summary> /// Executes the actual run. /// </summary> protected override void DoRun(CancellationToken cancellationToken) { // put in default weights, all are infinite. // EXPLANATION: a path between two identical vertices has to contain at least one edge. _weights = new T[_sources.Length][]; for (var i = 0; i < _sources.Length; i++) { var source = _sources[i]; _weights[i] = new T[_targets.Length]; for (var j = 0; j < _targets.Length; j++) { var target = _targets[j]; _weights[i][j] = _weightHandler.Infinite; } } // do forward searches into buckets. for (var i = 0; i < _sources.Length; i++) { var forward = new Dykstra <T>(_graph, _weightHandler, _sources[i], false, _max); forward.WasFound += (p, v, w) => { return(this.ForwardVertexFound(i, v, w)); }; forward.Run(cancellationToken); } // do backward searches into buckets. for (var i = 0; i < _targets.Length; i++) { var backward = new Dykstra <T>(_graph, _weightHandler, _targets[i], true, _max); backward.WasFound += (p, v, w) => { return(this.BackwardVertexFound(i, v, w)); }; backward.Run(cancellationToken); } this.HasSucceeded = true; }
public void RoutingRegressionTest4() { var interpreter = new OsmRoutingInterpreter(); var tagsIndex = new TagsTableCollectionIndex(); // do the data processing. var memoryData = new DynamicGraphRouterDataSource <LiveEdge>(tagsIndex); var targetData = new LiveGraphOsmStreamTarget(memoryData, interpreter, tagsIndex); var dataProcessorSource = new XmlOsmStreamSource( Assembly.GetExecutingAssembly().GetManifestResourceStream("OsmSharp.Test.Unittests.test_routing_regression1.osm")); var sorter = new OsmStreamFilterSort(); sorter.RegisterSource(dataProcessorSource); targetData.RegisterSource(sorter); targetData.Pull(); var basicRouter = new Dykstra(); var router = Router.CreateLiveFrom(memoryData, basicRouter, interpreter); // resolve the three points in question. var point35 = new GeoCoordinate(51.01257, 4.000753); var point35ResolvedCar = router.Resolve(Vehicle.Car, point35); var point35ResolvedBicycle = router.Resolve(Vehicle.Bicycle, point35); }
/// <summary> /// Checks if the given point is connected to the rest of the network. Use this to detect points on routing islands. /// </summary> /// <returns></returns> public sealed override Result <bool> TryCheckConnectivity(IProfileInstance profileInstance, RouterPoint point, float radiusInMeters) { if (!_db.Supports(profileInstance.Profile)) { return(new Result <bool>("Routing profile is not supported.", (message) => { return new Exception(message); })); } // get the weight handler. var weightHandler = this.GetDefaultWeightHandler(profileInstance); // build and run dykstra search. var dykstra = new Dykstra(_db.Network.GeometricGraph.Graph, weightHandler, null, point.ToEdgePaths(_db, weightHandler, true), radiusInMeters, false); dykstra.Run(); if (!dykstra.HasSucceeded) { // something went wrong. return(new Result <bool>(false)); } return(new Result <bool>(dykstra.MaxReached)); }
public void RoutingRegressionTest2() { var interpreter = new OsmRoutingInterpreter(); var tagsIndex = new TagsTableCollectionIndex(); // do the data processing. var memoryData = new DynamicGraphRouterDataSource <LiveEdge>(tagsIndex); var targetData = new LiveGraphOsmStreamTarget(memoryData, interpreter, tagsIndex); var dataProcessorSource = new XmlOsmStreamSource( Assembly.GetExecutingAssembly().GetManifestResourceStream("OsmSharp.Test.Unittests.test_network.osm")); var sorter = new OsmStreamFilterSort(); sorter.RegisterSource(dataProcessorSource); targetData.RegisterSource(sorter); targetData.Pull(); var basicRouter = new Dykstra(); var router = Router.CreateLiveFrom(memoryData, basicRouter, interpreter); // build coordinates list of resolved points. var testPoints = new List <GeoCoordinate>(); testPoints.Add(new GeoCoordinate(51.0582204, 3.7193524)); testPoints.Add(new GeoCoordinate(51.0582199, 3.7194002)); testPoints.Add(new GeoCoordinate(51.0581727, 3.7195833)); testPoints.Add(new GeoCoordinate(51.0581483, 3.7195553)); testPoints.Add(new GeoCoordinate(51.0581883, 3.7196617)); testPoints.Add(new GeoCoordinate(51.0581628, 3.7196889)); // build a matrix of routes between all points. var referenceRoutes = new Route[testPoints.Count][]; var permuationArray = new int[testPoints.Count]; for (int fromIdx = 0; fromIdx < testPoints.Count; fromIdx++) { permuationArray[fromIdx] = fromIdx; referenceRoutes[fromIdx] = new Route[testPoints.Count]; for (int toIdx = 0; toIdx < testPoints.Count; toIdx++) { // create router from scratch. router = Router.CreateLiveFrom( memoryData, basicRouter, interpreter); // resolve points. var from = router.Resolve(Vehicle.Car, testPoints[fromIdx]); var to = router.Resolve(Vehicle.Car, testPoints[toIdx]); // calculate route. referenceRoutes[fromIdx][toIdx] = router.Calculate(Vehicle.Car, from, to); } } // resolve points in some order and compare the resulting routes. // they should be identical in length except for some numerical rounding errors. var enumerator = new PermutationEnumerable <int>(permuationArray); foreach (int[] permutation in enumerator) { // create router from scratch. router = Router.CreateLiveFrom(memoryData, basicRouter, interpreter); // resolve in the order of the permutation. var resolvedPoints = new RouterPoint[permutation.Length]; for (int idx = 0; idx < permutation.Length; idx++) { resolvedPoints[permutation[idx]] = router.Resolve(Vehicle.Car, testPoints[permutation[idx]]); } for (int fromIdx = 0; fromIdx < testPoints.Count; fromIdx++) { for (int toIdx = 0; toIdx < testPoints.Count; toIdx++) { // calculate route. var route = router.Calculate(Vehicle.Car, resolvedPoints[fromIdx], resolvedPoints[toIdx]); // TODO: changed the resolve accuracy to .5m. Make sure this is more accurate in the future. Assert.AreEqual(referenceRoutes[fromIdx][toIdx].TotalDistance, route.TotalDistance, 1); } } } }
/// <summary> /// Tests the edge matcher in combination with dykstra routing. /// </summary> /// <param name="name"></param> /// <param name="highway"></param> /// <param name="vehicle"></param> /// <param name="matcher"></param> /// <param name="pointName"></param> /// <param name="notFound"></param> private void TestResolveOnEdgeSingle(string name, string highway, Vehicle vehicle, IEdgeMatcher matcher, string pointName, bool notFound) { var fromName = new GeoCoordinate(51.0003, 4.0007); var toName = new GeoCoordinate(51.0003, 4.0008); var fromNoname = new GeoCoordinate(51.0, 4.0007); var toNoname = new GeoCoordinate(51.0, 4.0008); TagsCollectionBase pointTags = new TagsCollection(); pointTags["name"] = pointName; TagsCollectionBase tags = new TagsCollection(); tags["highway"] = highway; //tags["name"] = name; var tagsIndex = new TagsIndex(); // do the data processing. var data = new RouterDataSource<Edge>(new Graph<Edge>(), tagsIndex); uint vertexNoname1 = data.AddVertex((float)fromNoname.Latitude, (float)fromNoname.Longitude); uint vertexNoname2 = data.AddVertex((float)toNoname.Latitude, (float)toNoname.Longitude); data.AddEdge(vertexNoname1, vertexNoname2, new Edge() { Forward = true, Tags = tagsIndex.Add(tags) }, null); tags = new TagsCollection(); tags["highway"] = highway; tags["name"] = name; uint vertexName1 = data.AddVertex((float)fromName.Latitude, (float)fromName.Longitude); uint vertexName2 = data.AddVertex((float)toName.Latitude, (float)toName.Longitude); data.AddEdge(vertexName1, vertexName2, new Edge() { Forward = true, Tags = tagsIndex.Add(tags) }, null); IRoutingInterpreter interpreter = new OsmRoutingInterpreter(); // creates the data. IRoutingAlgorithm<Edge> router = new Dykstra(); var nonameLocation = new GeoCoordinate( (fromNoname.Latitude + toNoname.Latitude) / 2.0, (fromNoname.Longitude + toNoname.Longitude) / 2.0); // var nameLocation = new GeoCoordinate( // (fromName.Latitude + toName.Latitude) / 2.0, // (fromName.Longitude + toName.Longitude) / 2.0); const float delta = 0.01f; var result = router.SearchClosest(data, interpreter, vehicle, nonameLocation, delta, matcher, pointTags, null); if (result.Distance < double.MaxValue) { // there is a result. Assert.IsFalse(notFound, "A result was found but was supposed not to be found!"); if (name == pointName) { // the name location was supposed to be found! Assert.IsTrue(result.Vertex1 == vertexName1 || result.Vertex1 == vertexName2); Assert.IsTrue(result.Vertex2 == vertexName1 || result.Vertex2 == vertexName2); } else { // the noname location was supposed to be found! Assert.IsTrue(result.Vertex1 == vertexNoname1 || result.Vertex1 == vertexNoname2); Assert.IsTrue(result.Vertex2 == vertexNoname1 || result.Vertex2 == vertexNoname2); } return; } Assert.IsTrue(notFound, "A result was not found but was supposed to be found!"); }
public void TestEdgeVisits() { // build graph. var graph = new Graph(EdgeDataSerializer.Size); graph.AddVertex(0); graph.AddVertex(1); graph.AddVertex(2); var e01 = graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(new EdgeData() { Distance = 100, Profile = 1 })) + 1; var e12 = graph.AddEdge(1, 2, EdgeDataSerializer.Serialize(new EdgeData() { Distance = 100, Profile = 1 })) + 1; var e02 = graph.AddEdge(0, 2, EdgeDataSerializer.Serialize(new EdgeData() { Distance = 100, Profile = 1 })) + 1; // build speed profile function. var speed = 100f / 3.6f; Func <ushort, Factor> getFactor = (x) => { return(new Factor() { Direction = 0, Value = 1.0f / speed }); }; // run algorithm. var reportedEdges = new HashSet <long>(); var algorithm = new Dykstra(graph, getFactor, null, new EdgePath <float>[] { new EdgePath <float>(0) }, float.MaxValue, false); algorithm.Visit += (path) => { if (path.From == null) { return(false); } var v1 = path.From.Vertex; var v2 = path.Vertex; var w1 = path.From.Weight; var w2 = path.Weight; var e = path.Edge; var edge = graph.GetEdge(e); float l; ushort p; Itinero.Data.Edges.EdgeDataSerializer.Deserialize(edge.Data[0], out l, out p); if (v1 == 0 && v2 == 1) { Assert.AreEqual(100, l); Assert.AreEqual(e01, e); Assert.AreEqual(0, w1); Assert.AreEqual(100 / speed, w2); reportedEdges.Add(e01); } else if (v1 == 1 && v2 == 0) { Assert.AreEqual(100, l); Assert.AreEqual(-e01, e); Assert.AreEqual(100 / speed, w1); Assert.AreEqual(200 / speed, w2); reportedEdges.Add(-e01); } else if (v1 == 0 && v2 == 2) { Assert.AreEqual(100, l); Assert.AreEqual(e02, e); Assert.AreEqual(0, w1); Assert.AreEqual(100 / speed, w2); reportedEdges.Add(e02); } else if (v1 == 2 && v2 == 0) { Assert.AreEqual(100, l); Assert.AreEqual(-e02, e); Assert.AreEqual(100 / speed, w1); Assert.AreEqual(200 / speed, w2); reportedEdges.Add(-e02); } else if (v1 == 1 && v2 == 2) { Assert.AreEqual(100, l); Assert.AreEqual(e12, e); Assert.AreEqual(100 / speed, w1); Assert.AreEqual(200 / speed, w2); reportedEdges.Add(e12); } else if (v1 == 2 && v2 == 1) { Assert.AreEqual(100, l); Assert.AreEqual(-e12, e); Assert.AreEqual(100 / speed, w1); Assert.AreEqual(200 / speed, w2); reportedEdges.Add(-e12); } return(false); }; algorithm.Run(); Assert.IsTrue(algorithm.HasRun); Assert.IsTrue(algorithm.HasSucceeded); Assert.IsTrue(reportedEdges.Contains(e01)); Assert.IsTrue(reportedEdges.Contains(e02)); }
public void RoutingRegressionTest3() { var interpreter = new OsmRoutingInterpreter(); var tagsIndex = new TagsTableCollectionIndex(); // do the data processing. var memoryData = new DynamicGraphRouterDataSource<LiveEdge>(tagsIndex); var targetData = new LiveGraphOsmStreamTarget(memoryData, interpreter, tagsIndex); var dataProcessorSource = new XmlOsmStreamSource( Assembly.GetExecutingAssembly().GetManifestResourceStream("OsmSharp.Test.Unittests.test_network.osm")); var sorter = new OsmStreamFilterSort(); sorter.RegisterSource(dataProcessorSource); targetData.RegisterSource(sorter); targetData.Pull(); var basicRouter = new Dykstra(); var router = Router.CreateLiveFrom(memoryData, basicRouter, interpreter); // build coordinates list of resolved points. var testPoints = new List<GeoCoordinate>(); testPoints.Add(new GeoCoordinate(51.0581719, 3.7201622)); testPoints.Add(new GeoCoordinate(51.0580439, 3.7202134)); testPoints.Add(new GeoCoordinate(51.0580573, 3.7204378)); testPoints.Add(new GeoCoordinate(51.0581862, 3.7203758)); // build a matrix of routes between all points. var referenceRoutes = new Route[testPoints.Count][]; var permuationArray = new int[testPoints.Count]; for (int fromIdx = 0; fromIdx < testPoints.Count; fromIdx++) { permuationArray[fromIdx] = fromIdx; referenceRoutes[fromIdx] = new Route[testPoints.Count]; for (int toIdx = 0; toIdx < testPoints.Count; toIdx++) { // create router from scratch. router = Router.CreateLiveFrom( memoryData, basicRouter, interpreter); // resolve points. var from = router.Resolve(Vehicle.Car, testPoints[fromIdx]); var to = router.Resolve(Vehicle.Car, testPoints[toIdx]); // calculate route. referenceRoutes[fromIdx][toIdx] = router.Calculate(Vehicle.Car, from, to); } } // resolve points in some order and compare the resulting routes. // they should be identical in length except for some numerical rounding errors. var enumerator = new PermutationEnumerable<int>( permuationArray); foreach (int[] permutation in enumerator) { // create router from scratch. router = Router.CreateLiveFrom(memoryData, basicRouter, interpreter); // resolve in the order of the permutation. var resolvedPoints = new RouterPoint[permutation.Length]; for (int idx = 0; idx < permutation.Length; idx++) { resolvedPoints[permutation[idx]] = router.Resolve(Vehicle.Car, testPoints[permutation[idx]]); } for (int fromIdx = 0; fromIdx < testPoints.Count; fromIdx++) { for (int toIdx = 0; toIdx < testPoints.Count; toIdx++) { // calculate route. var route = router.Calculate(Vehicle.Car, resolvedPoints[fromIdx], resolvedPoints[toIdx]); Assert.AreEqual(referenceRoutes[fromIdx][toIdx].TotalDistance, route.TotalDistance, 0.1); } } } }
/// <summary> /// Calculates a route between the two locations. /// </summary> /// <returns></returns> public sealed override Result <EdgePath <T> > TryCalculateRaw <T>(IProfileInstance profileInstance, WeightHandler <T> weightHandler, RouterPoint source, RouterPoint target, RoutingSettings <T> settings) { try { if (!_db.Supports(profileInstance.Profile)) { return(new Result <EdgePath <T> >("Routing profile is not supported.", (message) => { return new Exception(message); })); } var maxSearch = weightHandler.Infinite; if (settings != null) { if (!settings.TryGetMaxSearch(profileInstance.Profile.FullName, out maxSearch)) { maxSearch = weightHandler.Infinite; } } EdgePath <T> path; ContractedDb contracted; bool useContracted = false; if (_db.TryGetContracted(profileInstance.Profile, out contracted)) { // contracted calculation. useContracted = true; if (_db.HasComplexRestrictions(profileInstance.Profile) && !contracted.HasEdgeBasedGraph) { // there is no edge-based graph for this profile but the db has complex restrictions, don't use the contracted graph. Logging.Logger.Log("Router", Logging.TraceEventType.Warning, "There is a vertex-based contracted graph but also complex restrictions. Not using the contracted graph, add an edge-based contracted graph."); useContracted = false; } } if (useContracted) { // use the contracted graph. path = null; List <uint> vertexPath = null; if (!contracted.HasEdgeBasedGraph) { // use node-based routing. var bidirectionalSearch = new Itinero.Algorithms.Contracted.BidirectionalDykstra <T>(contracted.NodeBasedGraph, weightHandler, source.ToEdgePaths(_db, weightHandler, true), target.ToEdgePaths(_db, weightHandler, false)); bidirectionalSearch.Run(); if (!bidirectionalSearch.HasSucceeded) { return(new Result <EdgePath <T> >(bidirectionalSearch.ErrorMessage, (message) => { return new RouteNotFoundException(message); })); } vertexPath = bidirectionalSearch.GetPath(); } else { // use edge-based routing. var bidirectionalSearch = new Itinero.Algorithms.Contracted.EdgeBased.BidirectionalDykstra <T>(contracted.EdgeBasedGraph, weightHandler, source.ToEdgePaths(_db, weightHandler, true), target.ToEdgePaths(_db, weightHandler, false), _db.GetGetRestrictions(profileInstance.Profile, null)); bidirectionalSearch.Run(); if (!bidirectionalSearch.HasSucceeded) { return(new Result <EdgePath <T> >(bidirectionalSearch.ErrorMessage, (message) => { return new RouteNotFoundException(message); })); } vertexPath = bidirectionalSearch.GetPath(); } // expand vertex path using the regular graph. path = _db.BuildEdgePath(weightHandler, source, target, vertexPath); } else { // use the regular graph. if (_db.HasComplexRestrictions(profileInstance.Profile)) { var sourceSearch = new Algorithms.Default.EdgeBased.Dykstra <T>(_db.Network.GeometricGraph.Graph, weightHandler, _db.GetGetRestrictions(profileInstance.Profile, true), source.ToEdgePaths(_db, weightHandler, true), maxSearch, false); var targetSearch = new Algorithms.Default.EdgeBased.Dykstra <T>(_db.Network.GeometricGraph.Graph, weightHandler, _db.GetGetRestrictions(profileInstance.Profile, false), target.ToEdgePaths(_db, weightHandler, false), maxSearch, true); var bidirectionalSearch = new Algorithms.Default.EdgeBased.BidirectionalDykstra <T>(sourceSearch, targetSearch, weightHandler); bidirectionalSearch.Run(); if (!bidirectionalSearch.HasSucceeded) { return(new Result <EdgePath <T> >(bidirectionalSearch.ErrorMessage, (message) => { return new RouteNotFoundException(message); })); } path = bidirectionalSearch.GetPath(); } else { var sourceSearch = new Dykstra <T>(_db.Network.GeometricGraph.Graph, null, weightHandler, source.ToEdgePaths(_db, weightHandler, true), maxSearch, false); var targetSearch = new Dykstra <T>(_db.Network.GeometricGraph.Graph, null, weightHandler, target.ToEdgePaths(_db, weightHandler, false), maxSearch, true); var bidirectionalSearch = new BidirectionalDykstra <T>(sourceSearch, targetSearch, weightHandler); bidirectionalSearch.Run(); if (!bidirectionalSearch.HasSucceeded) { return(new Result <EdgePath <T> >(bidirectionalSearch.ErrorMessage, (message) => { return new RouteNotFoundException(message); })); } path = bidirectionalSearch.GetPath(); } } if (source.EdgeId == target.EdgeId) { // check for a shorter path on the same edge. var edgePath = source.EdgePathTo(_db, weightHandler, target); if (edgePath != null && weightHandler.IsSmallerThan(edgePath.Weight, path.Weight)) { path = edgePath; } } return(new Result <EdgePath <T> >(path)); } catch (Exception ex) { return(new Result <EdgePath <T> >(ex.Message, (m) => ex)); } }
public void TestSourceBetween() { // build graph. var graph = new Graph(EdgeDataSerializer.Size); graph.AddVertex(0); graph.AddVertex(1); graph.AddVertex(2); graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(new EdgeData() { Distance = 100, Profile = 1 })); graph.AddEdge(1, 2, EdgeDataSerializer.Serialize(new EdgeData() { Distance = 100, Profile = 1 })); graph.AddEdge(0, 2, EdgeDataSerializer.Serialize(new EdgeData() { Distance = 100, Profile = 1 })); // build speed profile function. var speed = 100f / 3.6f; Func <ushort, Factor> getFactor = (x) => { return(new Factor() { Direction = 1, Value = 1.0f / speed }); }; // run algorithm. var algorithm = new Dykstra(graph, getFactor, null, new EdgePath <float>[] { new EdgePath <float>(0, 10 / speed, new EdgePath <float>(uint.MaxValue)), new EdgePath <float>(1, 90 / speed, new EdgePath <float>(uint.MaxValue)) }, float.MaxValue, new List <uint>(), false); algorithm.Run(); Assert.IsTrue(algorithm.HasRun); Assert.IsTrue(algorithm.HasSucceeded); EdgePath <float> visit; Assert.IsTrue(algorithm.TryGetVisit(0, out visit)); Assert.IsNotNull(visit.From); Assert.AreEqual(uint.MaxValue, visit.From.Vertex); Assert.AreEqual(0, visit.Vertex); Assert.AreEqual(10 / speed, visit.Weight); Assert.IsTrue(algorithm.TryGetVisit(1, out visit)); Assert.IsNotNull(visit.From); Assert.AreEqual(uint.MaxValue, visit.From.Vertex); Assert.AreEqual(1, visit.Vertex); Assert.AreEqual(90 / speed, visit.Weight); Assert.IsTrue(algorithm.TryGetVisit(2, out visit)); Assert.IsNotNull(visit.From); Assert.AreEqual(0, visit.From.Vertex); Assert.AreEqual(2, visit.Vertex); Assert.AreEqual(110 / speed, visit.Weight); }
public void RoutingRegressionTest2() { var interpreter = new OsmRoutingInterpreter(); var tagsIndex = new TagsIndex(); // do the data processing. var memoryData = new RouterDataSource<Edge>(new Graph<Edge>(), tagsIndex); var targetData = new GraphOsmStreamTarget(memoryData, interpreter, tagsIndex); var dataProcessorSource = new XmlOsmStreamSource( Assembly.GetExecutingAssembly().GetManifestResourceStream("OsmSharp.Routing.Test.data.test_network.osm")); var sorter = new OsmStreamFilterSort(); sorter.RegisterSource(dataProcessorSource); targetData.RegisterSource(sorter); targetData.Pull(); var basicRouter = new Dykstra(); var router = Router.CreateFrom(memoryData, basicRouter, interpreter); // build coordinates list of resolved points. var testPoints = new List<GeoCoordinate>(); testPoints.Add(new GeoCoordinate(51.0582204, 3.7193524)); testPoints.Add(new GeoCoordinate(51.0582199, 3.7194002)); testPoints.Add(new GeoCoordinate(51.0581727, 3.7195833)); testPoints.Add(new GeoCoordinate(51.0581483, 3.7195553)); testPoints.Add(new GeoCoordinate(51.0581883, 3.7196617)); testPoints.Add(new GeoCoordinate(51.0581628, 3.7196889)); // build a matrix of routes between all points. var referenceRoutes = new Route[testPoints.Count][]; var permuationArray = new int[testPoints.Count]; for (int fromIdx = 0; fromIdx < testPoints.Count; fromIdx++) { permuationArray[fromIdx] = fromIdx; referenceRoutes[fromIdx] = new Route[testPoints.Count]; for (int toIdx = 0; toIdx < testPoints.Count; toIdx++) { // create router from scratch. router = Router.CreateFrom( memoryData, basicRouter, interpreter); // resolve points. var from = router.Resolve(Vehicle.Car, testPoints[fromIdx]); var to = router.Resolve(Vehicle.Car, testPoints[toIdx]); // calculate route. referenceRoutes[fromIdx][toIdx] = router.Calculate(Vehicle.Car, from, to); } } // resolve points in some order and compare the resulting routes. // they should be identical in length except for some numerical rounding errors. var enumerator = new PermutationEnumerable<int>(permuationArray); foreach (int[] permutation in enumerator) { // create router from scratch. router = Router.CreateFrom(memoryData, basicRouter, interpreter); // resolve in the order of the permutation. var resolvedPoints = new RouterPoint[permutation.Length]; for (int idx = 0; idx < permutation.Length; idx++) { resolvedPoints[permutation[idx]] = router.Resolve(Vehicle.Car, testPoints[permutation[idx]]); } for (int fromIdx = 0; fromIdx < testPoints.Count; fromIdx++) { for (int toIdx = 0; toIdx < testPoints.Count; toIdx++) { // calculate route. var route = router.Calculate(Vehicle.Car, resolvedPoints[fromIdx], resolvedPoints[toIdx]); // TODO: changed the resolve accuracy to .5m. Make sure this is more accurate in the future. Assert.AreEqual(referenceRoutes[fromIdx][toIdx].TotalDistance, route.TotalDistance, 1); } } } }
/// <summary> /// Tests routing from a serialized routing file. /// </summary> /// <param name="name"></param> /// <param name="stream"></param> /// <param name="testCount"></param> public static void TestSerializedRouting(string name, Stream stream, int testCount) { var vehicle = Vehicle.Car; var tagsIndex = new TagsTableCollectionIndex(); // creates a tagged index. // read from the OSM-stream. var reader = new OsmSharp.Osm.PBF.Streams.PBFOsmStreamSource(stream); var interpreter = new OsmRoutingInterpreter(); var data = new DynamicGraphRouterDataSource<LiveEdge>(tagsIndex); data.DropVertexIndex(); var targetData = new LiveGraphOsmStreamTarget(data, interpreter, tagsIndex); targetData.RegisterSource(reader); targetData.Pull(); data.RebuildVertexIndex(); // creates the live edge router. var router = new Dykstra(); var performanceInfo = new PerformanceInfoConsumer("LiveRouting"); performanceInfo.Start(); performanceInfo.Report("Routing {0} routes...", testCount); var successCount = 0; var totalCount = testCount; var latestProgress = -1.0f; while (testCount > 0) { var from = (uint)OsmSharp.Math.Random.StaticRandomGenerator.Get().Generate(data.VertexCount - 1) + 1; var to = (uint)OsmSharp.Math.Random.StaticRandomGenerator.Get().Generate(data.VertexCount - 1) + 1; var route = router.Calculate(data, interpreter, vehicle, from, to); if (route != null) { successCount++; } testCount--; // report progress. var progress = (float)System.Math.Round(((double)(totalCount - testCount) / (double)totalCount) * 100); if (progress != latestProgress) { OsmSharp.Logging.Log.TraceEvent("LiveRouting", TraceEventType.Information, "Routing... {0}%", progress); latestProgress = progress; } } performanceInfo.Stop(); OsmSharp.Logging.Log.TraceEvent("LiveRouting", OsmSharp.Logging.TraceEventType.Information, string.Format("{0}/{1} routes successfull!", successCount, totalCount)); }
/// <summary> /// Calculates a route between the two locations. /// </summary> /// <returns></returns> public sealed override Result <EdgePath <T> > TryCalculateRaw <T>(IProfileInstance profileInstance, WeightHandler <T> weightHandler, RouterPoint source, RouterPoint target, RoutingSettings <T> settings) { try { if (!_db.Supports(profileInstance.Profile)) { return(new Result <EdgePath <T> >("Routing profile is not supported.", (message) => { return new Exception(message); })); } var maxSearch = weightHandler.Infinite; if (settings != null) { if (!settings.TryGetMaxSearch(profileInstance.Profile.FullName, out maxSearch)) { maxSearch = weightHandler.Infinite; } } ContractedDb contracted; bool useContracted = false; if (_db.TryGetContracted(profileInstance.Profile, out contracted)) { // contracted calculation. useContracted = true; if (_db.HasComplexRestrictions(profileInstance.Profile) && (!contracted.HasEdgeBasedGraph && !contracted.NodeBasedIsEdgedBased)) { // there is no edge-based graph for this profile but the db has complex restrictions, don't use the contracted graph. Logging.Logger.Log("Router", Logging.TraceEventType.Warning, "There is a vertex-based contracted graph but also complex restrictions. Not using the contracted graph, add an edge-based contracted graph."); useContracted = false; } } EdgePath <T> path = null; if (source.EdgeId == target.EdgeId) { // check for a path on the same edge. var edgePath = source.EdgePathTo(_db, weightHandler, target); if (edgePath != null) { path = edgePath; } } if (useContracted) { // use the contracted graph. List <uint> vertexPath = null; if (contracted.HasEdgeBasedGraph) { // use edge-based routing. var bidirectionalSearch = new Itinero.Algorithms.Contracted.EdgeBased.BidirectionalDykstra <T>(contracted.EdgeBasedGraph, weightHandler, source.ToEdgePaths(_db, weightHandler, true), target.ToEdgePaths(_db, weightHandler, false), _db.GetGetRestrictions(profileInstance.Profile, null)); bidirectionalSearch.Run(); if (!bidirectionalSearch.HasSucceeded) { if (path == null) { return(new Result <EdgePath <T> >(bidirectionalSearch.ErrorMessage, (message) => { return new RouteNotFoundException(message); })); } } else { vertexPath = bidirectionalSearch.GetPath(); } } else if (contracted.NodeBasedIsEdgedBased) {// use vertex-based graph for edge-based routing. var sourceDirectedId1 = new DirectedEdgeId(source.EdgeId, true); var sourceDirectedId2 = new DirectedEdgeId(source.EdgeId, false); var targetDirectedId1 = new DirectedEdgeId(target.EdgeId, true); var targetDirectedId2 = new DirectedEdgeId(target.EdgeId, false); var bidirectionalSearch = new Itinero.Algorithms.Contracted.BidirectionalDykstra <T>(contracted.NodeBasedGraph, null, weightHandler, new EdgePath <T>[] { new EdgePath <T>(sourceDirectedId1.Raw), new EdgePath <T>(sourceDirectedId2.Raw) }, new EdgePath <T>[] { new EdgePath <T>(targetDirectedId1.Raw), new EdgePath <T>(targetDirectedId2.Raw) }); bidirectionalSearch.Run(); if (!bidirectionalSearch.HasSucceeded) { return(new Result <EdgePath <T> >(bidirectionalSearch.ErrorMessage, (message) => { return new RouteNotFoundException(message); })); } var directedEdgePath = Algorithms.Dual.BidirectionalDykstraExtensions.GetDualPath(bidirectionalSearch); // convert directed edge-path to an original vertex path. var enumerator = _db.Network.GetEdgeEnumerator(); vertexPath = new List <uint>(); var edge = new List <OriginalEdge>(); for (var i = 0; i < directedEdgePath.Count; i++) { var e = new DirectedEdgeId() { Raw = directedEdgePath[i] }; enumerator.MoveToEdge(e.EdgeId); var original = new OriginalEdge(enumerator.From, enumerator.To); if (!e.Forward) { original = original.Reverse(); } edge.Add(original); if (vertexPath.Count == 0) { vertexPath.Add(original.Vertex1); } vertexPath.Add(original.Vertex2); } vertexPath[0] = Constants.NO_VERTEX; vertexPath[vertexPath.Count - 1] = Constants.NO_VERTEX; } else { // use node-based routing. var bidirectionalSearch = new Itinero.Algorithms.Contracted.BidirectionalDykstra <T>(contracted.NodeBasedGraph, _db.GetRestrictions(profileInstance.Profile), weightHandler, source.ToEdgePaths(_db, weightHandler, true), target.ToEdgePaths(_db, weightHandler, false)); bidirectionalSearch.Run(); if (!bidirectionalSearch.HasSucceeded) { if (path == null) { return(new Result <EdgePath <T> >(bidirectionalSearch.ErrorMessage, (message) => { return new RouteNotFoundException(message); })); } } else { vertexPath = Algorithms.Contracted.BidirectionalDykstraExtensions.GetPath(bidirectionalSearch); } } // expand vertex path using the regular graph. if (vertexPath != null) { var localPath = _db.BuildEdgePath(weightHandler, source, target, vertexPath); if (path == null || weightHandler.IsSmallerThan(localPath.Weight, path.Weight)) { path = localPath; } } } else { // use the regular graph. EdgePath <T> localPath = null; if (_db.HasComplexRestrictions(profileInstance.Profile)) { var sourceSearch = new Algorithms.Default.EdgeBased.Dykstra <T>(_db.Network.GeometricGraph.Graph, weightHandler, _db.GetGetRestrictions(profileInstance.Profile, true), source.ToEdgePaths(_db, weightHandler, true), maxSearch, false); var targetSearch = new Algorithms.Default.EdgeBased.Dykstra <T>(_db.Network.GeometricGraph.Graph, weightHandler, _db.GetGetRestrictions(profileInstance.Profile, false), target.ToEdgePaths(_db, weightHandler, false), maxSearch, true); var bidirectionalSearch = new Algorithms.Default.EdgeBased.BidirectionalDykstra <T>(sourceSearch, targetSearch, weightHandler); bidirectionalSearch.Run(); if (!bidirectionalSearch.HasSucceeded) { if (path == null) { return(new Result <EdgePath <T> >(bidirectionalSearch.ErrorMessage, (message) => { return new RouteNotFoundException(message); })); } } else { localPath = bidirectionalSearch.GetPath(); } } else { var sourceSearch = new Dykstra <T>(_db.Network.GeometricGraph.Graph, _db.GetGetSimpleRestrictions(profileInstance.Profile), weightHandler, source.ToEdgePaths(_db, weightHandler, true), maxSearch, false); var targetSearch = new Dykstra <T>(_db.Network.GeometricGraph.Graph, _db.GetGetSimpleRestrictions(profileInstance.Profile), weightHandler, target.ToEdgePaths(_db, weightHandler, false), maxSearch, true); var bidirectionalSearch = new BidirectionalDykstra <T>(sourceSearch, targetSearch, weightHandler); bidirectionalSearch.Run(); if (!bidirectionalSearch.HasSucceeded) { if (path == null) { return(new Result <EdgePath <T> >(bidirectionalSearch.ErrorMessage, (message) => { return new RouteNotFoundException(message); })); } } else { localPath = bidirectionalSearch.GetPath(); } } // choose best path. if (localPath != null) { if (path == null || weightHandler.IsSmallerThan(localPath.Weight, path.Weight)) { path = localPath; } } } return(new Result <EdgePath <T> >(path)); } catch (Exception ex) { return(new Result <EdgePath <T> >(ex.Message, (m) => ex)); } }
public static void Test(IRoutingAlgorithmData<Edge> data, Vehicle vehicle, int testCount) { // creates the edge router. var router = new Dykstra(); var interpreter = new OsmRoutingInterpreter(); var performanceInfo = new PerformanceInfoConsumer("Routing"); performanceInfo.Start(); performanceInfo.Report("Routing {0} routes...", testCount); var successCount = 0; var totalCount = testCount; var latestProgress = -1.0f; while (testCount > 0) { var from = (uint)OsmSharp.Math.Random.StaticRandomGenerator.Get().Generate(data.VertexCount - 1) + 1; var to = (uint)OsmSharp.Math.Random.StaticRandomGenerator.Get().Generate(data.VertexCount - 1) + 1; var route = router.Calculate(data, interpreter, vehicle, from, to); if (route != null) { successCount++; } testCount--; // report progress. var progress = (float)System.Math.Round(((double)(totalCount - testCount) / (double)totalCount) * 100); if (progress != latestProgress) { OsmSharp.Logging.Log.TraceEvent("Routing", TraceEventType.Information, "Routing... {0}%", progress); latestProgress = progress; } } performanceInfo.Stop(); OsmSharp.Logging.Log.TraceEvent("Routing", OsmSharp.Logging.TraceEventType.Information, string.Format("{0}/{1} routes successfull!", successCount, totalCount)); }
/// <summary> /// Calculates a route between the two directed edges. The route starts in the direction of the edge and ends with an arrive in the direction of the target edge. /// </summary> /// <returns></returns> public sealed override Result <EdgePath <T> > TryCalculateRaw <T>(IProfileInstance profileInstance, WeightHandler <T> weightHandler, long sourceDirectedEdge, long targetDirectedEdge, RoutingSettings <T> settings) { try { if (!_db.Supports(profileInstance.Profile)) { return(new Result <EdgePath <T> >("Routing profile is not supported.", (message) => { return new Exception(message); })); } var maxSearch = weightHandler.Infinite; if (settings != null) { if (!settings.TryGetMaxSearch(profileInstance.Profile.FullName, out maxSearch)) { maxSearch = weightHandler.Infinite; } } var sourcePath = _db.GetPathForEdge(weightHandler, sourceDirectedEdge, true); var targetPath = _db.GetPathForEdge(weightHandler, targetDirectedEdge, false); if (sourceDirectedEdge == targetDirectedEdge) { // when edges match, path is always the edge itself. var edgePath = sourcePath; if (edgePath != null) { return(new Result <EdgePath <T> >(edgePath)); } } EdgePath <T> path; ContractedDb contracted; bool useContracted = false; if (_db.TryGetContracted(profileInstance.Profile, out contracted)) { // contracted calculation. useContracted = true; if (_db.HasComplexRestrictions(profileInstance.Profile) && !contracted.HasEdgeBasedGraph) { // there is no edge-based graph for this profile but the db has complex restrictions, don't use the contracted graph. Logging.Logger.Log("Router", Logging.TraceEventType.Warning, "There is a vertex-based contracted graph but also complex restrictions. Not using the contracted graph, add an edge-based contracted graph."); useContracted = false; } if (!contracted.HasEdgeBasedGraph) { Logging.Logger.Log("Router", Logging.TraceEventType.Warning, "There is a vertex-based contracted graph but it cannot be used to calculate routes with a start and end edge in a specific direction."); useContracted = false; } } if (useContracted) { // use the contracted graph. path = null; List <uint> vertexPath = null; if (!contracted.HasEdgeBasedGraph) { // use node-based routing. throw new Exception("Cannot use vertex-based contracted graph for edge-based calculations."); } else { // use edge-based routing. var bidirectionalSearch = new Algorithms.Contracted.EdgeBased.BidirectionalDykstra <T>(contracted.EdgeBasedGraph, weightHandler, new EdgePath <T>[] { sourcePath }, new EdgePath <T>[] { targetPath }, _db.GetGetRestrictions(profileInstance.Profile, null)); bidirectionalSearch.Run(); if (!bidirectionalSearch.HasSucceeded) { return(new Result <EdgePath <T> >(bidirectionalSearch.ErrorMessage, (message) => { return new RouteNotFoundException(message); })); } vertexPath = bidirectionalSearch.GetPath(); } // expand vertex path using the regular graph. var source = _db.CreateRouterPointForEdge(sourceDirectedEdge, true); var target = _db.CreateRouterPointForEdge(targetDirectedEdge, false); path = _db.BuildEdgePath(weightHandler, source, target, vertexPath); } else { // use the regular graph. if (_db.HasComplexRestrictions(profileInstance.Profile)) { var sourceSearch = new Algorithms.Default.EdgeBased.Dykstra <T>(_db.Network.GeometricGraph.Graph, weightHandler, _db.GetGetRestrictions(profileInstance.Profile, true), new EdgePath <T>[] { sourcePath }, maxSearch, false); var targetSearch = new Algorithms.Default.EdgeBased.Dykstra <T>(_db.Network.GeometricGraph.Graph, weightHandler, _db.GetGetRestrictions(profileInstance.Profile, false), new EdgePath <T>[] { targetPath }, maxSearch, true); var bidirectionalSearch = new Algorithms.Default.EdgeBased.BidirectionalDykstra <T>(sourceSearch, targetSearch, weightHandler); bidirectionalSearch.Run(); if (!bidirectionalSearch.HasSucceeded) { return(new Result <EdgePath <T> >(bidirectionalSearch.ErrorMessage, (message) => { return new RouteNotFoundException(message); })); } path = bidirectionalSearch.GetPath(); } else { var sourceSearch = new Dykstra <T>(_db.Network.GeometricGraph.Graph, null, weightHandler, new EdgePath <T>[] { sourcePath }, maxSearch, false); var targetSearch = new Dykstra <T>(_db.Network.GeometricGraph.Graph, null, weightHandler, new EdgePath <T>[] { targetPath }, maxSearch, true); var bidirectionalSearch = new BidirectionalDykstra <T>(sourceSearch, targetSearch, weightHandler); bidirectionalSearch.Run(); if (!bidirectionalSearch.HasSucceeded) { return(new Result <EdgePath <T> >(bidirectionalSearch.ErrorMessage, (message) => { return new RouteNotFoundException(message); })); } path = bidirectionalSearch.GetPath(); } } return(new Result <EdgePath <T> >(path)); } catch (Exception ex) { return(new Result <EdgePath <T> >(ex.Message, (m) => ex)); } }
public void RoutingRegressionTest4() { var interpreter = new OsmRoutingInterpreter(); var tagsIndex = new TagsTableCollectionIndex(); // do the data processing. var memoryData = new DynamicGraphRouterDataSource<LiveEdge>(tagsIndex); var targetData = new LiveGraphOsmStreamTarget(memoryData, interpreter, tagsIndex); var dataProcessorSource = new XmlOsmStreamSource( Assembly.GetExecutingAssembly().GetManifestResourceStream("OsmSharp.Test.Unittests.test_routing_regression1.osm")); var sorter = new OsmStreamFilterSort(); sorter.RegisterSource(dataProcessorSource); targetData.RegisterSource(sorter); targetData.Pull(); var basicRouter = new Dykstra(); var router = Router.CreateLiveFrom(memoryData, basicRouter, interpreter); // resolve the three points in question. var point35 = new GeoCoordinate(51.01257, 4.000753); var point35ResolvedCar = router.Resolve(Vehicle.Car, point35); var point35ResolvedBicycle = router.Resolve(Vehicle.Bicycle, point35); }
/// <summary> /// Tests the edge matcher in combination with dykstra routing. /// </summary> /// <param name="name"></param> /// <param name="highway"></param> /// <param name="vehicle"></param> /// <param name="matcher"></param> /// <param name="pointName"></param> /// <param name="notFound"></param> private void TestResolveOnEdgeSingle(string name, string highway, Vehicle vehicle, IEdgeMatcher matcher, string pointName, bool notFound) { var fromName = new GeoCoordinate(51.0003, 4.0007); var toName = new GeoCoordinate(51.0003, 4.0008); var fromNoname = new GeoCoordinate(51.0, 4.0007); var toNoname = new GeoCoordinate(51.0, 4.0008); TagsCollectionBase pointTags = new TagsCollection(); pointTags["name"] = pointName; TagsCollectionBase tags = new TagsCollection(); tags["highway"] = highway; //tags["name"] = name; var tagsIndex = new TagsIndex(); // do the data processing. var data = new RouterDataSource <Edge>(new Graph <Edge>(), tagsIndex); uint vertexNoname1 = data.AddVertex((float)fromNoname.Latitude, (float)fromNoname.Longitude); uint vertexNoname2 = data.AddVertex((float)toNoname.Latitude, (float)toNoname.Longitude); data.AddEdge(vertexNoname1, vertexNoname2, new Edge() { Forward = true, Tags = tagsIndex.Add(tags) }, null); tags = new TagsCollection(); tags["highway"] = highway; tags["name"] = name; uint vertexName1 = data.AddVertex((float)fromName.Latitude, (float)fromName.Longitude); uint vertexName2 = data.AddVertex((float)toName.Latitude, (float)toName.Longitude); data.AddEdge(vertexName1, vertexName2, new Edge() { Forward = true, Tags = tagsIndex.Add(tags) }, null); IRoutingInterpreter interpreter = new OsmRoutingInterpreter(); // creates the data. IRoutingAlgorithm <Edge> router = new Dykstra(); var nonameLocation = new GeoCoordinate( (fromNoname.Latitude + toNoname.Latitude) / 2.0, (fromNoname.Longitude + toNoname.Longitude) / 2.0); // var nameLocation = new GeoCoordinate( // (fromName.Latitude + toName.Latitude) / 2.0, // (fromName.Longitude + toName.Longitude) / 2.0); const float delta = 0.01f; var result = router.SearchClosest(data, interpreter, vehicle, nonameLocation, delta, matcher, pointTags, null); if (result.Distance < double.MaxValue) { // there is a result. Assert.IsFalse(notFound, "A result was found but was supposed not to be found!"); if (name == pointName) { // the name location was supposed to be found! Assert.IsTrue(result.Vertex1 == vertexName1 || result.Vertex1 == vertexName2); Assert.IsTrue(result.Vertex2 == vertexName1 || result.Vertex2 == vertexName2); } else { // the noname location was supposed to be found! Assert.IsTrue(result.Vertex1 == vertexNoname1 || result.Vertex1 == vertexNoname2); Assert.IsTrue(result.Vertex2 == vertexNoname1 || result.Vertex2 == vertexNoname2); } return; } Assert.IsTrue(notFound, "A result was not found but was supposed to be found!"); }
public void TestEdgeVisits() { // build graph. var graph = new Graph(EdgeDataSerializer.Size); graph.AddVertex(0); graph.AddVertex(1); graph.AddVertex(2); var e01 = graph.AddEdge(0, 1, EdgeDataSerializer.Serialize(new EdgeData() { Distance = 100, Profile = 1 })) + 1; var e12 = graph.AddEdge(1, 2, EdgeDataSerializer.Serialize(new EdgeData() { Distance = 100, Profile = 1 })) + 1; var e02 = graph.AddEdge(0, 2, EdgeDataSerializer.Serialize(new EdgeData() { Distance = 100, Profile = 1 })) + 1; // build speed profile function. var speed = 100f / 3.6f; Func <ushort, Factor> getFactor = (x) => { return(new Factor() { Direction = 0, Value = 1.0f / speed }); }; // run algorithm. var reportedEdges = new HashSet <long>(); var algorithm = new Dykstra(graph, getFactor, null, new EdgePath <float>[] { new EdgePath <float>(0) }, float.MaxValue, false); algorithm.WasEdgeFound += (v1, v2, w1, w2, e, l) => { if (v1 == 0 && v2 == 1) { Assert.AreEqual(100, l); Assert.AreEqual(e01, e); Assert.AreEqual(0, w1); Assert.AreEqual(100 / speed, w2); reportedEdges.Add(e01); } else if (v1 == 1 && v2 == 0) { Assert.AreEqual(100, l); Assert.AreEqual(-e01, e); Assert.AreEqual(100 / speed, w1); Assert.AreEqual(200 / speed, w2); reportedEdges.Add(-e01); } else if (v1 == 0 && v2 == 2) { Assert.AreEqual(100, l); Assert.AreEqual(e02, e); Assert.AreEqual(0, w1); Assert.AreEqual(100 / speed, w2); reportedEdges.Add(e02); } else if (v1 == 2 && v2 == 0) { Assert.AreEqual(100, l); Assert.AreEqual(-e02, e); Assert.AreEqual(100 / speed, w1); Assert.AreEqual(200 / speed, w2); reportedEdges.Add(-e02); } else if (v1 == 1 && v2 == 2) { Assert.AreEqual(100, l); Assert.AreEqual(e12, e); Assert.AreEqual(100 / speed, w1); Assert.AreEqual(200 / speed, w2); reportedEdges.Add(e12); } else if (v1 == 2 && v2 == 1) { Assert.AreEqual(100, l); Assert.AreEqual(-e12, e); Assert.AreEqual(100 / speed, w1); Assert.AreEqual(200 / speed, w2); reportedEdges.Add(-e12); } return(false); }; algorithm.Run(); Assert.IsTrue(algorithm.HasRun); Assert.IsTrue(algorithm.HasSucceeded); Assert.IsTrue(reportedEdges.Contains(e01)); Assert.IsTrue(reportedEdges.Contains(-e01)); Assert.IsTrue(reportedEdges.Contains(e02)); Assert.IsTrue(reportedEdges.Contains(-e02)); Assert.IsTrue(reportedEdges.Contains(e12)); Assert.IsTrue(reportedEdges.Contains(-e12)); }
public void RoutingSerializationRoutingTest() { const string embeddedString = "OsmSharp.Test.Unittests.test_network.osm"; // create the tags index (and make sure it's serializable). var tagsIndex = new TagsIndex(new MemoryMappedStream(new MemoryStream())); // creates a new interpreter. var interpreter = new OsmRoutingInterpreter(); // do the data processing. var original = new RouterDataSource <Edge>(new Graph <Edge>(), tagsIndex); var targetData = new GraphOsmStreamTarget( original, interpreter, tagsIndex, null, false); var dataProcessorSource = new XmlOsmStreamSource( Assembly.GetExecutingAssembly().GetManifestResourceStream(embeddedString)); targetData.RegisterSource(dataProcessorSource); targetData.Pull(); // create serializer. var routingSerializer = new RoutingDataSourceSerializer(); // serialize/deserialize. TagsCollectionBase metaData = new TagsCollection(); metaData.Add("some_key", "some_value"); byte[] byteArray; using (var stream = new MemoryStream()) { try { routingSerializer.Serialize(stream, original, metaData); byteArray = stream.ToArray(); } catch (Exception) { if (Debugger.IsAttached) { Debugger.Break(); } throw; } } var deserializedVersion = routingSerializer.Deserialize(new MemoryStream(byteArray), out metaData); Assert.AreEqual(original.TagsIndex.Get(0), deserializedVersion.TagsIndex.Get(0)); // try to do some routing on the deserialized version. var basicRouter = new Dykstra(); var router = Router.CreateFrom(deserializedVersion, basicRouter, interpreter); var source = router.Resolve(Vehicle.Car, new GeoCoordinate(51.0578532, 3.7192229)); var target = router.Resolve(Vehicle.Car, new GeoCoordinate(51.0576193, 3.7191801)); // calculate the route. var route = router.Calculate(Vehicle.Car, source, target); Assert.IsNotNull(route); Assert.AreEqual(5, route.Segments.Length); float latitude, longitude; //deserializedVersion.GetVertex(20, out latitude, out longitude); Assert.AreEqual(51.0578537, route.Segments[0].Latitude, 0.00001); Assert.AreEqual(3.71922255, route.Segments[0].Longitude, 0.00001); Assert.AreEqual(RouteSegmentType.Start, route.Segments[0].Type); //deserializedVersion.GetVertex(21, out latitude, out longitude); Assert.AreEqual(51.0578537, route.Segments[1].Latitude, 0.00001); Assert.AreEqual(3.71956515, route.Segments[1].Longitude, 0.00001); Assert.AreEqual(RouteSegmentType.Along, route.Segments[1].Type); //deserializedVersion.GetVertex(16, out latitude, out longitude); Assert.AreEqual(51.05773, route.Segments[2].Latitude, 0.00001); Assert.AreEqual(3.719745, route.Segments[2].Longitude, 0.00001); Assert.AreEqual(RouteSegmentType.Along, route.Segments[2].Type); //deserializedVersion.GetVertex(22, out latitude, out longitude); Assert.AreEqual(51.05762, route.Segments[3].Latitude, 0.00001); Assert.AreEqual(3.71965766, route.Segments[3].Longitude, 0.00001); Assert.AreEqual(RouteSegmentType.Along, route.Segments[3].Type); deserializedVersion.GetVertex(23, out latitude, out longitude); Assert.AreEqual(51.05762, route.Segments[4].Latitude, 0.00001); Assert.AreEqual(3.71917963, route.Segments[4].Longitude, 0.00001); Assert.AreEqual(RouteSegmentType.Stop, route.Segments[4].Type); }
public void RoutingSerializationRoutingTest() { const string embeddedString = "OsmSharp.Test.Unittests.test_network.osm"; // create the tags index (and make sure it's serializable). var tagsIndex = new TagsIndex(new MemoryMappedStream(new MemoryStream())); // creates a new interpreter. var interpreter = new OsmRoutingInterpreter(); // do the data processing. var original = new RouterDataSource<Edge>(new Graph<Edge>(), tagsIndex); var targetData = new GraphOsmStreamTarget( original, interpreter, tagsIndex, null, false); var dataProcessorSource = new XmlOsmStreamSource( Assembly.GetExecutingAssembly().GetManifestResourceStream(embeddedString)); targetData.RegisterSource(dataProcessorSource); targetData.Pull(); // create serializer. var routingSerializer = new RoutingDataSourceSerializer(); // serialize/deserialize. TagsCollectionBase metaData = new TagsCollection(); metaData.Add("some_key", "some_value"); byte[] byteArray; using (var stream = new MemoryStream()) { try { routingSerializer.Serialize(stream, original, metaData); byteArray = stream.ToArray(); } catch (Exception) { if (Debugger.IsAttached) { Debugger.Break(); } throw; } } var deserializedVersion = routingSerializer.Deserialize(new MemoryStream(byteArray), out metaData); Assert.AreEqual(original.TagsIndex.Get(0), deserializedVersion.TagsIndex.Get(0)); // try to do some routing on the deserialized version. var basicRouter = new Dykstra(); var router = Router.CreateFrom(deserializedVersion, basicRouter, interpreter); var source = router.Resolve(Vehicle.Car, new GeoCoordinate(51.0578532, 3.7192229)); var target = router.Resolve(Vehicle.Car, new GeoCoordinate(51.0576193, 3.7191801)); // calculate the route. var route = router.Calculate(Vehicle.Car, source, target); Assert.IsNotNull(route); Assert.AreEqual(5, route.Segments.Length); float latitude, longitude; //deserializedVersion.GetVertex(20, out latitude, out longitude); Assert.AreEqual(51.0578537, route.Segments[0].Latitude, 0.00001); Assert.AreEqual(3.71922255, route.Segments[0].Longitude, 0.00001); Assert.AreEqual(RouteSegmentType.Start, route.Segments[0].Type); //deserializedVersion.GetVertex(21, out latitude, out longitude); Assert.AreEqual(51.0578537, route.Segments[1].Latitude, 0.00001); Assert.AreEqual(3.71956515, route.Segments[1].Longitude, 0.00001); Assert.AreEqual(RouteSegmentType.Along, route.Segments[1].Type); //deserializedVersion.GetVertex(16, out latitude, out longitude); Assert.AreEqual(51.05773, route.Segments[2].Latitude, 0.00001); Assert.AreEqual(3.719745, route.Segments[2].Longitude, 0.00001); Assert.AreEqual(RouteSegmentType.Along, route.Segments[2].Type); //deserializedVersion.GetVertex(22, out latitude, out longitude); Assert.AreEqual(51.05762, route.Segments[3].Latitude, 0.00001); Assert.AreEqual(3.71965766, route.Segments[3].Longitude, 0.00001); Assert.AreEqual(RouteSegmentType.Along, route.Segments[3].Type); deserializedVersion.GetVertex(23, out latitude, out longitude); Assert.AreEqual(51.05762, route.Segments[4].Latitude, 0.00001); Assert.AreEqual(3.71917963, route.Segments[4].Longitude, 0.00001); Assert.AreEqual(RouteSegmentType.Stop, route.Segments[4].Type); }
/// <summary> /// Creates a router. /// </summary> /// <param name="interpreter"></param> /// <param name="manifestResourceName"></param> /// <returns></returns> protected override Router CreateRouter(IOsmRoutingInterpreter interpreter, string manifestResourceName) { TagsTableCollectionIndex tagsIndex = new TagsTableCollectionIndex(); // do the data processing. DynamicGraphRouterDataSource<LiveEdge> memoryData = new DynamicGraphRouterDataSource<LiveEdge>(tagsIndex); LiveGraphOsmStreamTarget target_data = new LiveGraphOsmStreamTarget( memoryData, interpreter, tagsIndex, null, false); XmlOsmStreamSource dataProcessorSource = new XmlOsmStreamSource( Assembly.GetExecutingAssembly().GetManifestResourceStream(manifestResourceName)); OsmStreamFilterSort sorter = new OsmStreamFilterSort(); sorter.RegisterSource(dataProcessorSource); target_data.RegisterSource(sorter); target_data.Pull(); IRoutingAlgorithm<LiveEdge> basicRouter = new Dykstra(); return Router.CreateLiveFrom(memoryData, basicRouter, interpreter); }