[GRASS-dev] pyGRASS and mapcalc's pixel modifiers

Nikos Alexandris nik at nikosalexandris.net
Wed May 6 05:42:54 PDT 2015


* Moritz Lennert <mlennert at club.worldonline.be> [2015-05-06 12:59:16 +0200]:

> On 06/05/15 12:25, Nikos Alexandris wrote:
> > Hello programmers.
> >
> > Consider a Python class with methods that derive a somewhat complex mapcalc
> > expression which contains the following pixel modifiers:
> >
> > ['A[-1, -1]', 'A[-1, 0]', 'A[-1, 1]', 'A[0, -1]', 'A[0, 0]', 'A[0, 1]',
> > 'A[1, -1]', 'A[1, 0]', 'A[1, 1]']
> >
> >
> > These modifiers built-up a moving window to compute some values (eg. mean, median and other in-between values) and finally end up in a polynomial like:
> >
> > -9.674 + 0.653 * SomeValue + 9.087 * SomeValue^2
> >
> >
> > As far as my understanding goes, I can't check for the validity of the
> > in-between computed values with mapcalc's powers.  For example, check if the
> > average value as derived from the above defined pixel modifiers, lies within a
> > specific range.  I have build helper functions, as part of the Python class,
> > which could do this.  Then again, I don't have the powers of mapcalc to process
> > the data.
> >
> > I wonder how I should approach this, excluding rewriting my program in C (which
> > I don't speak easily).  If I go step-by-step, that is:
> >
> > 1) compute a map based with the mean of neighboring pixels (see pix-modifiers above)
> > 2) use pyGRASS' RasterRow, for example, to be able to apply some helper function and check or do something
> > 3) compute another, required, in-between map
> > 4) use pyGRASS again
> > 5) etc.
> >
> > up until to reach the final equation of interest.  This sounds really messy.  How would you approach this (excluding an
> > implementation in C)?
> 
> Have a look at the eval function of r.mapcalc (check the specific 
> section of the man page). It allows you to create intermediate results 
> which you can then use in further processing.

Thank you Moritz.  Already in use.   And quite happy about it.  eval, anyhow,
isn't an answer to my question.

A simple example of what would satisfy the current need, would be the
application of a helper function, like the following, on the fly.  That is
while reading or computing pixel values.

def check_cwv(cwv):
    """
    Check whether a column water vapor value lies within a "valid" range.
    """
    if cwv < 0.0 or cwv > 6.3:
        raise ValueError('The column water vapor estimation is out of the '
                         'expected ranfe [0.0, 6.3]')
    else:
        return True

Thanks, Nikos


More information about the grass-dev mailing list