def explorer(listen: str, reload: bool, debug: bool): set_logging_level(debug) log.info(f"Starting {appname}") log.info(f"Starting Explorer web service on http://{listen}") from wetterdienst.ui.explorer.app import start_service start_service(listen, reload=reload) return
def restapi(listen: str, reload: bool, debug: bool): set_logging_level(debug) # Run HTTP service. log.info(f"Starting {appname}") log.info(f"Starting HTTP web service on http://{listen}") from wetterdienst.ui.restapi import start_service start_service(listen, reload=reload) return
def coverage(provider, network, filter_, debug): set_logging_level(debug) if not provider or not network: print(json.dumps(Wetterdienst.discover(), indent=4)) # noqa: T001 return api = get_api(provider=provider, network=network) cov = api.discover( filter_=filter_, flatten=False, ) print(json.dumps(cov, indent=4)) # noqa: T001 return
def coverage( provider: str = Query(default=None), network: str = Query(default=None), debug: bool = Query(default=False), filter_=Query(alias="filter", default=None), ): set_logging_level(debug) if not provider or not network: cov = Wetterdienst.discover() return Response(content=json.dumps(cov, indent=4), media_type="application/json") api = get_api(provider=provider, network=network) cov = api.discover( filter_=filter_, flatten=False, ) return Response(content=json.dumps(cov, indent=4), media_type="application/json")
def values( provider: str = Query(default=None), network: str = Query(default=None), parameter: str = Query(default=None), resolution: str = Query(default=None), period: str = Query(default=None), date: str = Query(default=None), issue: str = Query(default="latest"), all_: str = Query(alias="all", default=False), station: str = Query(default=None), name: str = Query(default=None), coordinates: str = Query(default=None), rank: int = Query(default=None), distance: float = Query(default=None), bbox: str = Query(default=None), sql: str = Query(default=None), sql_values: str = Query(alias="sql-values", default=None), humanize: bool = Query(default=True), tidy: bool = Query(default=True), si_units: bool = Query(alias="si-units", default=True), skip_empty: bool = Query(alias="skip-empty", default=False), skip_threshold: float = Query( alias="skip-threshold", default=0.95, gt=0, le=1), dropna: bool = Query(alias="dropna", default=False), pretty: bool = Query(default=False), debug: bool = Query(default=False), ): """ Acquire data from DWD. :param provider: :param network: string for network of provider :param parameter: Observation measure :param resolution: Frequency/granularity of measurement interval :param period: Recent or historical files :param date: Date or date range :param issue: :param all_: :param station: :param name: :param coordinates: :param rank: :param distance: :param bbox: :param sql: SQL expression :param sql_values: :param fmt: :param humanize: :param tidy: Whether to return data in tidy format. Default: True. :param si_units: :param pretty: :param debug: :return: """ # TODO: Add geojson support fmt = "json" if provider is None or network is None: raise HTTPException( status_code=400, detail="Query arguments 'provider' and 'network' are required", ) if parameter is None or resolution is None: raise HTTPException( status_code=400, detail="Query arguments 'parameter', 'resolution' " "and 'date' are required", ) if fmt not in ("json", "geojson"): raise HTTPException( status_code=400, detail="format argument must be one of json, geojson", ) set_logging_level(debug) try: api: ScalarRequestCore = Wetterdienst(provider, network) except ProviderError: return HTTPException( status_code=404, detail=f"Given combination of provider and network not available. " f"Choose provider and network from {Wetterdienst.discover()}", ) parameter = read_list(parameter) if period: period = read_list(period) if station: station = read_list(station) try: values_ = get_values( api=api, parameter=parameter, resolution=resolution, date=date, issue=issue, period=period, all_=all_, station_id=station, name=name, coordinates=coordinates, rank=rank, distance=distance, bbox=bbox, sql=sql, sql_values=sql_values, si_units=si_units, skip_empty=skip_empty, skip_threshold=skip_threshold, dropna=dropna, tidy=tidy, humanize=humanize, ) except Exception as e: log.exception(e) return HTTPException(status_code=404, detail=str(e)) indent = None if pretty: indent = 4 output = values_.df output[Columns.DATE.value] = output[Columns.DATE.value].apply( lambda ts: ts.isoformat()) output = output.replace({np.NaN: None, pd.NA: None}) output = output.to_dict(orient="records") output = make_json_response(output, api.provider) output = json.dumps(output, indent=indent, ensure_ascii=False) return Response(content=output, media_type="application/json")
def stations( provider: str = Query(default=None), network: str = Query(default=None), parameter: str = Query(default=None), resolution: str = Query(default=None), period: str = Query(default=None), all_: str = Query(alias="all", default=False), station_id: str = Query(default=None), name: str = Query(default=None), coordinates: str = Query(default=None), rank: int = Query(default=None), distance: float = Query(default=None), bbox: str = Query(default=None), sql: str = Query(default=None), fmt: str = Query(alias="format", default="json"), debug: bool = Query(default=False), pretty: bool = Query(default=False), ): if provider is None or network is None: raise HTTPException( status_code=400, detail="Query arguments 'provider' and 'network' are required", ) if parameter is None or resolution is None: raise HTTPException( status_code=400, detail="Query arguments 'parameter', 'resolution' " "and 'period' are required", ) if fmt not in ("json", "geojson"): raise HTTPException( status_code=400, detail="format argument must be one of json, geojson", ) set_logging_level(debug) try: api = Wetterdienst(provider, network) except ProviderError: return HTTPException( status_code=404, detail= f"Choose provider and network from {app.url_path_for('coverage')}", ) parameter = read_list(parameter) if period: period = read_list(period) if station_id: station_id = read_list(station_id) try: stations_ = get_stations( api=api, parameter=parameter, resolution=resolution, period=period, date=None, issue=None, all_=all_, station_id=station_id, name=name, coordinates=coordinates, rank=rank, distance=distance, bbox=bbox, sql=sql, tidy=False, si_units=False, humanize=False, skip_empty=False, skip_threshold=0.95, dropna=False, ) except (KeyError, ValueError) as e: return HTTPException(status_code=404, detail=str(e)) if not stations_.parameter or not stations_.resolution: return HTTPException( status_code=404, detail= f"No parameter found for provider {provider}, network {network}, " f"parameter(s) {parameter} and resolution {resolution}.", ) stations_.df = stations_.df.replace({np.nan: None, pd.NA: None}) indent = None if pretty: indent = 4 if fmt == "json": output = stations_.to_dict() elif fmt == "geojson": output = stations_.to_ogc_feature_collection() output = make_json_response(output, api.provider) output = json.dumps(output, indent=indent, ensure_ascii=False) return Response(content=output, media_type="application/json")
def values( provider: str, network: str, parameter: List[str], resolution: str, period: List[str], date: str, issue: str, all_: bool, station: List[str], name: str, coordinates: str, rank: int, distance: float, bbox: str, sql: str, sql_values, fmt: str, target: str, tidy: bool, si_units: bool, humanize: bool, skip_empty: bool, skip_threshold: float, dropna: bool, pretty: bool, debug: bool, ): set_logging_level(debug) api = get_api(provider, network) try: values_ = get_values( api=api, parameter=parameter, resolution=resolution, period=period, date=date, issue=issue, all_=all_, station_id=station, name=name, coordinates=coordinates, rank=rank, distance=distance, bbox=bbox, sql=sql, sql_values=sql_values, si_units=si_units, tidy=tidy, humanize=humanize, skip_empty=skip_empty, skip_threshold=skip_threshold, dropna=dropna, ) except ValueError as ex: log.exception(ex) sys.exit(1) else: if values_.df.empty: log.error("No data available for given constraints") sys.exit(1) if target: values_.to_target(target) return indent = None if pretty: indent = 4 output = values_.to_format(fmt, indent=indent) print(output) # noqa: T001 return
def stations( provider: str, network: str, parameter: List[str], resolution: str, period: List[str], all_: bool, station: List[str], name: str, coordinates: str, rank: int, distance: float, bbox: str, sql: str, fmt: str, target: str, pretty: bool, debug: bool, ): set_logging_level(debug) api = get_api(provider=provider, network=network) stations_ = get_stations( api=api, parameter=parameter, resolution=resolution, period=period, date=None, issue=None, all_=all_, station_id=station, name=name, coordinates=coordinates, rank=rank, distance=distance, bbox=bbox, sql=sql, tidy=False, si_units=False, humanize=False, skip_empty=False, skip_threshold=0.95, dropna=False, ) if stations_.df.empty: log.error("No stations_result available for given constraints") sys.exit(1) if target: stations_.to_target(target) return indent = None if pretty: indent = 4 output = stations_.to_format(fmt, indent=indent) print(output) # noqa: T001 return