void LoadDistrictsGeometry() { logger.Info("Загружаем районы..."); districtsOverlay.Clear(); ViewModel.LogisticanDistricts = ScheduleRestrictionRepository.GetDistrictsWithBorder(ViewModel.UoW); foreach (var district in ViewModel.LogisticanDistricts) { var poligon = new GMapPolygon( district.DistrictBorder.Coordinates.Select(p => new PointLatLng(p.X, p.Y)).ToList(), district.DistrictName ); districtsOverlay.Polygons.Add(poligon); } logger.Info("Ок."); }
public static DeliveryPriceNode Calculate(decimal?latitude, decimal?longitude, int?bottlesCount) { IList <District> districts; DeliveryPriceNode result = new DeliveryPriceNode(); //Топливо using (var uow = UnitOfWorkFactory.CreateWithoutRoot("Расчет стоимости доставки")) { var fuel = FuelRepository.GetDefaultFuel(uow); if (fuel == null) { result.ErrorMessage = string.Format("Топливо по умолчанию «АИ-92» не найдено в справочке."); return(result); } fuelCost = (double)fuel.Cost; //Районы districts = ScheduleRestrictionRepository.GetDistrictsWithBorder(uow); result.WageDistrict = deliveryPoint?.District?.WageDistrict?.Name ?? "Неизвестно"; //Координаты if (!latitude.HasValue || !longitude.HasValue) { result.ErrorMessage = string.Format("Не указаны координаты. Невозможно расчитать расстояние."); return(result); } //Расчет растояния if (deliveryPoint == null) { var gg = GeographicGroupRepository.GeographicGroupByCoordinates((double)latitude.Value, (double)longitude.Value, districts); var route = new List <PointOnEarth>(2); if (gg != null && gg.BaseCoordinatesExist) { route.Add(new PointOnEarth((double)gg.BaseLatitude, (double)gg.BaseLongitude)); } else if (gg == null) { //если не найдена часть города, то расстояние считается до его центра route.Add(new PointOnEarth(Constants.CenterOfCityLatitude, Constants.CenterOfCityLongitude)); } else { result.ErrorMessage = "В подобранной части города не указаны координаты базы"; return(result); } route.Add(new PointOnEarth(latitude.Value, longitude.Value)); var osrmResult = OsrmMain.GetRoute(route, false, GeometryOverview.False); if (osrmResult == null) { result.ErrorMessage = "Ошибка на сервере расчета расстояний, невозможно расчитать расстояние."; return(result); } if (osrmResult.Code != "Ok") { result.ErrorMessage = $"Сервер расчета расстояний вернул следующее сообщение: {osrmResult.StatusMessageRus}"; return(result); } distance = osrmResult.Routes[0].TotalDistance / 1000d; } else { distance = (deliveryPoint.DistanceFromBaseMeters ?? 0) / 1000d; } result.Distance = distance.ToString("N1") + " км"; result.Prices = Enumerable.Range(1, 100) .Select( x => new DeliveryPriceRow { Amount = x, Price = PriceByDistance(x).ToString("C2") } ).ToList(); //Расчет цены var point = new Point((double)latitude, (double)longitude); var district = districts.FirstOrDefault(x => x.DistrictBorder.Contains(point)); result.DistrictName = district?.DistrictName ?? string.Empty; result.GeographicGroups = district?.GeographicGroup != null ? district.GeographicGroup.Name : "Неизвестно"; result.ByDistance = district == null || district.PriceType == DistrictWaterPrice.ByDistance; result.WithPrice = (district != null && district.PriceType != DistrictWaterPrice.ByDistance) || (result.ByDistance && bottlesCount.HasValue); if (result.ByDistance) { if (bottlesCount.HasValue) { result.Price = PriceByDistance(bottlesCount.Value).ToString("C2"); } } else if (district?.PriceType == DistrictWaterPrice.FixForDistrict) { result.Price = district.WaterPrice.ToString("C2"); } else if (district?.PriceType == DistrictWaterPrice.Standart) { result.Price = "прайс"; } result.MinBottles = district?.MinBottles.ToString(); result.Schedule = district != null && district.HaveRestrictions ? string.Join(", ", district.GetSchedulesString(true)) : "любой день"; } return(result); }