예제 #1
0
        public static void CreateStopGroups(double maxDistance)
        {
            var result = new List<StopGroup>();
            var allStops = DbManager.GetAllStops();

            // A feldolgozás szekvenciális, nem lehet hatékonyan párhuzamosítani!
            allStops.ForEach(stop =>
            {
                // Only if the current stop is not contained by a stopgroup
                if (!result.Exists(sg => sg.GetStops().Contains(stop)))
                {
                    bool createNewGroup = true;

                    foreach (StopGroup sg in result)
                    {
                        // Similar names (one contains the other & length difference is small)
                        // Example: "Cinkota" VS "Cinkota H"
                        // Megj.: sajnos van azonos nevű megálló nagyon távoli helyeken is... -> fals átszállás
                        //if (sg.GetStops().Exists(s => s.HasSimilarNameTo(stop.StopName)))
                        //{
                        //    sg.AddStop(stop);
                        //    createNewGroup = false;
                        //    break;
                        //}

                        // Not similar name, but it's near
                        if (sg.GetMaxDistanceTo(stop.StopLatitude, stop.StopLongitude) <= maxDistance)
                        {
                            sg.AddStop(stop);
                            createNewGroup = false;
                            break;
                        }
                    }

                    if (createNewGroup)
                    {
                        var sg = new StopGroup();
                        sg.AddStop(stop);
                        result.Add(sg);
                    }
                }
            });

            // szóljunk az adatbázisnak, hogy végezze el az UPDATE-eket
            Console.WriteLine("Updating database...");
            DbManager.UpdateStopGroups(result);
        }
예제 #2
0
        /// <summary>
        /// Creates and returns the stopgroups
        /// </summary>
        /// <param name="maxDistance">add element if the maximum distance from the
        /// group elements is less or equal to this (metres)</param>
        /// <returns>stopgroups</returns>
        public static List<StopGroup> GetStopGroups(double maxDistance, Dictionary<int, List<int>> stopsTripsDict = null, Dictionary<int, List<StopTime>> tripsTimesDict = null)
        {
            var result = new List<StopGroup>();
            var allStops = DbManager.GetAllStops();

            // default paraméterértéknél ne keressünk továbblépési pontokat, mert elszállna a program
            var dontFindNextStops = (stopsTripsDict == null || tripsTimesDict == null);

            // A feldolgozás szekvenciális, nem lehet hatékonyan párhuzamosítani!
            allStops.ForEach(stop =>
            {
                // Only if the current stop is not contained by a stopgroup
                if (!result.Exists(sg => sg.GetStops().Contains(stop)))
                {
                    bool createNewGroup = true;

                    foreach (StopGroup sg in result)
                    {
                        // Similar names (one contains the other & length difference is small)
                        // Example: "Cinkota" VS "Cinkota H"
                        if (sg.GetStops().Exists(s => s.HasSimilarNameTo(stop.StopName)))
                        {
                            if (dontFindNextStops)
                            {
                                sg.AddStop(stop);
                            }
                            else
                            {
                                // Adjuk hozzá ÉS keressük meg a lehetséges továbblépési pontokat is!
                                sg.AddStop(stop, stopsTripsDict, tripsTimesDict, allStops);
                            }
                            createNewGroup = false;
                            break;
                        }

                        // Not similar name, but it's near
                        else if (sg.GetMaxDistanceTo(stop.StopLatitude, stop.StopLongitude) <= maxDistance)
                        {
                            if (dontFindNextStops)
                            {
                                sg.AddStop(stop);
                            }
                            else
                            {
                                // Adjuk hozzá ÉS keressük meg a lehetséges továbblépési pontokat is!
                                sg.AddStop(stop, stopsTripsDict, tripsTimesDict, allStops);
                            }
                            createNewGroup = false;
                            break;
                        }
                    }

                    if (createNewGroup)
                    {
                        var sg = new StopGroup();
                        if (dontFindNextStops)
                        {
                            sg.AddStop(stop);
                        }
                        else
                        {
                            // Adjuk hozzá ÉS keressük meg a lehetséges továbblépési pontokat is!
                            sg.AddStop(stop, stopsTripsDict, tripsTimesDict, allStops);
                        }
                        result.Add(sg);
                    }
                }
            });

            // A visszatérési érték az összes létrehozott csoport.
            // Minden megálló bekerül valamilyen csoportba, ha más nem, akkor egy-eleműbe.
            return result;
        }