Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }