Beispiel #1
0
        private static void OrderAreaIds()
        {
            using (var db = new TransportContext())
            {
                var i = 0;
                foreach (var area in db.Areas.ToList())
                {
                    if (area.AreaId != i)
                    {
                        // сдвигаем
                        var areaRoutes =
                            db.AreaRoutes.Where(ar => ar.OriginId == area.AreaId || ar.DestinationId == area.AreaId)
                                .ToList();

                        db.AreaRoutes.RemoveRange(areaRoutes);
                        foreach (var building in db.Buildings.Where(b => b.AreaId == area.AreaId))
                        {
                            building.AreaId = null;
                        }

                        foreach (var busstop in db.Busstops.Where(bs => bs.AreaId == area.AreaId))
                        {
                            busstop.AreaId = null;
                        }

                        db.Areas.Remove(area);
                        db.SaveChanges();

                        foreach (var areaRoute in areaRoutes)
                        {
                            if (areaRoute.OriginId == area.AreaId) areaRoute.OriginId = i;
                            if (areaRoute.DestinationId == area.AreaId) areaRoute.DestinationId = i;
                        }

                        area.AreaId = i;
                        db.Areas.Add(area);
                        db.AreaRoutes.AddRange(areaRoutes);

                        foreach (var building in db.Buildings.Where(b => b.AreaId == null))
                        {
                            building.AreaId = i;
                        }

                        foreach (var busstop in db.Busstops.Where(bs => bs.AreaId == null))
                        {
                            busstop.AreaId = i;
                        }

                        db.SaveChanges();
                    }

                    i++;
                }
            }
        }
Beispiel #2
0
        public TRequestsController(TransportContext context)
        {
            _context = context;

            if (_context.TRequest.Count() == 0)
            {
                // Create a new TodoItem if collection is empty,
                // which means you can't delete all TodoItems.
                _context.TRequest.Add(new TRequest
                {
                    CreatedDateTime        = DateTime.Now,
                    UserId                 = 1,
                    CustomPurpose          = "test",
                    ModifiedDateTime       = DateTime.Now,
                    ModifiedUserId         = 1,
                    NeededDateTime         = DateTime.Now,
                    RequestApproveStatusId = 1,
                    RequestBy              = 1,
                    RequestDescription     = "test",
                    RequestedDate          = DateTime.Now,
                    RequestPurposeId       = 1,
                    ReturnDateTime         = DateTime.Now,
                    StatusId               = 3
                });
                _context.SaveChanges();
            }
        }
Beispiel #3
0
        /// <summary>
        /// расчет количества людей в зоне
        /// </summary>
        private static void CountPeopleInAreas()
        {
            const double squarePerPerson = 22.8; // площадь на одного человека
            const double livingSpacePercentage = 0.875;

            var purposes = new[] { "Жилой дом", "Жилой дом с административными помещениями", "Частный дом", "Таунхаус", "Коттедж" };

            using (var db = new TransportContext())
            {
                var pb = new ProgressBar(db.Areas.Count() - 1, "Расчет людей, проживающих в зонах");
                var p = 0;
                foreach (var area in db.Areas.Include(a => a.Buildings))
                {
                    var sum = 0;
                    foreach (var b in area.Buildings)
                    {
                        if (purposes.Contains(b.Purpose) && b.Levels > 0 && b.Square > 0)
                        {
                            int levels = b.Purpose == "Жилой дом с административными помещениями" ? b.Levels - 1 : b.Levels;
                            sum += (int)(b.Square * levels * livingSpacePercentage / squarePerPerson);
                        }
                    }
                    area.People = sum;
                    pb.Report(++p);
                }
                pb.Pause();
                Console.WriteLine(Environment.NewLine + "Сохраняем в БД...");
                db.SaveChanges();
                Console.WriteLine($"Суммарное количетсов жителей: {db.Areas.Sum(a => a.People)}");
            }
        }
Beispiel #4
0
        static void ClearDatabase()
        {
            using (var transportCtx = new TransportContext())
            {
                if (!transportCtx.Addresses.Any() &&
                    !transportCtx.Buildings.Any() &&
                    !transportCtx.Busstops.Any() &&
                    !transportCtx.OrgFils.Any() &&
                    !transportCtx.OrgRubs.Any() &&
                    !transportCtx.Orgs.Any())
                {
                    return;
                }

                Console.Write("Очистка данных БД... ");

                transportCtx.Addresses.RemoveRange(transportCtx.Addresses);
                transportCtx.Buildings.RemoveRange(transportCtx.Buildings);
                transportCtx.Busstops.RemoveRange(transportCtx.Busstops);
                transportCtx.Orgs.RemoveRange(transportCtx.Orgs);
                transportCtx.OrgFils.RemoveRange(transportCtx.OrgFils);
                transportCtx.OrgRubs.RemoveRange(transportCtx.OrgRubs);
                transportCtx.SaveChanges();

                Console.WriteLine("завершено");
            }
        }
Beispiel #5
0
        /// <summary>
        /// Заполняем площади пропущенных домов
        /// </summary>
        private static void SetAreaToBuildings()
        {
            using (var db = new TransportContext())
            {
                var purpose = "Жилой дом";
                var buildingsWithoutArea = db.Buildings.Include(b => b.Addresses)
                    .Where(b => b.Addresses.Any() && Math.Abs(b.Square) < 0.1 && b.Purpose.StartsWith(purpose) && b.Levels > 2)
                    .OrderBy(b => b.AreaId);
                var totalBWA = buildingsWithoutArea.Count();
                var currentBWA = 0;
                foreach (var building in buildingsWithoutArea.ToList())
                {
                    currentBWA++;
                    var firstAddr = building.Addresses.First();
                    Clipboard.SetText($"{firstAddr.Street} {firstAddr.Number}");

                    double area;
                    string areaStr;
                    do
                    {
                        Console.Write($"{currentBWA}/{totalBWA}\t{firstAddr.Street}, {firstAddr.Number}. Площадь: ");
                        areaStr = Console.ReadLine();
                    } while (!Double.TryParse(areaStr, out area));

                    building.Square = area;
                    db.SaveChanges();
                }
                Console.WriteLine("Сохраняем в БД...");
            }
        }
Beispiel #6
0
        /// <summary>
        /// Поменять lat и lon у полигонов
        /// </summary>
        private static void SwitchLatLon()
        {
            using (var db = new TransportContext())
            {
                var buildingsWithPolygon = db.Buildings.Where(b => b.Polygon != null);
                var progress = new ProgressBar(buildingsWithPolygon.Count(), "Перерасчет площадей... ");
                var indx = 0;
                foreach (var building in buildingsWithPolygon)
                {
                    // для каждого полигона внутри building.Polygon
                    var polyTexts = building.Polygon.AsText()
                        .Split(new[] { ")), ((", "), (" }, StringSplitOptions.RemoveEmptyEntries);

                    DbGeography polygon = null;
                    foreach (var polyText in polyTexts)
                    {
                        var matches = Regex.Matches(polyText, @"(?:\d*\.)?\d+");
                        polygon = polygon == null
                            ? GeoUtils.CreatePolygon(matches.Cast<Match>().Select(m => m.Value))
                            : polygon.Union(GeoUtils.CreatePolygon(matches.Cast<Match>().Select(m => m.Value)));
                    }

                    building.Polygon = polygon;
                    building.Square = polygon?.Area ?? 0;
                    progress.Report(indx++);
                }
                progress.Pause();
                Console.WriteLine("Сохраняем в БД...");
                db.SaveChanges();
            }
        }
Beispiel #7
0
        static void CopyBusstops()
        {
            using (var dgis = new DGisContext("Томск"))
            {
                using (var transportCtx = new TransportContext())
                {
                    Console.Write("Копирование остановок... ");

                    var dgisBusstops = dgis.Busstops.GetAll();

                    foreach (var dgisBusstop in dgisBusstops)
                    {
                        if (dgisBusstop.Name.Contains("(трамвай)"))
                        {
                            continue;
                        }

                        transportCtx.Busstops.Add(new Busstop
                        {
                            Name     = dgisBusstop.Name,
                            Location = GeoUtils.CreatePoint(dgisBusstop.PosY, dgisBusstop.PosX)
                        });
                    }

                    transportCtx.SaveChanges();

                    Console.WriteLine("завершено");
                }
            }
        }
Beispiel #8
0
 private static void SaveCurrentResults()
 {
     Console.Write("Выполняется сохранение данных:\r\n" +
                   "Словарь соответствий названий улиц... ");
     using (var writer = new StreamWriter(@"correspStreet.txt", true))
     {
         foreach (var correspStr in _correspondenceStreetNames.Skip(_correspStrCount))
         {
             writer.WriteLine($"{correspStr.Key};{correspStr.Value}");
         }
         _correspStrCount = _correspondenceStreetNames.Count;
     }
     Console.Write("Выполнено\r\nСловарь соответствий адресов...");
     using (var writer = new StreamWriter(@"correspAddr.txt", true))
     {
         foreach (var correspAddr in _correspondenceAddresses.Skip(_correspAddrCount))
         {
             writer.WriteLine($"{correspAddr.Key};{correspAddr.Value}");
         }
         _correspAddrCount = _correspondenceAddresses.Count;
     }
     Console.Write("Выполнено\r\nДанные в БД... ");
     _db.SaveChanges();
     Console.Write("Выполнено");
 }
Beispiel #9
0
        /// <summary>
        /// Добавление расстояний между зонами
        /// </summary>
        private static void AddRoutes()
        {
            using (var db = new TransportContext())
            {
                while (true)
                {
                    Console.Write("***Введите идентификатор начальной зоны: ");
                    var input = Console.ReadLine();
                    int originId;
                    if (Int32.TryParse(input, out originId) && originId != 0)
                    {
                        var origin = db.Areas.Find(originId);
                        if (origin == null) continue;
                        Console.WriteLine($"Введите построчно идентификатор зоны и расстояние до нее от {origin.Name} (enter - закончить)");
                        do
                        {
                            input = Console.ReadLine();
                            var destIdDist = input.Split(new[] { ' ', ',', ';' }, StringSplitOptions.RemoveEmptyEntries);
                            if (destIdDist.Length == 2)
                            {
                                int destId;
                                int distance;
                                if (Int32.TryParse(destIdDist[0], out destId)
                                    && Int32.TryParse(destIdDist[1], out distance)
                                    && originId != destId)
                                {
                                    var dest = db.Areas.Find(destId);
                                    var areaRoute = new AreaRoutes
                                    {
                                        OriginId = originId,
                                        DestinationId = destId,
                                        Distance = distance
                                    };
                                    db.AreaRoutes.Add(areaRoute);
                                    try
                                    {
                                        db.SaveChanges();
                                        Console.WriteLine($"Путь от {origin.Name} до {dest.Name} равный {distance} сохранен");
                                    }
                                    catch (DbUpdateException e)
                                    {
                                        db.AreaRoutes.Remove(areaRoute);
                                        Console.WriteLine("Дублирование записи, повторите ввод");
                                    }
                                }
                                else
                                {
                                    Console.WriteLine("Ошибка ввода");
                                }
                            }
                        } while (input != String.Empty);

                    }
                    else break;
                }
            }
        }
Beispiel #10
0
        static void ReturnAddresses()
        {
            using (var db = new TransportContext())
            {
                using (var dgis = new DGisContext("Томск"))
                {
                    var query    = db.Buildings.Include(b => b.Addresses).Where(b => !b.Addresses.Any());
                    var progress = new Common.ProgressBar(query.Count(), "Восстанавливаем адреса... ");
                    var current  = 0;
                    foreach (var buildingNoAddr in query)
                    {
                        progress.Report(current++);
                        DGis.Domain.Entities.Building dgisBuilding;
                        try
                        {
                            dgisBuilding = dgis.Buildings.GetBuilingByCoords(buildingNoAddr.Location.Latitude.Value,
                                                                             buildingNoAddr.Location.Longitude.Value);
                        }
                        catch (InvalidOperationException e)
                        {
                            continue;
                        }

                        if (dgisBuilding == null)
                        {
                            continue;
                        }

                        foreach (var addressesId in dgisBuilding.AddressesIds)
                        {
                            var dgisAddress = dgis.Addresses.GetById(addressesId);
                            buildingNoAddr.Addresses.Add(new Address
                            {
                                Number     = dgisAddress.Number,
                                Street     = dgisAddress.Street,
                                BuildingId = buildingNoAddr.BuildingId
                            });
                        }
                    }

                    progress.Pause();
                }

                Console.WriteLine("\r\nСохраняем в БД");
                db.SaveChanges();
            }
        }
Beispiel #11
0
        private static void CountDepArrPcs()
        {
            Console.WriteLine("Расчет количества людей прибывающих и отправляющихся из зоны");
            using (var db = new TransportContext())
            {
                var sumPeople = db.Areas.Sum(a => a.People);
                var sumOrgs = db.OrgFils.Count();

                foreach (var area in db.Areas.Include(a => a.Buildings.Select(b => b.OrgFils)))
                {
                    area.DeparturePct = (double)area.People / sumPeople;
                    var orgsInArea = area.Buildings.SelectMany(b => b.OrgFils).Count();
                    area.ArrivalPct = (double)orgsInArea / sumOrgs;
                }

                db.SaveChanges();
            }
        }
Beispiel #12
0
        /// <summary>
        /// Заполняем площади киосков средним зачением
        /// </summary>
        private static void SetAvgKioskArea()
        {
            using (var db = new TransportContext())
            {
                var types = new[] { "Киоск" };
                var avgArea = db.Buildings.Where(b => Math.Abs(b.Square) > 0.1 && types.Contains(b.Purpose)).Average(b => b.Square);
                Console.WriteLine($"Выполнить заполнение площадей киосков средней площадью = {avgArea.ToString("F3")}? (Y/N): ");
                var key = Console.ReadKey(true);
                if (key.Key != ConsoleKey.Y) return;

                foreach (var building
                    in db.Buildings.Where(b => Math.Abs(b.Square) < 0.1 && types.Contains(b.Purpose)))
                {
                    building.Square = avgArea;
                }

                db.SaveChanges();
            }
        }
Beispiel #13
0
        /// <summary>
        /// Создаем обратный путь между остановками
        /// </summary>
        private static void AddReturnWay()
        {
            var noroute = new[,]
            {
                { 87, 11}, { 246, 16}, { 195, 21}, { 249, 27}, { 104, 32}, { 212, 60}, { 102, 60}, { 110, 62}, { 204, 87},
                { 258, 87}, { 150, 87}, { 195, 90}, { 27, 104}, { 56, 110}, { 119, 123}, { 262, 119}, { 110, 119}, { 229, 127},
                { 130, 129}, { 129, 144}, { 258, 150}, { 194, 264}, { 123, 195}, { 261, 242}, { 245, 258}, { 260, 253}
            };

            using (var db = new TransportContext())
            {
                foreach (var areaRoute in db.AreaRoutes.ToList())
                {
                    // если обратного пути нет
                    if (!db.AreaRoutes.Any(ar => ar.OriginId == areaRoute.DestinationId
                                                && ar.DestinationId == areaRoute.OriginId))
                    {
                        // если путь в списке к удалению, то пропускаем
                        var skipRoute = false;
                        for (var i = 0; i < noroute.GetLength(0); i++)
                        {
                            if (noroute[i, 0] == areaRoute.OriginId && noroute[i, 1] == areaRoute.DestinationId)
                            {
                                skipRoute = true;
                                break;
                            }
                        }

                        if (skipRoute) continue;

                        // добавляем новый обратный маршрут
                        db.AreaRoutes.Add(new AreaRoutes
                        {
                            OriginId = areaRoute.DestinationId,
                            DestinationId = areaRoute.OriginId,
                            Distance = areaRoute.Distance
                        });
                    }
                }

                db.SaveChanges();
            }
        }
Beispiel #14
0
        static void CopyBuildings()
        {
            using (var dgis = new DGisContext("Томск"))
            {
                using (var transportCtx = new TransportContext())
                {
                    Console.Write("Копирование зданий... ");

                    var dgisBuildings = dgis.Buildings.GetAll();

                    foreach (var dgisBuilding in dgisBuildings)
                    {
                        var building = new Building
                        {
                            Location  = GeoUtils.CreatePoint(dgisBuilding.PosY, dgisBuilding.PosX),
                            Levels    = dgisBuilding.Levels,
                            PostIndex = dgisBuilding.PostIndex,
                            Purpose   = dgisBuilding.Purpose,
                        };

                        foreach (var addressesId in dgisBuilding.AddressesIds)
                        {
                            var dgisAddress = dgis.Addresses.GetById(addressesId);
                            building.Addresses.Add(new Address
                            {
                                Number   = dgisAddress.Number,
                                Street   = dgisAddress.Street,
                                Building = building
                            });
                        }
                        transportCtx.Buildings.Add(building);
                    }

                    transportCtx.SaveChanges();

                    Console.WriteLine("завершено");
                }
            }
        }
        public static void RemoveItemById(TransportType transportType, TransportContext db, int id)
        {
retry:
            try
            {
                if ((transportType == TransportType.car && db.Cars.Count() != 0) || (transportType == TransportType.plane && db.Planes.Count() != 0))
                {
                    switch (transportType)
                    {
                    case TransportType.car:
                        var carForDeletion = db.Cars.Find(id);     // у тебя есть метод GetItemById. зачем он? я думаю, что именно для этого

                        db.Cars.Remove(carForDeletion);

                        break;

                    case TransportType.plane:
                        var planeForDeletion = db.Planes.Find(id);      // у тебя есть метод GetItemById. зачем он? я думаю, что именно для этого

                        db.Planes.Remove(planeForDeletion);

                        break;
                    }
                    db.SaveChanges();
                }
                else
                {
                    Log.ConsoleLog(ConsoleColor.Yellow, $"Sorry, there is no {transportType} in DataBase.");
                }
            }
            catch (Exception exception)
            {
                Log.WriteDataToFile(@"..\..\Log.txt", exception.ToString());
                Log.ConsoleLog(ConsoleColor.Green, exception.ToString());
                goto retry;
            }
        }
Beispiel #16
0
        /// <summary>
        /// Группировка зданий по зонам
        /// </summary>
        private static void GroupBuildingToAreas()
        {
            using (var db = new TransportContext())
            {
                // ищем ближайшие зоны для каждого здания
                var sw = Stopwatch.StartNew();
                var buildings = db.Buildings.Where(b => b.AreaId == null);
                var pb = new ProgressBar(buildings.Count() - 1, "Группировка зданий по зонам... ");
                var p = 0;
                foreach (var building in buildings)
                {
                    var minDistance = double.MaxValue;
                    long minAreaId = 0;

                    sw = Stopwatch.StartNew();
                    foreach (var area in db.Areas)
                    {
                        var curDistance = area.Location.Distance(building.Location) ?? 0;
                        if (curDistance < minDistance)
                        {
                            minAreaId = area.AreaId;
                            minDistance = curDistance;
                        }
                    }

                    if (minAreaId != 0)
                    {
                        building.AreaId = minAreaId;
                    }

                    pb.Report(++p);
                }
                pb.Pause();
                db.SaveChanges();
                Console.WriteLine(Environment.NewLine + $"Группировка зданий заняла {sw.Elapsed.TotalSeconds} сек.");
            }
        }
