private List <Node> GetNodes(GeoJosn latLongs) { var nodes = new List <Node>(); foreach (var item in latLongs.features) { nodes.Add(new Node { Id = MongoDB.Bson.ObjectId.GenerateNewId().ToString(), Start = item.properties.FromNode.ToString(), End = item.properties.ToNode.ToString(), FullPath = item.properties.FromNode.ToString() + "-" + item.properties.ToNode.ToString(), Coordinates = item.geometry.coordinates }); } return(nodes); }
private List <Node> GetMSTPaths(GeoJosn latLongs) { var nodes = GetNodes(latLongs); do { var groupedNodes = nodes.GroupBy(x => x.Start); var maxGroupNodes = GetMaxNodes(groupedNodes); if (maxGroupNodes == 1) { break; } nodes = ProcessStartEndNodes(groupedNodes, true); } while (true); do { var groupedNodes = nodes.GroupBy(x => x.End); var maxGroupNodes = GetMaxNodes(groupedNodes); if (maxGroupNodes == 1) { break; } nodes = ProcessStartEndNodes(groupedNodes, false); } while (true); do { var optimizedNodes = new List <Node>(); var excluded = new List <int>(); for (int i = 0; i < nodes.Count(); i++) { var isBreak = false; for (int j = 0; j < nodes.Count(); j++) { if (i == j) { continue; } var startNode = nodes[i]; var endNode = nodes[j]; if (startNode.End == endNode.Start) { optimizedNodes.Add(MergeCrossNodes(startNode, endNode)); excluded.Add(i); excluded.Add(j); isBreak = true; break; } } if (isBreak) { break; } } if (optimizedNodes.Count == 0) { break; } for (int i = 0; i < nodes.Count(); i++) { if (excluded.Contains(i)) { continue; } optimizedNodes.Add(nodes[i]); } nodes = optimizedNodes; } while (true); return(nodes); }