def forecast_at_coords(self, lat, lon, interval, limit=None): """ Queries the OWM Weather API for weather forecast for the specified geographic coordinates with the given time granularity. A *Forecaster* object is returned, containing a *Forecast*: this instance encapsulates *Weather* objects corresponding to the provided granularity. :param lat: location's latitude, must be between -90.0 and 90.0 :type lat: int/float :param lon: location's longitude, must be between -180.0 and 180.0 :type lon: int/float :param interval: the granularity of the forecast, among `3h` and 'daily' :type interval: str among `3h` and 'daily' :param limit: the maximum number of *Weather* items to be retrieved (default is ``None``, which stands for any number of items) :type limit: int or ``None`` :returns: a *Forecaster* instance or ``None`` if forecast data is not available for the specified location :raises: *ParseResponseException* when OWM Weather API responses' data cannot be parsed, *APICallException* when OWM Weather API can not be reached """ geo.assert_is_lon(lon) geo.assert_is_lat(lat) assert isinstance(interval, str), "Interval must be a string" if limit is not None: assert isinstance(limit, int), "'limit' must be an int or None" if limit < 1: raise ValueError("'limit' must be None or greater than zero") params = {'lon': lon, 'lat': lat} if limit is not None: params['cnt'] = limit if interval == '3h': uri = THREE_HOURS_FORECAST_URI elif interval == 'daily': uri = DAILY_FORECAST_URI else: raise ValueError("Unsupported time interval for forecast") _, json_data = self.http_client.get_json(uri, params=params) fc = forecast.Forecast.from_dict(json_data) if fc is not None: fc.interval = interval return forecaster.Forecaster(fc) else: return None
def forecast_at_id(self, id, interval, limit=None): """ Queries the OWM Weather API for weather forecast for the specified city ID (eg: 5128581) with the given time granularity. A *Forecaster* object is returned, containing a *Forecast*: this instance encapsulates *Weather* objects corresponding to the provided granularity. :param id: the location's city ID :type id: int :param interval: the granularity of the forecast, among `3h` and 'daily' :type interval: str among `3h` and 'daily' :param limit: the maximum number of *Weather* items to be retrieved (default is ``None``, which stands for any number of items) :type limit: int or ``None`` :returns: a *Forecaster* instance or ``None`` if forecast data is not available for the specified location :raises: *ParseResponseException* when OWM Weather API responses' data cannot be parsed, *APICallException* when OWM Weather API can not be reached """ assert type(id) is int, "'id' must be an int" if id < 0: raise ValueError("'id' value must be greater than 0") assert isinstance(interval, str), "Interval must be a string" if limit is not None: assert isinstance(limit, int), "'limit' must be an int or None" if limit < 1: raise ValueError("'limit' must be None or greater than zero") params = {'id': id} if limit is not None: params['cnt'] = limit if interval == '3h': uri = THREE_HOURS_FORECAST_URI elif interval == 'daily': uri = DAILY_FORECAST_URI else: raise ValueError("Unsupported time interval for forecast") _, json_data = self.http_client.get_json(uri, params=params) fc = forecast.Forecast.from_dict(json_data) if fc is not None: fc.interval = interval return forecaster.Forecaster(fc) else: return None