Beispiel #17
0
        /// <summary>
        /// Ручное объединение двух остановок
        /// </summary>
        private static void UniteBusstops()
        {
            using (var db = new TransportContext())
            {
                int id1, id2;
                Console.Write(Environment.NewLine + "Введите Id зон для объединения: ");
                var input = Console.ReadLine();
                var idsArr = input?.Split(new[] { ' ', ',', ';' }, StringSplitOptions.RemoveEmptyEntries);
                if (idsArr != null && idsArr.Length == 2
                    && Int32.TryParse(idsArr[0], out id1)
                    && Int32.TryParse(idsArr[1], out id2))
                {
                    var area1 = db.Areas.Include(a => a.Busstops).FirstOrDefault(a => a.AreaId == id1);
                    var area2 = db.Areas.Include(a => a.Busstops).FirstOrDefault(a => a.AreaId == id2);
                    if (area1 == null || area2 == null) return;

                    var newAreaBs = area1.Busstops.ToList();
                    newAreaBs.AddRange(area2.Busstops);
                    Console.WriteLine("Создать новую зону со списком остановок:");
                    newAreaBs.ForEach(b => Console.WriteLine($"{b.BusstopId}. {b.Name}"));
                    Console.Write("Y/N: ");

                    if (Console.ReadKey().Key == ConsoleKey.Y)
                    {
                        var uniteArea = area1;
                        uniteArea.Name = GetAreaName(newAreaBs);
                        // добавление остановок
                        newAreaBs.ForEach(b => uniteArea.Busstops.Add(b));
                        // расчет центра
                        uniteArea.Location = CalculateAreaCentre(newAreaBs);
                        db.Areas.Remove(area2);
                        db.SaveChanges();
                    }
                }
            }
        }
Beispiel #18
0
        private static void DeleteReturnWay()
        {
            var noroute = new[,]
            {
                { 87, 11}, { 246, 16}, { 195, 21}, { 249, 27}, { 104, 32}, { 212, 60}, { 102, 60}, { 110, 62}, { 204, 87},
                { 258, 87}, { 150, 87}, { 195, 90}, { 27, 104}, { 56, 110}, { 119, 123}, { 262, 119}, { 110, 119}, { 229, 127},
                { 130, 129}, { 129, 144}, { 258, 150}, { 194, 264}, { 123, 195}, { 261, 242}, { 245, 258}, { 260, 253}
            };

            using (var db = new TransportContext())
            {
                for (var i = 0; i < noroute.GetLength(0); i++)
                {
                    var origin = noroute[i, 0];
                    var dest = noroute[i, 1];
                    var route = db.AreaRoutes.FirstOrDefault(ar => ar.OriginId == origin && ar.DestinationId == dest);
                    if (route == null) continue;

                    db.AreaRoutes.Remove(route);
                }

                db.SaveChanges();
            }
        }
        public static void CommandHandler(TransportType transportType, int choice, TransportContext db)
        {
            switch (choice)
            {
            case 1:
                var id = Misc.GetId(transportType, db);
                RemoveItemById(transportType, db, id);
                break;

            case 2:
                AddNewDefaultItem(transportType, db);
                break;

            case 3:
                AddNewCustomItem(transportType, db);
                break;

            case 4:
                id = Misc.GetId(transportType, db);
                GetItemById(transportType, db, id);
                break;
            }
            db.SaveChanges();
        }
Beispiel #20
0
 /// <summary>
 /// Удаление остановок по идентификаторам
 /// </summary>
 private static void DeleteBusStopsById()
 {
     Console.WriteLine("Удаление остановок по идентификаторам");
     using (var db = new TransportContext())
     {
         int idForDel;
         do
         {
             Console.Write(Environment.NewLine + "Введите Id остановки для удаления: ");
             var input = Console.ReadLine();
             if (Int32.TryParse(input, out idForDel) && idForDel != 0)
             {
                 var bs = db.Busstops.Find(idForDel);
                 if (bs == null) continue;
                 Console.Write($"Удалить остановку: \"{bs.BusstopId}. {bs.Name}\" (Y/N)? ");
                 if (Console.ReadKey().Key == ConsoleKey.Y)
                 {
                     db.Busstops.Remove(bs);
                     db.SaveChanges();
                 }
             }
         } while (idForDel != 0);
     }
 }
 public void CreateAllocation(RequestAllocation requestAllocStr)
 {
     _context.RequestAllocation.Add(requestAllocStr);
     _context.SaveChanges();
 }
