コード例 #1
0
ファイル: Router.cs プロジェクト: hungdluit/OsmSharp
        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));
        }
コード例 #2
0
 public BidirectionalDykstra(Dykstra sourceSearch, Dykstra targetSearch)
 {
     this._sourceSearch = sourceSearch;
     this._targetSearch = targetSearch;
 }
コード例 #3
0
        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;
        }