Пример #1
0
def get_message(
    data_path,
    parameter,
    level,
    level_type="isobaricInhPa",
):
    if parameter == "wind":
        u_message, v_message = get_wind_message(
            data_path=data_path,
            level=level,
            level_type=level_type,
        )
        message = eccodes.codes_clone(u_message)
        u_array = eccodes.codes_get_double_array(u_message, "values")
        v_array = eccodes.codes_get_double_array(v_message, "values")
        w_array = np.sqrt(u_array * u_array + v_array * v_array)
        eccodes.codes_release(u_message)
        eccodes.codes_release(v_message)
        eccodes.codes_set_double_array(message, "values", w_array)
    else:
        message = load_message_from_file(file_path=data_path,
                                         parameter=parameter,
                                         level_type=level_type,
                                         level=level)
    return message
Пример #2
0
 def get_gids_for_grib_intertable(self):
     # returns gids of messages to use to create interpolation tables
     val = codes_get_double_array(self._gid_main_res, 'values')
     val2 = None
     if self._gid_ext_res:
         val2 = codes_get_double_array(self._gid_ext_res, 'values')
     return self._gid_main_res, val, self._gid_ext_res, val2
Пример #3
0
 def latlons(self):
     # this method is called only for scipy interpolation
     if self._lats is None:
         self._log('Fetching coordinates from grib file')
         self._lats = eccodes.codes_get_double_array(self._gid, 'latitudes')
         self._longs = eccodes.codes_get_double_array(
             self._gid, 'longitudes')
     return self._lats, self._longs
Пример #4
0
 def get(self, name):
     try:
         if name == "values":
             return eccodes.codes_get_values(self.handle)
         if name in ("distinctLatitudes", "distinctLongitudes"):
             return eccodes.codes_get_double_array(self.handle, name)
         return eccodes.codes_get(self.handle, name)
     except eccodes.KeyValueNotFoundError:
         return None
Пример #5
0
def get_values(
    file_path: pathlib.Path,
    parameter: str or typing.Dict,
    level: float or typing.Dict,
) -> np.ndarray:
    message = get_message(
        file_path,
        parameter=parameter,
        level=level,
    )
    array = eccodes.codes_get_double_array(message,
                                           "values").reshape([121, 240])
    eccodes.codes_release(message)
    return array
Пример #6
0
def create_data_array_from_message(
    message,
    level_dim_name: str or None = None,
) -> xr.DataArray:
    """
    Create ``xarray.DataArray`` from one GRIB 2 message.
    """
    values = eccodes.codes_get_double_array(message, "values")

    attr_keys = [
        'edition',
        'centre',
        'subCentre',
        'tablesVersion',
        "localTablesVersion",
        'dataType',
        'dataDate',
        'dataTime',
        'validityDate',
        'validityTime',
        'step',
        'stepType',
        'stepUnits',
        'stepRange',
        'endStep',
        "name",
        "shortName",
        'cfName',
        'discipline',
        'parameterCategory',
        'parameterNumber',
        'gridType',
        'gridDefinitionDescription',
        'typeOfFirstFixedSurface',
        'typeOfLevel',
        'level',
        'numberOfPoints',
        "missingValue",
        'units',
    ]

    grid_keys = [
        'latitudeOfFirstGridPointInDegrees',
        'longitudeOfFirstGridPointInDegrees',
        'latitudeOfLastGridPointInDegrees',
        'longitudeOfLastGridPointInDegrees',
        'iDirectionIncrementInDegrees',
        'jDirectionIncrementInDegrees',
        'Ni',
        'Nj',
    ]

    level_keys = [
        "typeOfFirstFixedSurface",
        "typeOfSecondFixedSurface",
        "scaleFactorOfFirstFixedSurface",
        "scaledValueOfFirstFixedSurface",
    ]

    all_keys = attr_keys + grid_keys + level_keys

    all_attrs = {}
    for key in all_keys:
        try:
            value = eccodes.codes_get(message, key)
        except:
            value = "undef"
        all_attrs[key] = value

    latitude_of_first_grid_point_in_degrees = all_attrs[
        "latitudeOfFirstGridPointInDegrees"]
    longitude_of_first_grid_point_in_degrees = all_attrs[
        "longitudeOfFirstGridPointInDegrees"]
    latitude_of_last_grid_point_in_degrees = all_attrs[
        "latitudeOfLastGridPointInDegrees"]
    longitude_of_last_grid_point_in_degrees = all_attrs[
        "longitudeOfLastGridPointInDegrees"]
    ni = all_attrs["Ni"]
    nj = all_attrs["Nj"]

    values = values.reshape(nj, ni)
    lons = np.linspace(longitude_of_first_grid_point_in_degrees,
                       longitude_of_last_grid_point_in_degrees,
                       ni,
                       endpoint=True)
    lats = np.linspace(latitude_of_first_grid_point_in_degrees,
                       latitude_of_last_grid_point_in_degrees,
                       nj,
                       endpoint=True)

    coords = {}

    # add time and step coordinate
    time_name, value = get_time_from_attrs(all_attrs)
    coords[time_name] = value

    step_name, value = get_step_from_attrs(all_attrs)
    coords[step_name] = value

    # add valid time coordinate
    valid_time_name, value = get_valid_time_from_attrs(all_attrs)
    if valid_time_name is not None:
        coords[valid_time_name] = value

    # add level coordinate
    level_name, value = get_level_from_attrs(all_attrs, level_dim_name)
    coords[level_name] = value

    coords["latitude"] = lats
    coords["longitude"] = lons

    dims = ("latitude", "longitude")

    data_attrs = {
        f"GRIB_{key}": all_attrs[key]
        for key in attr_keys if all_attrs[key] not in ("undef", "unknown")
    }

    # set long_name
    if "GRIB_name" in data_attrs:
        data_attrs["long_name"] = data_attrs["GRIB_name"]
    else:
        name = (f"discipline={all_attrs['discipline']} "
                f"parmcat={all_attrs['parameterCategory']} "
                f"parm={all_attrs['parameterNumber']}")
        data_attrs["long_name"] = name

    # set name
    if "shortName" in all_attrs:
        var_name = all_attrs["shortName"]
    else:
        var_name = f"{all_attrs['discipline']}_{all_attrs['parameterCategory']}_{all_attrs['parameterNumber']}"

    # set units
    if "GRIB_units" in data_attrs:
        data_attrs["units"] = data_attrs["GRIB_units"]

    data = xr.DataArray(
        values,
        dims=dims,
        coords=coords,
        attrs=data_attrs,
        name=var_name,
    )

    return data