Beispiel #22
0
        static void CopyOrgs()
        {
            using (var dgis = new DGisContext("Томск"))
            {
                using (var transportCtx = new TransportContext())
                {
                    Console.Write("Копирование категорий предприятий... ");

                    var dgisOrgRubs1 = dgis.OrgRubs1.GetAll();
                    var orgRubs      = new List <OrgRub>();
                    foreach (var orgRub1 in dgisOrgRubs1)
                    {
                        orgRubs.Add(new OrgRub
                        {
                            Name         = orgRub1.Name,
                            ParentOrgRub = null
                        });
                    }

                    var dgisOrgRubs2 = dgis.OrgRubs2.GetAll();
                    foreach (var orgRub2 in dgisOrgRubs2)
                    {
                        if (orgRubs.Any(rub => rub.Name == orgRub2.Name))
                        {
                            continue;
                        }

                        var parentRubName = dgis.OrgRubs1.GetById(orgRub2.OrgRub1Id).Name;

                        orgRubs.Add(new OrgRub
                        {
                            Name         = orgRub2.Name,
                            ParentOrgRub = orgRubs.FirstOrDefault(rub => rub.Name == parentRubName)
                        });
                    }

                    var dgisOrgRubs3 = dgis.OrgRubs3.GetAll();
                    foreach (var orgRub3 in dgisOrgRubs3)
                    {
                        if (orgRubs.Any(rub => rub.Name == orgRub3.Name))
                        {
                            continue;
                        }

                        var parentRubName = dgis.OrgRubs2.GetById(orgRub3.OrgRub2Id).Name;

                        orgRubs.Add(new OrgRub
                        {
                            Name         = orgRub3.Name,
                            ParentOrgRub = orgRubs.FirstOrDefault(rub => rub.Name == parentRubName)
                        });
                    }

                    transportCtx.OrgRubs.AddRange(orgRubs);
                    transportCtx.SaveChanges();
                    Console.WriteLine("завершено");

                    Console.Write("Копирование предприятий... ");

                    var dgisOrgs = dgis.Orgs.GetAll();
                    foreach (var dgisOrg in dgisOrgs)
                    {
                        var org = new Org
                        {
                            Name = dgisOrg.Name,
                        };

                        foreach (var orgRubs3Id in dgisOrg.OrgRubs3Ids)
                        {
                            var dgisOrgRub3 = dgis.OrgRubs3.GetById(orgRubs3Id);
                            var orgRub      = transportCtx.OrgRubs.FirstOrDefault(rub => rub.Name == dgisOrgRub3.Name);
                            if (orgRub == null)
                            {
                                continue;
                            }
                            org.OrgRubs.Add(orgRub);
                        }

                        foreach (var dgisOrgFil in dgisOrg.OrgFils)
                        {
                            var orgFil = new OrgFil
                            {
                                Org = org
                            };

                            foreach (var addressesId in dgisOrgFil.AddressesIds)
                            {
                                var dgisAddress = dgis.Addresses.GetById(addressesId);
                                if (dgisAddress.BuildingId == null)
                                {
                                    continue;
                                }

                                var address =
                                    transportCtx.Addresses.FirstOrDefault(addr => addr.Number == dgisAddress.Number &&
                                                                          addr.Street == dgisAddress.Street);
                                if (address == null)
                                {
                                    continue;
                                }
                                orgFil.BuildingId = address.BuildingId;
                                break;
                            }

                            if (orgFil.BuildingId == 0)
                            {
                                continue;
                            }

                            org.OrgFils.Add(orgFil);
                        }

                        transportCtx.Orgs.Add(org);
                    }

                    transportCtx.SaveChanges();
                    Console.WriteLine("завершено");
                }
            }
        }
