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); }
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); }