Пример #7
0
 def get_double_array(self, key):
     return eccodes.codes_get_double_array(self.handle, key)
Пример #8
0
    def select_messages(self, **kwargs):
        self._selected_grbs = self._get_gids(**kwargs)
        self._log(f'Selected {len(self._selected_grbs)} grib messages')

        if len(self._selected_grbs) > 0:
            self._gid_main_res = self._selected_grbs[0]
            grid = GribGridDetails(self._selected_grbs[0])
            # some cumulated messages come with the message at step=0 as instant, to permit aggregation
            # cumulated rainfall rates could have the step zero instant message as kg/m^2, instead of kg/(m^2*s)
            if len(self._selected_grbs) > 1:
                unit = codes_get(self._selected_grbs[1], 'units')
                type_of_step = codes_get(self._selected_grbs[1], 'stepType')
            else:
                type_of_step = codes_get(self._selected_grbs[0], 'stepType')
                unit = codes_get(self._selected_grbs[0], 'units')
            type_of_level = codes_get(self._selected_grbs[0], 'levelType')

            missing_value = codes_get(self._selected_grbs[0], 'missingValue')
            data_date = codes_get(self._selected_grbs[0], 'dataDate')
            all_values = {}
            all_values_second_res = {}
            grid2 = None
            input_step = self._step_grib
            for g in self._selected_grbs:
                start_step = codes_get(g, 'startStep')
                end_step = codes_get(g, 'endStep')
                points_meridian = codes_get(g, 'Nj')
                level = codes_get(g, 'level')
                if f'{start_step}-{end_step}' == self._change_step_at:
                    # second time resolution
                    input_step = self._step_grib2

                step_key = Step(start_step, end_step, points_meridian,
                                input_step, level)

                if points_meridian != grid.num_points_along_meridian and grid.get_2nd_resolution(
                ) is None:
                    # found second resolution messages
                    grid2 = GribGridDetails(g)
                    self._gid_ext_res = g
                values = codes_get_double_array(g, 'values')

                # Handling missing grib values.
                # If bitmap is present, array will be a masked_array
                # and array.mask will be used later
                # in interpolation and manipulation
                bitmap_present = codes_get(g, 'bitmapPresent')
                if bitmap_present:
                    # Get the bitmap array which contains 0s and 1s
                    bitmap = codes_get_array(g, 'bitmap', int)
                    values = ma.masked_where(bitmap == 0, values, copy=False)

                if not grid2:
                    all_values[step_key] = values
                elif points_meridian != grid.num_points_along_meridian:
                    all_values_second_res[step_key] = values

            if grid2:
                key_2nd_spatial_res = min(all_values_second_res.keys())
                grid.set_2nd_resolution(grid2, key_2nd_spatial_res)
            return Messages(all_values,
                            missing_value,
                            unit,
                            type_of_level,
                            type_of_step,
                            grid,
                            all_values_second_res,
                            data_date=data_date)
        # no messages found
        else:
            raise ApplicationException.get_exc(NO_MESSAGES,
                                               details=f'using {kwargs}')