Example #1
0
    def read(self, timestamp=None):
        #TODO: Replace ERA5 missing data (!=0)
        return_img = {}
        return_metadata = {}

        try:
            dataset = Dataset(self.filename)
        except IOError as e:
            print(e)
            print(" ".join([self.filename, "can not be opened"]))
            raise e

        res_lat, res_lon = get_grid_resolution(
            dataset.variables['latitude'][:],
            dataset.variables['longitude'][:])

        self.grid = ERA_RegularImgGrid(
            res_lat, res_lon) if not self.subgrid else self.subgrid

        for parameter, variable in dataset.variables.items():
            if parameter in self.parameter:
                param_metadata = {}
                param_data = {}
                for attrname in variable.ncattrs():
                    param_metadata.update(
                        {str(attrname): getattr(variable, attrname)})

                param_data = variable[:]

                param_data = param_data.flatten()

                return_img.update(
                    {str(parameter): param_data[self.grid.activegpis]})

                return_metadata.update({str(parameter): param_metadata})

                try:
                    return_img[parameter]
                except KeyError:
                    path, thefile = os.path.split(self.filename)
                    print('%s in %s is corrupt - filling'
                          'image with NaN values' % (parameter, thefile))
                    return_img[parameter] = np.empty(self.grid.n_gpi).fill(
                        np.nan)

                    return_metadata['corrupt_parameters'].append()

        dataset.close()

        if self.array_1D:
            return Image(self.grid.activearrlon, self.grid.activearrlat,
                         return_img, return_metadata, timestamp)
        else:
            for key in return_img:
                nlat = np.unique(self.grid.activearrlat).size
                nlon = np.unique(self.grid.activearrlon).size
                return_img[key] = return_img[key].reshape((nlat, nlon))
            return Image(self.grid.activearrlon.reshape(nlat, nlon),
                         self.grid.activearrlat.reshape(nlat, nlon),
                         return_img, return_metadata, timestamp)
Example #2
0
    def read(self, timestamp=None):
        """
        Read data from the loaded image file.

        Parameters
        ---------
        timestamp : datetime, optional (default: None)
            Specific date (time) to read the data for.
        """
        grbs = pygrib.open(self.filename)

        grid = self.subgrid

        return_img = {}
        return_metadata = {}

        var_msg_lut = {p: None for p in self.parameter}
        sea_mask = None
        for N in range(grbs.messages):
            n = N + 1
            message = grbs.message(n)
            param_name = str(message.cfVarNameECMF)

            if param_name == "lsm":
                if self.mask_seapoints and sea_mask is None:
                    sea_mask = message.values.flatten()

            if param_name not in self.parameter:
                continue
            else:
                var_msg_lut[param_name] = n

        # available variables
        shape = None
        for param_name, n in var_msg_lut.items():
            if n is None:
                continue

            return_metadata[param_name] = {}

            message = grbs.message(n)

            param_data = message.values.flatten()
            if not shape:
                shape = param_data.shape
            return_img[param_name] = param_data

            if grid is None:
                lats, lons = message.latlons()
                try:
                    res_lat, res_lon = get_grid_resolution(lats, lons)
                    grid = ERA_RegularImgGrid(res_lat, res_lon)
                except ValueError:  # when grid not regular
                    lons_gt_180 = np.where(lons > 180.0)
                    lons[lons_gt_180] = lons[lons_gt_180] - 360
                    grid = ERA_IrregularImgGrid(lons, lats)

            return_metadata[param_name]["units"] = message["units"]
            return_metadata[param_name]["long_name"] = \
                message["parameterName"]

            if "levels" in message.keys():
                return_metadata[param_name]["depth"] = "{:} cm".format(
                    message["levels"])

        if self.mask_seapoints:
            if sea_mask is None:
                raise IOError(
                    "No land sea mask parameter (lsm) in passed image"
                    " for masking.")
            else:
                # mask the loaded data
                for name in return_img.keys():
                    param_data = return_img[name]
                    param_data = np.ma.array(
                        param_data,
                        mask=np.logical_not(sea_mask),
                        fill_value=np.nan,
                    )
                    param_data = param_data.filled()
                    return_img[name] = param_data

        grbs.close()

        # missing variables
        for param_name, n in var_msg_lut.items():
            if n is not None:
                continue
            param_data = np.full(shape, np.nan)
            warnings.warn("Cannot load variable {var} from file {thefile}. "
                          "Filling image with NaNs.".format(
                              var=param_name, thefile=self.filename))
            return_img[param_name] = param_data
            return_metadata[param_name] = {}
            return_metadata[param_name]["long_name"] = lookup(
                self.product, [param_name]).iloc[0]["long_name"]

        if self.array_1D:
            return Image(
                grid.activearrlon,
                grid.activearrlat,
                return_img,
                return_metadata,
                timestamp,
            )
        else:
            nlat = np.unique(grid.activearrlat).size
            nlon = np.unique(grid.activearrlon).size

            for key in return_img:
                return_img[key] = return_img[key].reshape((nlat, nlon))

            return Image(
                grid.activearrlon.reshape(nlat, nlon),
                grid.activearrlat.reshape(nlat, nlon),
                return_img,
                return_metadata,
                timestamp,
            )
