public Result <bool> TryCheckConnectivity(Profile profile, RouterPoint point, float radiusInMeters) { if (!this._db.Supports(profile)) { return(new Result <bool>("Routing profile is not supported.", (Func <string, Exception>)(message => new Exception(message)))); } Func <ushort, Factor> getFactor = this.GetGetFactor(profile); OsmSharp.Routing.Algorithms.Default.Dykstra dykstra = new OsmSharp.Routing.Algorithms.Default.Dykstra(this._db.Network.GeometricGraph.Graph, getFactor, (IEnumerable <Path>)point.ToPaths(this._db, getFactor, true), radiusInMeters, false); dykstra.Run(); if (!dykstra.HasSucceeded) { return(new Result <bool>(false)); } return(new Result <bool>(dykstra.MaxReached)); }
public BidirectionalDykstra(Dykstra sourceSearch, Dykstra targetSearch) { this._sourceSearch = sourceSearch; this._targetSearch = targetSearch; }
protected override void DoRun() { this._best = new Path[this._targets.Count]; Path[] paths1 = this._source.ToPaths(this._routerDb, this._getFactor, true); Dictionary <uint, OneToMany.LinkedTarget> targetIndexesPerVertex = new Dictionary <uint, OneToMany.LinkedTarget>(); IEnumerable <Path>[] targetPaths = new IEnumerable <Path> [this._targets.Count]; for (int index1 = 0; index1 < this._targets.Count; ++index1) { Path[] paths2 = this._targets[index1].ToPaths(this._routerDb, this._getFactor, false); targetPaths[index1] = (IEnumerable <Path>)paths2; if ((int)this._source.EdgeId == (int)this._targets[index1].EdgeId) { this._best[index1] = this._source.PathTo(this._routerDb, this._getFactor, this._targets[index1]); } for (int index2 = 0; index2 < paths2.Length; ++index2) { OneToMany.LinkedTarget valueOrDefault = targetIndexesPerVertex.TryGetValueOrDefault <uint, OneToMany.LinkedTarget>(paths2[index2].Vertex); targetIndexesPerVertex[paths2[index2].Vertex] = new OneToMany.LinkedTarget() { Target = index1, Next = valueOrDefault }; } } float sourceMax = 0.0f; for (int index = 0; index < this._best.Length; ++index) { if (this._best[index] == null) { sourceMax = this._maxSearch; } else if ((double)this._best[index].Weight > (double)sourceMax) { sourceMax = this._best[index].Weight; } } Dykstra dykstra = new Dykstra(this._routerDb.Network.GeometricGraph.Graph, this._getFactor, (IEnumerable <Path>)paths1, sourceMax, false); dykstra.WasFound += (Dykstra.WasFoundDelegate)((vertex, weight) => { OneToMany.LinkedTarget next; if (targetIndexesPerVertex.TryGetValue(vertex, out next)) { for (; next != null; next = next.Next) { Path path1 = this._best[next.Target]; foreach (Path path2 in targetPaths[next.Target]) { Path visit; dykstra.TryGetVisit(vertex, out visit); if ((int)path2.Vertex == (int)vertex) { if (path1 != null) { if ((double)path2.Weight + (double)weight >= (double)path1.Weight) { break; } } path1 = !this._targets[next.Target].IsVertex(this._routerDb, visit.Vertex) ? new Path(this._targets[next.Target].VertexId(this._routerDb), path2.Weight + weight, visit) : visit; break; } } this._best[next.Target] = path1; } } return(false); }); dykstra.Run(); this.HasSucceeded = true; }