Beispiel #23
0
        /// <summary>
        /// Автоматическое объединение остановок
        /// </summary>
        private static void AggregateBusstops()
        {
            using (var db = new TransportContext())
            {
                Console.Write("Очистка зон.. ");
                foreach (var busstop in db.Busstops)
                {
                    busstop.AreaId = null;
                }

                foreach (var building in db.Buildings)
                {
                    building.AreaId = null;
                }

                db.Areas.RemoveRange(db.Areas);
                db.SaveChanges();
                Console.WriteLine("завершено");

                Console.Write("Группировка остановок в остановочные пункты... ");
                // Этап 1. Группируем остановки с одинаковыми названиями
                var busstopGroups = db.Busstops.GroupBy(busstop => busstop.Name);
                var areas = new List<Area>();

                foreach (var group in busstopGroups)
                {
                    var area = new Area();
                    area.Name = @group.Key;
                    @group.ToList().ForEach(busstop => area.Busstops.Add(busstop));
                    area.Location = CalculateAreaCentre(area.Busstops.ToList());
                    areas.Add(area);
                }

                // Этап 2. Объединяем остановочные пункты, которые находятся близко друг к другу
                const double maxDistance = 250.0;
                var delAreas = new List<Area>();

                foreach (var area in areas)
                {
                    if (delAreas.Contains(area)) continue;

                    var nearestAreas = areas.Where(bs => area != bs && !delAreas.Contains(bs) &&
                                                                     area.Location.Distance(bs.Location) < maxDistance).ToList();

                    foreach (var nearestArea in nearestAreas)
                    {
                        area.Name += $"/{nearestArea.Name}";
                        nearestArea.Busstops.ToList().ForEach(busstop => area.Busstops.Add(busstop));
                        area.Location = CalculateAreaCentre(area.Busstops.ToList());
                    }

                    delAreas.AddRange(nearestAreas);
                }

                delAreas.ForEach(busstation => areas.Remove(busstation));

                var i = 1;
                foreach (var area in areas)
                {
                    area.AreaId = i++;
                }

                db.Areas.AddRange(areas);
                db.SaveChanges();
            }

            Console.WriteLine("завершено");
            Console.ReadKey();
        }
Beispiel #24
0
        /// <summary>
        /// Ручное разделение остановок на две
        /// </summary>
        private static void DivideBusstop()
        {
            using (var db = new TransportContext())
            {
                int idForDiv;
                Console.Write(Environment.NewLine + "Введите Id зоны для разделения: ");
                var input = Console.ReadLine();
                if (Int32.TryParse(input, out idForDiv) && idForDiv != 0)
                {
                    var area = db.Areas.Include(a => a.Busstops).FirstOrDefault(a => a.AreaId == idForDiv);
                    if (area == null) return;

                    foreach (var busstop in area.Busstops)
                    {
                        Console.WriteLine($"{busstop.BusstopId}. {busstop.Name}");
                    }

                    Console.WriteLine("Введите идентификаторы остановок для новой зоны: ");
                    input = Console.ReadLine();
                    var bsIds = input.Split(new[] { ' ', ',', ';' }, StringSplitOptions.RemoveEmptyEntries);

                    var newAreaBs = new List<Busstop>();
                    foreach (var bsId in bsIds)
                    {
                        int id;
                        if (!Int32.TryParse(bsId, out id)) continue;
                        var bs = area.Busstops.FirstOrDefault(b => b.BusstopId == id);
                        if (bs == null) continue;
                        newAreaBs.Add(bs);
                    }

                    Console.WriteLine("Создать новую зону со списком остановок:");
                    newAreaBs.ForEach(b => Console.WriteLine($"{b.BusstopId}. {b.Name}"));
                    Console.Write("Y/N: ");

                    if (Console.ReadKey().Key == ConsoleKey.Y)
                    {
                        // создание новой зоны
                        var newArea = new Area
                        {
                            AreaId = db.Areas.Max(a => a.AreaId) + 1,
                            Name = GetAreaName(newAreaBs)
                        };
                        // добавление/исключение остановок
                        newAreaBs.ForEach(b =>
                        {
                            newArea.Busstops.Add(b);
                            area.Busstops.Remove(b);
                        });
                        // расчет центра
                        newArea.Location = CalculateAreaCentre(newAreaBs);

                        // обработка предыдущей зоны
                        // изменение имени
                        area.Name = GetAreaName(area.Busstops.ToList());
                        // пересчет центра
                        area.Location = CalculateAreaCentre(area.Busstops.ToList());
                        db.Areas.Add(newArea);
                        db.SaveChanges();
                    }
                }
            }
        }
Beispiel #25
0
 public void CreateRequest(TRequest requestStr)
 {
     _context.TRequest.Add(requestStr);
     _context.SaveChanges();
 }