/// <inheritdoc />
        public async Task <ProviderWeatherForecastModel> GetWeatherForecastAsync(double latitude, double longitude,
                                                                                 UnitsSystem units = UnitsSystem.Imperial, Language language = Language.English)
        {
            string unitsSystem   = GetUnitsSystem(units);
            string languageValue = GetLanguage(language);

            string uri = $"{ServiceUri}/forecast/{SecretKey}/{latitude},{longitude}?" +
                         $"exclude=minutely,hourly,daily,alerts,flags&units={unitsSystem}&lang={languageValue}";

            var data = await GetResponseAsync <DarkSkyResponse>(uri).ConfigureAwait(false);

            return(new ProviderWeatherForecastModel
            {
                Coordinates = new Coordinates
                {
                    Latitude = data.latitude,
                    Longitude = data.longitude
                },
                Temperature = data.currently.temperature,
                TemperatureMin = null,
                TemperatureMax = null,
                Humidity = data.currently.humidity,
                Pressure = data.currently.pressure,
                WindSpeed = data.currently.windSpeed,
                Summary = data.currently.summary,
                Language = language,
                Units = units,
                Provider = ServiceName
            });
        }
コード例 #2
0
        /// <inheritdoc />
        public async Task <ProviderWeatherForecastModel> GetWeatherForecastAsync(double latitude, double longitude,
                                                                                 UnitsSystem units = UnitsSystem.Imperial, Language language = Language.English)
        {
            string unitsSystem   = GetUnitsSystem(units);
            string languageValue = GetLanguage(language);

            string uri = $"{ServiceUri}/data/2.5/weather?appid={SecretKey}&lat={latitude}&lon={longitude}&" +
                         $"units={unitsSystem}&lang={languageValue}";

            var data = await GetResponseAsync <OpenWeatherMapResponse>(uri).ConfigureAwait(false);

            return(new ProviderWeatherForecastModel
            {
                Coordinates = new Coordinates
                {
                    Latitude = data.coord.lat,
                    Longitude = data.coord.lon
                },
                Temperature = data.main.temp,
                TemperatureMin = data.main.temp_min,
                TemperatureMax = data.main.temp_max,
                Humidity = data.main.humidity,
                Pressure = data.main.pressure,
                WindSpeed = data.wind.speed,
                Summary = data.weather.FirstOrDefault().description,
                Language = language,
                Units = units,
                Provider = ServiceName
            });
        }
コード例 #3
0
        protected string GetUnitsSystem(UnitsSystem units)
        {
            if (!UnitsSystemMappings.TryGetValue(units, out string temperatureScaleValue))
            {
                throw new MappingNotFoundException($"Units system is not found for {units}. Service: {ServiceUri}.");
            }

            return(temperatureScaleValue);
        }
コード例 #4
0
        /// <inheritdoc />
        public async Task <ServiceWeatherForecastModel> GetWeatherForecastAsync(double latitude, double longitude,
                                                                                UnitsSystem units = UnitsSystem.Imperial, Language language = Language.English)
        {
            _logger.LogInfo($"{nameof(GetWeatherForecastAsync)} was called with the following parameters: " +
                            $"latitude={latitude}, longitude={longitude}, units={units}, language={language}");

            var providerWeatherForecasts = new List <ProviderWeatherForecastModel>();
            var avarageValues            = new ProviderWeatherForecastModel();

            foreach (var provider in _providers)
            {
                try
                {
                    var providerWeatherForecast =
                        await provider.GetWeatherForecastAsync(latitude, longitude, units, language);

                    providerWeatherForecasts.Add(providerWeatherForecast);
                }
                catch (ResponseRetrievalException ex)
                {
                    _logger.LogError($"Name: {provider.ServiceName}. Uri: {provider.ServiceUri}", ex);
                }
                catch (Exception ex)
                {
                    _logger.LogError($"Weather forecast was not extracted for {provider.ServiceName}.", ex);
                    throw;
                }
            }

            avarageValues.Temperature    = providerWeatherForecasts.Average(p => p.Temperature);
            avarageValues.TemperatureMin = providerWeatherForecasts.Where(p => p.TemperatureMin.HasValue)
                                           .Average(p => p.TemperatureMin);
            avarageValues.TemperatureMax = providerWeatherForecasts.Where(p => p.TemperatureMax.HasValue)
                                           .Average(p => p.TemperatureMax);
            avarageValues.Humidity  = providerWeatherForecasts.Average(p => p.Humidity);
            avarageValues.WindSpeed = providerWeatherForecasts.Average(p => p.WindSpeed);
            avarageValues.Pressure  = providerWeatherForecasts.Average(p => p.Pressure);

            return(new ServiceWeatherForecastModel
            {
                Providers = providerWeatherForecasts,
                AvarageValues = avarageValues
            });
        }
コード例 #5
0
        public async Task <IActionResult> GetWeatherForecast(double?latitude, double?longitude,
                                                             UnitsSystem units = UnitsSystem.Imperial, Language language = Language.English)
        {
            _logger.LogInformation($"Request for weather forecast. Latitude={latitude}, longitude={longitude}, units={units}, language={language}");

            if (!latitude.HasValue)
            {
                return(BadRequest("Latitude is not specified."));
            }

            if (!longitude.HasValue)
            {
                return(BadRequest("Longitude is not specified."));
            }

            var weatherForecast = await _weatherForecastService.GetWeatherForecastAsync(
                latitude.Value, longitude.Value, units, language);

            _logger.LogInformation($"Weather forecast: {JsonConvert.SerializeObject(weatherForecast)}");

            return(Json(_mapper.Map <WeatherForecastModel>(weatherForecast)));
        }