async public Task <NetworkTracerOutputCollection> Trace(INetworkFeatureClass network, NetworkTracerInputCollection input, ICancelTracker cancelTraker)
        {
            if (network == null || !CanTrace(input))
            {
                return(null);
            }

            GraphTable         gt     = new GraphTable(network.GraphTableAdapter());
            NetworkSourceInput source = input.Collect(NetworkTracerInputType.SourceNode)[0] as NetworkSourceInput;
            NetworkSinkInput   sink   = input.Collect(NetworkTracerInputType.SinkNode)[0] as NetworkSinkInput;

            Dijkstra dijkstra = new Dijkstra(cancelTraker);

            dijkstra.reportProgress  += this.ReportProgress;
            dijkstra.ApplySwitchState = input.Contains(NetworkTracerInputType.IgnoreSwitches) == false &&
                                        network.HasDisabledSwitches;
            Dijkstra.ApplyInputIds(dijkstra, input);

            // Kürzesten Weg berechenen
            if (!dijkstra.Calculate(gt, source.NodeId, sink.NodeId))
            {
                return(null);
            }

            Dijkstra.Nodes initialNodes = dijkstra.DijkstraPathNodes(sink.NodeId);
            dijkstra = new Dijkstra(initialNodes, cancelTraker);
            dijkstra.ForbiddenTargetNodeIds = initialNodes.IdsToList();

            for (int i = 1; i < initialNodes.Count - 1; i++)
            {
                dijkstra.Calculate(gt, initialNodes[i].Id);
            }

            NetworkTracerOutputCollection output = new NetworkTracerOutputCollection();

            NetworkPathOutput pathOutput = new NetworkPathOutput();

            Dijkstra.Nodes nodes = dijkstra.DijkstraNodes;
            foreach (Dijkstra.Node node in nodes)
            {
                pathOutput.Add(new NetworkEdgeOutput(node.EId));
            }
            output.Add(pathOutput);

            if (input.Collect(NetworkTracerInputType.AppendNodeFlags).Count > 0)
            {
                await Helper.AppendNodeFlags(network, gt, Helper.NodeIds(nodes), output);
            }

            return(output);
        }
示例#2
0
        public NetworkTracerOutputCollection Trace(INetworkFeatureClass network, NetworkTracerInputCollection input, gView.Framework.system.ICancelTracker cancelTraker)
        {
            if (network == null || !CanTrace(input))
            {
                return(null);
            }

            GraphTable         gt     = new GraphTable(network.GraphTableAdapter());
            NetworkSourceInput source = input.Collect(NetworkTracerInputType.SourceNode)[0] as NetworkSourceInput;
            NetworkSinkInput   sink   = input.Collect(NetworkTracerInputType.SinkNode)[0] as NetworkSinkInput;
            NetworkWeighInput  weight =
                input.Contains(NetworkTracerInputType.Weight) ?
                input.Collect(NetworkTracerInputType.Weight)[0] as NetworkWeighInput :
                null;

            Dijkstra dijkstra = new Dijkstra(cancelTraker);

            dijkstra.reportProgress += this.ReportProgress;
            if (weight != null)
            {
                dijkstra.GraphWeight    = weight.Weight;
                dijkstra.WeightApplying = weight.WeightApplying;
            }
            dijkstra.ApplySwitchState = input.Contains(NetworkTracerInputType.IgnoreSwitches) == false &&
                                        network.HasDisabledSwitches;
            Dijkstra.ApplyInputIds(dijkstra, input);

            dijkstra.Calculate(gt, source.NodeId, sink.NodeId);
            Dijkstra.NetworkPath networkPath = dijkstra.DijkstraPath(sink.NodeId);
            if (networkPath == null)
            {
                return(null);
            }

            NetworkTracerOutputCollection output = new NetworkTracerOutputCollection();

            NetworkPathOutput pathOutput = new NetworkPathOutput();

            foreach (Dijkstra.NetworkPathEdge pathEdge in networkPath)
            {
                pathOutput.Add(new NetworkEdgeOutput(pathEdge.EId));
            }

            output.Add(pathOutput);

            if (input.Collect(NetworkTracerInputType.AppendNodeFlags).Count > 0)
            {
                Dijkstra.Nodes pathNodes = dijkstra.DijkstraPathNodes(sink.NodeId);
                Helper.AppendNodeFlags(network, gt, Helper.NodeIds(pathNodes), output);
            }
            //if (pathNodes != null)
            //{
            //    foreach (Dijkstra.Node node in pathNodes)
            //    {
            //        string label = node.Dist.ToString();
            //        if (weight != null)
            //        {
            //            label += "\n(" + (Math.Round(node.GeoDist, 2)).ToString() + ")";
            //        }
            //        output.Add(new NetworkNodeFlagOuput(node.Id));
            //    }
            //}

            return(output);
        }