コード例 #1
0
    def process(self, *args, **kwargs):
        """Deduce which products need producing, then produce them."""
        products = super(prismData, self).process(*args, **kwargs)
        if len(products) == 0:
            return
        # overwrite = kwargs.get('overwrite', False)
        # utils.verbose_out('\n\noverwrite = {}\n'.format(overwrite), 2)
        # TODO: overwrite doesn't play well with pptsum -- wonder if it would
        #       if it was made into a composite product (which it is)
        assert len(prismAsset._sensors
                   ) == 1  # sanity check to force this code to stay current
        sensor = prismAsset._sensors.keys()[0]

        def get_bil_vsifile(d, a):
            with utils.error_handler('Error accessing asset {}'.format(d),
                                     continuable=True):
                return os.path.join('/vsizip/' + d.assets[a].filename,
                                    d.assets[a].datafiles()[0])

        for key, val in products.requested.items():
            start = datetime.now()
            # check that we have required assets
            requiredassets = self.products2assets([val[0]])
            # val[0] s.b. key w/o product args
            description = self._products['pptsum']['description']
            missingassets = []
            availassets = []
            vsinames = {}

            for asset in requiredassets:
                bil = get_bil_vsifile(self, asset)
                if bil is None:
                    missingassets.append(asset)
                else:
                    availassets.append(asset)
                    vsinames[asset] = os.path.join(
                        '/vsizip/' + self.assets[asset].filename, bil)

            if not availassets:
                utils.verbose_out(
                    'There are no available assets ({}) on {} for tile {}'.
                    format(str(missingassets), str(self.date), str(self.id)),
                    5,
                )
                continue
            prod_fn = '{}_{}_{}.tif'.format(self.basename, 'prism', key)
            archived_fp = os.path.join(self.path, prod_fn)  # final destination
            if val[0] in ['ppt', 'tmin', 'tmax']:
                with self.make_temp_proc_dir() as tmp_dir:
                    tmp_fp = os.path.join(tmp_dir, prod_fn)
                    os.symlink(vsinames[self._products[key]['assets'][0]],
                               tmp_fp)
                    os.rename(tmp_fp, archived_fp)
            elif val[0] == 'pptsum':
                if len(val) < 2:
                    lag = 3  # no argument provided, use default lag of 3 days SB configurable.
                    prod_fn = re.sub(r'\.tif$', '-{}.tif'.format(lag), prod_fn)
                    archived_fp = os.path.join(
                        self.path, prod_fn)  # have to regenerate, sigh
                    utils.verbose_out(
                        'Using default lag of {} days.'.format(lag), 2)
                else:
                    with utils.error_handler(
                            "Error for pptsum lag value '{}').".format(
                                val[1])):
                        lag = int(val[1])

                date_spec = '{},{}'.format(
                    datetime.strftime(
                        self.date - timedelta(days=lag),
                        '%Y-%m-%d',
                    ),
                    datetime.strftime(self.date, '%Y-%m-%d'),
                )
                inv = self.inventory(
                    dates=date_spec,
                    products=['ppt'],
                )
                inv.process()
                # because DataInventory object doesn't update
                inv = self.inventory(
                    dates=date_spec,
                    products=['ppt'],
                )
                if len(inv.data) < lag:
                    utils.verbose_out(
                        '{}: requires {} preceding days ppt ({} found).'.
                        format(key, lag, len(inv.data)),
                        3,
                    )
                    continue  # go to next product to process
                imgs = []
                asset_fns = []  # have to grab filenames for multiple days
                for tileobj in inv.data.values():
                    datobj = tileobj.tiles.values()[0]
                    asset_fns.append(
                        os.path.basename(datobj.assets['_ppt'].filename))
                    imgs.append(GeoImage(get_bil_vsifile(datobj, '_ppt')))

                with self.make_temp_proc_dir() as tmp_dir:
                    tmp_fp = os.path.join(tmp_dir, prod_fn)
                    oimg = GeoImage(tmp_fp, imgs[0])
                    oimg.SetNoData(-9999)
                    oimg.SetBandName(
                        description + '({} day window)'.format(lag), 1)
                    oimg.SetMeta(self.prep_meta(sorted(asset_fns)))
                    for chunk in oimg.Chunks():
                        oarr = oimg[0].Read(chunk) * 0.0  # wat
                        for img in imgs:
                            oarr += img[0].Read(chunk)
                        oimg[0].Write(oarr, chunk)
                    oimg.Process()
                    os.rename(tmp_fp, archived_fp)
                oimg = None  # help swig+gdal with GC
                products.requested.pop(key)
            self.AddFile(sensor, key, archived_fp)  # add product to inventory
        return products
