/// <summary> /// Deletes all nodes without neighbors from our final graph. /// </summary> protected override void CutNodesWithoutNeighbors() { var nodesToRemove = OsmGraph.AsParallel().Where(node => node.Value.Count == 0).ToList(); foreach (var node in nodesToRemove) { OsmGraph.Remove(node.Key); } }
/// <summary> /// Adds Node to final graph (adj list). /// </summary> /// <param name="id"></param> /// <param name="lat">Latitude</param> /// <param name="lon">Longitude</param> /// <returns></returns> public override IGraph AddNodeToGraph(long id, float lat, float lon) { if (OsmGraph.ContainsKey(id)) { return(this); } OsmGraph.Add(id, new LinkedList <INode>()); _nodes.Add(id, new Node(id, lat, lon)); return(this); }
/// <summary> /// Adds Edge from given source (srcNodeId) to destinatio (dstNodeId) with given distance. /// </summary> /// <param name="srcNodeId">Source Node Id</param> /// <param name="dstNodeId">Destination Node Id</param> /// <param name="distance">Distance between srcNode and dstNode</param> protected override void AddDirectedEdge(long srcNodeId, long dstNodeId, double distance) { var dstNode = _nodes.ContainsKey(dstNodeId) ? _nodes[dstNodeId] : new Node(dstNodeId); dstNode.Distance = distance; if (!OsmGraph.ContainsKey(srcNodeId)) { OsmGraph.Add(srcNodeId, new LinkedList <INode>()); OsmGraph[srcNodeId].AddFirst(dstNode); } else if (OsmGraph[srcNodeId].All(n => n.Id != dstNodeId)) // edge not present { OsmGraph[srcNodeId].AddFirst(dstNode); } // else, edge already present, therefore nothing to do anymore }
/// <summary> /// Returns amount of edges in graph. /// </summary> /// <returns></returns> public override long CountEdges() => OsmGraph.Sum(node => node.Value.Count);