Example #3
0
    def read(self, timestamp=None):
        """
        Read data from the loaded image file.

        Parameters
        ---------
        timestamp : datetime, optional (default: None)
            Specific date (time) to read the data for.
        """
        return_img = {}
        return_metadata = {}

        try:
            dataset = xr.open_dataset(self.filename,
                                      engine="netcdf4",
                                      mask_and_scale=True)
        except IOError as e:
            print(e)
            print(" ".join([self.filename, "can not be opened"]))
            raise e

        res_lat, res_lon = get_grid_resolution(
            dataset.variables["latitude"][:],
            dataset.variables["longitude"][:])

        grid = (ERA_RegularImgGrid(res_lat, res_lon)
                if not self.subgrid else self.subgrid)

        if self.mask_seapoints:
            if "lsm" not in dataset.variables.keys():
                raise IOError("No land sea mask parameter (lsm) in"
                              " passed image for masking.")
            else:
                sea_mask = dataset.variables["lsm"].values

        for name in dataset.variables:
            if name in self.parameter:
                variable = dataset[name]

                param_data = variable.data

                if self.mask_seapoints:
                    param_data = np.ma.array(
                        param_data,
                        mask=np.logical_not(sea_mask),
                        fill_value=np.nan,
                    )
                    param_data = param_data.filled()

                param_data = param_data.flatten()

                return_metadata[name] = variable.attrs
                return_img.update(
                    dict([(str(name), param_data[grid.activegpis])]))

                try:
                    return_img[name]
                except KeyError:
                    path, thefile = os.path.split(self.filename)
                    warnings.warn(
                        "Cannot load variable {var} from file {thefile}. "
                        "Filling image with NaNs.".format(var=name,
                                                          thefile=thefile))
                    return_img[name] = np.empty(grid.activegpis.size).fill(
                        np.nan)

        dataset.close()

        if self.array_1D:
            return Image(
                grid.activearrlon,
                grid.activearrlat,
                return_img,
                return_metadata,
                timestamp,
            )
        else:
            nlat = np.unique(grid.activearrlat).size
            nlon = np.unique(grid.activearrlon).size

            for key in return_img:
                return_img[key] = return_img[key].reshape((nlat, nlon))

            return Image(
                grid.activearrlon.reshape(nlat, nlon),
                grid.activearrlat.reshape(nlat, nlon),
                return_img,
                return_metadata,
                timestamp,
            )
Example #4
0
def test_ERA_regular_grid():
    reg_grid = ERA_RegularImgGrid(0.3, 0.3)
    assert np.unique(reg_grid.activearrlat).size == 601
    assert np.unique(reg_grid.activearrlon).size == 1200
    assert get_grid_resolution(reg_grid.activearrlat,
                               reg_grid.activearrlon) == (0.3, 0.3)
Example #5
0
    def read(self, timestamp=None):
        '''
        Read data from the loaded image file.

        Parameters
        ---------
        timestamp : datetime, optional (default: None)
            Specific date (time) to read the data for.
        '''
        grbs = pygrib.open(self.filename)

        grid = self.subgrid

        return_img = {}
        return_metadata = {}

        sea_mask = None

        for message in grbs:
            param_name = message.short_name

            if param_name == 'lsm':
                if self.mask_seapoints and sea_mask is None:
                    sea_mask = message.values.flatten()

            param_name = message.short_name
            if param_name not in self.parameter:
                continue

            return_metadata[param_name] = {}
            param_data = message.values.flatten()

            return_img[param_name] = param_data

            if grid is None:
                lats, lons = message.latlons()
                try:
                    res_lat, res_lon = get_grid_resolution(lats, lons)
                    grid = ERA_RegularImgGrid(res_lat, res_lon)
                except ValueError:  # when grid not regular
                    lons_gt_180 = np.where(lons > 180.0)
                    lons[lons_gt_180] = lons[lons_gt_180] - 360
                    grid = ERA_IrregularImgGrid(lons, lats)

            return_metadata[param_name]['units'] = message['units']
            return_metadata[param_name]['long_name'] = message['parameterName']

            if 'levels' in message.keys():
                return_metadata[param_name]['depth'] = '{:} cm'.format(
                    message['levels'])

        if self.mask_seapoints:
            if sea_mask is None:
                raise IOError(
                    'No land sea mask parameter (lsm) in passed image for masking.'
                )
            else:
                # mask the loaded data
                for name in return_img.keys():
                    param_data = return_img[name]
                    param_data = np.ma.array(param_data,
                                             mask=np.logical_not(sea_mask),
                                             fill_value=np.nan)
                    param_data = param_data.filled()
                    return_img[name] = param_data

        grbs.close()

        if self.array_1D:
            return Image(grid.activearrlon, grid.activearrlat, return_img,
                         return_metadata, timestamp)

        else:
            nlat = np.unique(grid.activearrlat).size
            nlon = np.unique(grid.activearrlon).size

            for key in return_img:
                return_img[key] = return_img[key].reshape((nlat, nlon))

            return Image(grid.activearrlon.reshape(nlat, nlon),
                         grid.activearrlat.reshape(nlat, nlon), return_img,
                         return_metadata, timestamp)