예제 #1
0
        private List <DailyForecastModel> FiveDayForecast(DailyForecast fiveDaysForecast)
        {
            List <DailyForecastModel> list = new List <DailyForecastModel>();

            for (int i = 1; i < 5; i++)
            {
                DailyForecastModel dailyForecast = new DailyForecastModel();

                dailyForecast.Id = i;
                if (i == 1)
                {
                    dailyForecast.Date = string.Format("Tomorrow, {0} {1}",
                                                       fiveDaysForecast.DailyForecasts[i].Date.Date.Day,
                                                       CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(fiveDaysForecast.DailyForecasts[i].Date.Date.Month));
                }
                else
                {
                    dailyForecast.Date = string.Format("{0}, {1} {2}",
                                                       fiveDaysForecast.DailyForecasts[i].Date.Date.DayOfWeek,
                                                       fiveDaysForecast.DailyForecasts[i].Date.Date.Day,
                                                       CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(fiveDaysForecast.DailyForecasts[i].Date.Date.Month));
                }

                dailyForecast.ImageResource = ImageHelper.ImagePicker(fiveDaysForecast.DailyForecasts[i].Day.LongPhrase);
                dailyForecast.DegreesMin    = "/" + Math.Ceiling(fiveDaysForecast.DailyForecasts[i].Temperature.Minimum.Value) + "\u00B0";
                dailyForecast.Degrees       = Math.Ceiling(fiveDaysForecast.DailyForecasts[i].Temperature.Maximum.Value) + "\u00B0";

                list.Add(dailyForecast);
            }
            ;

            return(list);
        }
예제 #2
0
        /// <summary>
        /// Converts entities: OpenWeatherForecast to ForecastModel
        /// </summary>
        /// <param name="externalApiForecast"></param>
        /// <returns cref="ForecastModel"></returns>
        public ForecastModel Convert(OpenWeatherForecast externalApiForecast)
        {
            try
            {
                if (externalApiForecast == null ||
                    externalApiForecast.List == null ||
                    externalApiForecast.City == null)
                {
                    throw new ArgumentNullException("Invalid input parameter.");
                }

                ForecastModel forecast = new ForecastModel
                {
                    City = externalApiForecast.City.Name
                };

                List <OpenWeather> weatherList = externalApiForecast.List.ToList <OpenWeather>();

                if (weatherList.Count() == 0)
                {
                    throw new Exception("External api forecast is empty.");
                }

                string temperatureFormat = WeatherUnitsFormatsConverter.GetTemperatureFormat(_wfProviderSettings.UnitsFormat);
                string nigthIconKey      = _wfProviderSettings.NigthIconKey;
                string dayIconKey        = _wfProviderSettings.DayIconKey;

                DateTime currentDay = weatherList[0].Dt.ToDateTime();
                DateTime nextDay    = currentDay;
                List <DetailedDailyForecastModel> detailedDailyForecasts = new List <DetailedDailyForecastModel>();

                //contains icons' names to define most often in a day to set AvgWeatherConditions.IconUrl
                //contains weather states to define most often in a day to set AvgWeatherConditions.WeatherDescription
                List <WeatherDetails> weatherDetailsForAvg = new List <WeatherDetails>();

                bool isLastDay = false;

                for (int i = 0; i < weatherList.Count(); i++)
                {
                    var item = weatherList[i];

                    var weatherDetails = item.Weather.FirstOrDefault();
                    weatherDetailsForAvg.Add(weatherDetails);

                    detailedDailyForecasts.Add(new DetailedDailyForecastModel
                    {
                        Time = nextDay.ToWeatherTimeFormat(item.Timezone),
                        WeatherConditions = new WeatherConditionsModel
                        {
                            IconUrl            = IconConverter.Generate(_wfProviderSettings.IconStorageAddress, weatherDetails.Icon),
                            Humidity           = item.Main.Humidity,
                            Pressure           = item.Main.Pressure,
                            Temperature        = (int)Math.Round(item.Main.Temp),
                            WindSpeed          = Math.Round(item.Wind.Speed, 1),
                            TemperatureFormat  = temperatureFormat,
                            WeatherDescription = weatherDetails.Description
                        }
                    });

                    if (i + 1 < weatherList.Count())
                    {
                        nextDay = weatherList[i + 1].Dt.ToDateTime();
                    }
                    else
                    {
                        isLastDay = true;
                    }

                    if (currentDay.Date != nextDay.Date || isLastDay)
                    {
                        //for all days avg weather icon is the most often icon during the day
                        var mostOftenWeatherDescription = weatherDetailsForAvg.GroupBy(i => i.Main)
                                                          .OrderByDescending(i => i.Count())
                                                          .First();
                        var mostOftenIcon = mostOftenWeatherDescription
                                            .GroupBy(i => IconConverter.CutDNSymbol(i.Icon, dayIconKey, nigthIconKey))
                                            .OrderByDescending(i => i.Count())
                                            .First();

                        //generate full icon url with daytime symbol as most common icon
                        string avgIconUrl = IconConverter.Generate(
                            _wfProviderSettings.IconStorageAddress,
                            mostOftenIcon.Key,
                            dayIconKey
                            );

                        var dailyForecast = new DailyForecastModel
                        {
                            Date = currentDay.ToWeatherDateFormat(item.Timezone),
                            DetailedDailyForecasts = detailedDailyForecasts,
                            AvgWeatherConditions   = new WeatherConditionsModel
                            {
                                Humidity           = (int)CalculateAverage(detailedDailyForecasts, i => i.WeatherConditions.Humidity, 0),
                                Pressure           = (int)CalculateAverage(detailedDailyForecasts, i => i.WeatherConditions.Pressure, 0),
                                Temperature        = (int)CalculateAverage(detailedDailyForecasts, i => i.WeatherConditions.Temperature, 0),
                                WindSpeed          = CalculateAverage(detailedDailyForecasts, i => i.WeatherConditions.WindSpeed, 1),
                                IconUrl            = avgIconUrl,
                                WeatherDescription = mostOftenWeatherDescription.Key, //set most common weather state as average weather
                                TemperatureFormat  = temperatureFormat
                            }
                        };

                        //save day's forecast
                        forecast.DailyForecasts.Add(dailyForecast);

                        //clear objects for next day forecast
                        detailedDailyForecasts = new List <DetailedDailyForecastModel>();
                        weatherDetailsForAvg   = new List <WeatherDetails>();

                        //move to next day
                        currentDay = nextDay;
                    }
                }

                return(forecast);
            }
            catch (Exception ex)
            {
                string errorMessage = "Something went wrond during convertion from OpenWeatherForecast to ForecastModel.";
                _logger.LogError(errorMessage, ex);
                throw new Exception(errorMessage, ex);
            }
        }