Пример #1
0
 def __next__(self):
     offset = self.file.tell()
     handle = eccodes.codes_new_from_file(self.file,
                                          eccodes.CODES_PRODUCT_GRIB)
     if not handle:
         raise StopIteration()
     return CodesHandle(handle, self.path, offset)
Пример #2
0
 def _next_handle(self):
     offset = self.file.tell()
     handle = eccodes.codes_new_from_file(self.file,
                                          eccodes.CODES_PRODUCT_GRIB)
     if not handle:
         return None
     return CodesHandle(handle, self.path, offset)
Пример #3
0
 def scan_grib(self, **kwargs):
     gribs = []
     v_selected = kwargs['shortName']
     v_pert = kwargs.get('perturbationNumber', -1)
     if not utils.is_container(v_selected):
         v_selected = [v_selected]
     if self._grbindx:
         for v in v_selected:
             codes_index_select(self._grbindx, 'shortName', str(v))
             if v_pert != -1:
                 codes_index_select(self._grbindx, 'perturbationNumber',
                                    int(v_pert))
             while 1:
                 gid = codes_new_from_index(self._grbindx)
                 if gid is None:
                     break
                 if GRIBReader._find(gid, **kwargs):
                     gribs.append(gid)
                 else:
                     # release unused grib
                     codes_release(gid)
     elif self._file_handler:
         while 1:
             gid = codes_new_from_file(self._file_handler,
                                       product_kind=CODES_PRODUCT_GRIB)
             if gid is None:
                 break
             if GRIBReader._find(gid, **kwargs):
                 gribs.append(gid)
             else:
                 # release unused grib
                 codes_release(gid)
     return gribs
Пример #4
0
 def from_file(cls, file, offset=None, product_kind=eccodes.CODES_PRODUCT_ANY, **kwargs):
     # type: (T.IO[bytes], int, int, T.Any) -> Message
     field_in_message = 0
     if isinstance(offset, tuple):
         offset, field_in_message = offset
     if offset is not None:
         file.seek(offset)
     codes_id = None
     # iterate over multi-fields in the message
     for _ in range(field_in_message + 1):
         codes_id = eccodes.codes_new_from_file(file, product_kind=product_kind)
     if codes_id is None:
         raise EOFError("End of file: %r" % file)
     return cls(codes_id=codes_id, **kwargs)
Пример #5
0
def generate_grib(target, **kwargs):
    import eccodes

    for k, v in list(kwargs.items()):
        if not isinstance(v, (list, tuple)):
            kwargs[k] = [v]

    handle = None
    try:
        with open(os.path.join(os.path.dirname(__file__), "dummy.grib"), "rb") as f:
            handle = eccodes.codes_new_from_file(f, eccodes.CODES_PRODUCT_GRIB)

        with open(target, "wb") as f:
            for r in iterate_request(kwargs):
                for k, v in r.items():
                    eccodes.codes_set(handle, k, v)
                eccodes.codes_write(handle, f)

    finally:
        if handle is not None:
            eccodes.codes_release(handle)
Пример #6
0
    def __init__(
        self,
        codes_file=None,
        clone=None,
        sample=None,
        headers_only=False,
        other_args_found=False,
    ):
        """
        Open a message and inform the host file that it's been incremented.

        If ``codes_file`` is not supplied, the message is cloned from
        ``CodesMessage`` ``clone``. If neither is supplied,
        the ``CodesMessage`` is cloned from ``sample``.

        :param codes_file: A file readable for ecCodes
        :param clone: A valid ``CodesMessage``
        :param sample: A valid sample path to create ``CodesMessage`` from
        """
        if (not other_args_found and codes_file is None and clone is None
                and sample is None):
            raise RuntimeError("CodesMessage initialization parameters not "
                               "present.")
        #: Unique ID, for ecCodes interface
        self.codes_id = None
        #: File containing message
        self.codes_file = None
        if codes_file is not None:
            self.codes_id = eccodes.codes_new_from_file(
                codes_file.file_handle, self.product_kind, headers_only)
            if self.codes_id is None:
                raise IOError("CodesFile %s is exhausted" % codes_file.name)
            self.codes_file = codes_file
            self.codes_file.message += 1
            self.codes_file.open_messages.append(self)
        elif clone is not None:
            self.codes_id = eccodes.codes_clone(clone.codes_id)
        elif sample is not None:
            self.codes_id = eccodes.codes_new_from_samples(
                sample, self.product_kind)
Пример #7
0
    def has_geopotential(self):
        has_geo = False
        from pyg2p.main.config import GeopotentialsConfiguration
        v_selected = GeopotentialsConfiguration.short_names
        if self._grbindx:
            for v in v_selected:
                codes_index_select(self._grbindx, 'shortName', str(v))
                while 1:
                    gid = codes_new_from_index(self._grbindx)
                    if gid is None:
                        break
                    has_geo = True
                    codes_release(gid)

        elif self._file_handler:
            while 1:
                gid = codes_new_from_file(self._file_handler,
                                          product_kind=CODES_PRODUCT_GRIB)
                if gid is None:
                    break
                has_geo = True
                codes_release(gid)
        return has_geo
Пример #8
0
def test_new_from_file():
    fpath = get_sample_fullpath("GRIB2.tmpl")
    if fpath is None:
        return
    with open(fpath, "rb") as f:
        msgid = eccodes.codes_new_from_file(f, eccodes.CODES_PRODUCT_GRIB)
        assert msgid
    fpath = get_sample_fullpath("BUFR4.tmpl")
    with open(fpath, "rb") as f:
        msgid = eccodes.codes_new_from_file(f, eccodes.CODES_PRODUCT_BUFR)
        assert msgid
    fpath = get_sample_fullpath("clusters_grib1.tmpl")
    with open(fpath, "rb") as f:
        msgid = eccodes.codes_new_from_file(f, eccodes.CODES_PRODUCT_ANY)
        assert msgid
    with open(fpath, "rb") as f:
        msgid = eccodes.codes_new_from_file(f, eccodes.CODES_PRODUCT_GTS)
        assert msgid is None
    with open(fpath, "rb") as f:
        msgid = eccodes.codes_new_from_file(f, eccodes.CODES_PRODUCT_METAR)
        assert msgid is None
    with pytest.raises(ValueError):
        with open(fpath, "rb") as f:
            eccodes.codes_new_from_file(f, 1024)