Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
0
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
Beispiel #4
0
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")
Beispiel #5
0
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")
Beispiel #6
0
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")
Beispiel #7
0
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
Beispiel #8
0
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