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); }
async public Task <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 sourceNode = null; NetworkSourceEdgeInput sourceEdge = null; if (input.Collect(NetworkTracerInputType.SourceNode).Count == 1) { sourceNode = input.Collect(NetworkTracerInputType.SourceNode)[0] as NetworkSourceInput; } else if (input.Collect(NetworkTracerInputType.SoruceEdge).Count == 1) { sourceEdge = input.Collect(NetworkTracerInputType.SoruceEdge)[0] as NetworkSourceEdgeInput; } else { return(null); } Dijkstra dijkstra = new Dijkstra(cancelTraker); dijkstra.reportProgress += this.ReportProgress; dijkstra.ApplySwitchState = input.Contains(NetworkTracerInputType.IgnoreSwitches) == false && network.HasDisabledSwitches; Dijkstra.ApplyInputIds(dijkstra, input); if (sourceNode != null) { dijkstra.Calculate(gt, sourceNode.NodeId); } else if (sourceEdge != null) { IGraphEdge graphEdge = gt.QueryEdge(sourceEdge.EdgeId); if (graphEdge == null) { return(null); } bool n1_2_n2 = gt.QueryN1ToN2(graphEdge.N1, graphEdge.N2) != null; bool n2_2_n1 = gt.QueryN1ToN2(graphEdge.N2, graphEdge.N1) != null; bool n1switchState = dijkstra.ApplySwitchState ? gt.SwitchState(graphEdge.N1) : true; bool n2switchState = dijkstra.ApplySwitchState ? gt.SwitchState(graphEdge.N2) : true; if (n1_2_n2 && n1switchState == true) { dijkstra.Calculate(gt, graphEdge.N1); } else if (n2_2_n1 && n2switchState == true) { dijkstra.Calculate(gt, graphEdge.N2); } else { return(null); } } Dijkstra.Nodes dijkstraNodes = dijkstra.DijkstraNodesWithMaxDistance(double.MaxValue); if (dijkstraNodes == null) { return(null); } ProgressReport report = (ReportProgress != null ? new ProgressReport() : null); int counter = 0; #region Collect Disconnected Nodes int maxNodeId = network.MaxNodeId; if (report != null) { report.Message = "Collected Disconnected Nodes..."; report.featurePos = 0; report.featureMax = maxNodeId; ReportProgress(report); } List <int> connectedNodeIds = dijkstraNodes.IdsToList(); connectedNodeIds.Sort(); List <int> disconnectedNodeIds = new List <int>(); for (int id = 1; id <= maxNodeId; id++) { counter++; if (report != null && counter % 1000 == 0) { report.featurePos = counter; ReportProgress(report); } if (connectedNodeIds.BinarySearch(id) >= 0) { continue; } disconnectedNodeIds.Add(id); } #endregion #region Collect EdgedIds if (report != null) { report.Message = "Collected Edges..."; report.featurePos = 0; report.featureMax = dijkstraNodes.Count; ReportProgress(report); } List <int> edgeIds = new List <int>(); foreach (int id in disconnectedNodeIds) { GraphTableRows gtRows = gt.QueryN1(id); if (gtRows == null) { continue; } foreach (IGraphTableRow gtRow in gtRows) { int index = edgeIds.BinarySearch(gtRow.EID); if (index < 0) { edgeIds.Insert(~index, gtRow.EID); } } counter++; if (report != null && counter % 1000 == 0) { report.featurePos = counter; ReportProgress(report); } } #endregion NetworkTracerOutputCollection output = new NetworkTracerOutputCollection(); if (report != null) { report.Message = "Add Edges..."; report.featurePos = 0; report.featureMax = edgeIds.Count; ReportProgress(report); } counter = 0; NetworkPathOutput pathOutput = new NetworkPathOutput(); foreach (int edgeId in edgeIds) { pathOutput.Add(new NetworkEdgeOutput(edgeId)); counter++; if (report != null && counter % 1000 == 0) { report.featurePos = counter; ReportProgress(report); } } output.Add(pathOutput); if (input.Collect(NetworkTracerInputType.AppendNodeFlags).Count > 0) { await Helper.AppendNodeFlags(network, gt, disconnectedNodeIds, output); } return(output); }
async public Task <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; NetworkWeighInput weight = input.Contains(NetworkTracerInputType.Weight) ? input.Collect(NetworkTracerInputType.Weight)[0] as NetworkWeighInput : null; Dijkstra dijkstra = new Dijkstra(cancelTraker); dijkstra.reportProgress += this.ReportProgress; dijkstra.MaxDistance = _properties.Distance; 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); NetworkTracerOutputCollection output = new NetworkTracerOutputCollection(); #region Knoten/Kanten <= Distance Dijkstra.Nodes dijkstraNodes = dijkstra.DijkstraNodesWithMaxDistance(_properties.Distance); if (dijkstraNodes == null) { return(null); } List <int> edgeIds = new List <int>(); foreach (Dijkstra.Node dijkstraNode in dijkstraNodes) { if (dijkstraNode.EId < 0) { continue; } int index = edgeIds.BinarySearch(dijkstraNode.EId); if (index < 0) { edgeIds.Insert(~index, dijkstraNode.EId); } if (Math.Abs(dijkstraNode.Dist - _properties.Distance) < double.Epsilon) { // ToDo: Flag einfügen!! } } output.Add(new NetworkEdgeCollectionOutput(edgeIds)); #endregion #region Knoten/Kanten > Distance Dijkstra.Nodes cnodes = dijkstra.DijkstraNodesDistanceGreaterThan(_properties.Distance); foreach (Dijkstra.Node cnode in cnodes) { Dijkstra.Node node = dijkstra.DijkstraNodes.ById(cnode.Pre); if (node == null) { continue; } IGraphEdge graphEdge = gt.QueryEdge(cnode.EId); if (graphEdge == null) { continue; } RowIDFilter filter = new RowIDFilter(String.Empty); filter.IDs.Add(graphEdge.Eid); IFeatureCursor cursor = await network.GetEdgeFeatures(filter); if (cursor == null) { continue; } IFeature feature = await cursor.NextFeature(); if (feature == null) { continue; } IPath path = null; if (cnode.Id != graphEdge.N2 && cnode.Id == graphEdge.N1) { ((Polyline)feature.Shape)[0].ChangeDirection(); } double trimDist = _properties.Distance - node.Dist; string label = _properties.Distance.ToString(); if (weight != null) { double w = gt.QueryEdgeWeight(weight.Weight.Guid, cnode.EId); switch (weight.WeightApplying) { case WeightApplying.Weight: trimDist *= w; break; case WeightApplying.ActualCosts: trimDist = ((IPolyline)feature.Shape)[0].Length * trimDist * w; // ??? Prüfen break; } label += "\n(" + Math.Round(node.GeoDist + trimDist, 2).ToString() + ")"; } path = ((IPolyline)feature.Shape)[0].Trim(trimDist); Polyline polyline = new Polyline(); polyline.AddPath(path); output.Add(new NetworkEdgePolylineOutput(cnode.EId, polyline)); output.Add(new NetworkFlagOutput( polyline[0][polyline[0].PointCount - 1], label)); } #endregion 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 sourceNode = null; NetworkSourceEdgeInput sourceEdge = null; if (input.Collect(NetworkTracerInputType.SourceNode).Count == 1) { sourceNode = input.Collect(NetworkTracerInputType.SourceNode)[0] as NetworkSourceInput; } else if (input.Collect(NetworkTracerInputType.SoruceEdge).Count == 1) { sourceEdge = input.Collect(NetworkTracerInputType.SoruceEdge)[0] as NetworkSourceEdgeInput; } else { return(null); } Dijkstra dijkstra = new Dijkstra(cancelTraker); dijkstra.reportProgress += this.ReportProgress; dijkstra.ApplySwitchState = input.Contains(NetworkTracerInputType.IgnoreSwitches) == false && network.HasDisabledSwitches; Dijkstra.ApplyInputIds(dijkstra, input); if (sourceNode != null) { dijkstra.Calculate(gt, sourceNode.NodeId); } else if (sourceEdge != null) { IGraphEdge graphEdge = gt.QueryEdge(sourceEdge.EdgeId); if (graphEdge == null) { return(null); } bool n1_2_n2 = gt.QueryN1ToN2(graphEdge.N1, graphEdge.N2) != null; bool n2_2_n1 = gt.QueryN1ToN2(graphEdge.N2, graphEdge.N1) != null; bool n1switchState = dijkstra.ApplySwitchState ? gt.SwitchState(graphEdge.N1) : true; bool n2switchState = dijkstra.ApplySwitchState ? gt.SwitchState(graphEdge.N2) : true; if (n1_2_n2 && n1switchState == true) { dijkstra.Calculate(gt, graphEdge.N1); } else if (n2_2_n1 && n2switchState == true) { dijkstra.Calculate(gt, graphEdge.N2); } else { return(null); } } Dijkstra.Nodes dijkstraNodes = dijkstra.DijkstraNodesWithMaxDistance(double.MaxValue); if (dijkstraNodes == null) { return(null); } ProgressReport report = (ReportProgress != null ? new ProgressReport() : null); #region Collect EdgedIds if (report != null) { report.Message = "Collected Edges..."; report.featurePos = 0; report.featureMax = dijkstraNodes.Count; ReportProgress(report); } NetworkInputForbiddenEdgeIds forbiddenEdgeIds = (input.Contains(NetworkTracerInputType.ForbiddenEdgeIds)) ? input.Collect(NetworkTracerInputType.ForbiddenEdgeIds)[0] as NetworkInputForbiddenEdgeIds : null; NetworkInputForbiddenStartNodeEdgeIds forbiddenStartNodeEdgeIds = (input.Contains(NetworkTracerInputType.ForbiddenStartNodeEdgeIds)) ? input.Collect(NetworkTracerInputType.ForbiddenStartNodeEdgeIds)[0] as NetworkInputForbiddenStartNodeEdgeIds : null; int counter = 0; List <int> edgeIds = new List <int>(); List <int> nodeIds = new List <int>(); foreach (Dijkstra.Node dijkstraNode in dijkstraNodes) { if (gt.GetNodeType(dijkstraNode.Id) == TargetNodeType) { nodeIds.Add(dijkstraNode.Id); } if (dijkstra.ApplySwitchState) { if (gt.SwitchState(dijkstraNode.Id) == false) // hier ist Schluss!! { continue; } } GraphTableRows gtRows = gt.QueryN1(dijkstraNode.Id); if (gtRows == null) { continue; } foreach (IGraphTableRow gtRow in gtRows) { int eid = gtRow.EID; if (sourceNode != null && forbiddenStartNodeEdgeIds != null && dijkstraNode.Id == sourceNode.NodeId && forbiddenStartNodeEdgeIds.Ids.Contains(eid)) { continue; } if (forbiddenEdgeIds != null && forbiddenEdgeIds.Ids.Contains(eid)) { continue; } int index = edgeIds.BinarySearch(eid); if (index < 0) { edgeIds.Insert(~index, eid); } } counter++; if (report != null && counter % 1000 == 0) { report.featurePos = counter; ReportProgress(report); } } #endregion NetworkTracerOutputCollection output = new NetworkTracerOutputCollection(); if (report != null) { report.Message = "Add Edges..."; report.featurePos = 0; report.featureMax = edgeIds.Count; ReportProgress(report); } #region Collection Nodes counter = 0; foreach (int nodeId in nodeIds) { int fcId = gt.GetNodeFcid(nodeId); IFeature nodeFeature = network.GetNodeFeature(nodeId); if (nodeFeature != null && nodeFeature.Shape is IPoint) { //outputCollection.Add(new NetworkNodeFlagOuput(endNode.Id, nodeFeature.Shape as IPoint)); output.Add(new NetworkFlagOutput(nodeFeature.Shape as IPoint, new NetworkFlagOutput.NodeFeatureData(nodeId, fcId, Convert.ToInt32(nodeFeature["OID"]), TargetNodeType.ToString()))); } counter++; if (report != null && counter % 1000 == 0) { report.featurePos = counter; ReportProgress(report); } } #endregion #region Collection Edges counter = 0; NetworkPathOutput pathOutput = new NetworkPathOutput(); foreach (int edgeId in edgeIds) { pathOutput.Add(new NetworkEdgeOutput(edgeId)); counter++; if (report != null && counter % 1000 == 0) { report.featurePos = counter; ReportProgress(report); } } output.Add(pathOutput); if (input.Collect(NetworkTracerInputType.AppendNodeFlags).Count > 0) { Helper.AppendNodeFlags(network, gt, Helper.NodeIds(dijkstraNodes), output); } #endregion return(output); }