コード例 #2
0
ファイル: prism.py プロジェクト: ircwaves/gips
    def process(self, *args, **kwargs):
        """
        Cribbed from super: 
        Make sure all products exist and return those that need processing.
        """
        products = super(prismData, self).process(*args, **kwargs)
        if len(products) == 0:
            return
        bname = os.path.join(self.path, self.basename)

        for key, val in products.requested.items():
            start = datetime.now()

            # check that we have required assets
            requiredassets = self.products2assets([val[0]])
            # val[0] s.b. key w/o product args
            missingassets = []
            availassets = []

            vsinames = {}

            def get_bil_file(d, a):
                return filter(
                    lambda f: f.endswith('.bil'),
                    d.assets[a].datafiles(),
                )[0]

            for asset in requiredassets:
                try:
                    bil = get_bil_file(self, asset)
                except KeyError:
                    missingassets.append(asset)
                else:
                    availassets.append(asset)
                    vsinames[asset] = bil

            if not availassets:
                VerboseOut(
                    'There are no available assets ({}) on {} for tile {}'.
                    format(
                        str(missingassets),
                        str(self.date),
                        str(self.id),
                    ),
                    5,
                )
                continue
            fname = '{}_{}_{}.tif'.format(bname, 'prism', key)
            if val[0] in ['ppt', 'tmin', 'tmax']:
                if os.path.lexists(fname):
                    os.remove(fname)
                os.symlink(vsinames[self._products[key]['assets'][0]], fname)
            elif val[0] == 'pptsum':
                try:
                    lag = int(val[1])
                except ValueError, TypeError:
                    raise Exception(
                        'pptsum argument format error (given: {}).')
                except IndexError:
                    # no argument provided, use
                    # default lag of 3 days SB configurable.
                    lag = 3
                    fname = re.sub(r'\.tif$', '-{}.tif'.format(lag), fname)
                    VerboseOut('Using default lag of {} days.'.format(lag), 2)

                if os.path.exists(fname):
                    os.remove(fname)

                inv = self.inventory(
                    dates='{},{}'.format(
                        datetime.strftime(
                            self.date - timedelta(days=lag - 1),
                            '%Y-%m-%d',
                        ),
                        datetime.strftime(self.date, '%Y-%m-%d'),
                    ),
                    products=['ppt'],
                )
                inv.process()
                inv = self.inventory(
                    dates='{},{}'.format(
                        datetime.strftime(
                            self.date - timedelta(days=lag - 1),
                            '%Y-%m-%d',
                        ),
                        datetime.strftime(self.date, '%Y-%m-%d'),
                    ),
                    products=['ppt'],
                )
                if len(inv.data) < lag:
                    raise Exception(
                        key +
                        ': requires {} preceding days ppt assets.'.format(lag)
                        + '\nOnly {} days found.'.format(len(inv.data)))
                imgs = []
                for tileobj in inv.data.values():
                    datobj = tileobj.tiles.values()[0]
                    imgs.append(datobj.open_assets('ppt'))
                oimg = GeoImage(fname, imgs[0])
                for chunk in oimg.Chunks():
                    oarr = oimg[0].Read(chunk) * 0.0
                    for img in imgs:
                        print('mean value of image: {}'.format(
                            mean(img[0].Read())))
                        oarr += img[0].Read(chunk)
                    oimg[0].Write(oarr, chunk)
                oimg.Process()
                #oimg = None
                print('nih')
                products.requested.pop(key)