[GRASS-dev] Re: [GRASS GIS] #857: add simple neighborhood functions to r.mapcalc

GRASS GIS trac at osgeo.org
Thu Jan 7 22:50:47 EST 2010


#857: add simple neighborhood functions to r.mapcalc
--------------------------+-------------------------------------------------
  Reporter:  dickeya      |       Owner:  grass-dev at lists.osgeo.org
      Type:  enhancement  |      Status:  new                      
  Priority:  normal       |   Milestone:  6.4.0                    
 Component:  Raster       |     Version:  unspecified              
Resolution:               |    Keywords:  r.mapcalc                
  Platform:  All          |         Cpu:  All                      
--------------------------+-------------------------------------------------
Comment (by glynn):

 Replying to [ticket:857 dickeya]:

 > I find myself using a lot of neighbor functions in r.mapcalc, but find
 the syntax to be tedious.  Anything larger than a 3x3 neighborhood and
 writing out "raster[-1,-1] + raster[-1,0] + raster[-1,-1] + ..." is quite
 a task.

 For a sum, use `r.mfilter[.fp]` or `r.neighbors ... weight=...`

 > It's especially hard to do an average when nodata cells are present.

 Convert nulls first in a separate pass.

 > It would be great to have some built in neighborhood functions that
 would handle the math, taking into account nodata cells, and working on a
 rectangular or circular area.  Something like:
 >
 {{{
 neighborhood(raster, width, height, shape, function)
 }}}

 There area a couple of issues with this:

 1. The functions which make up the bulk of r.mapcalc all operate on 1-D
 arrays of size G_window_cols(). So we can't "leverage" the existing
 functions for this purpose.

 2. The above neighborhood() function cannot be implemented using the
 existing function interface; it would need to be a new language construct,
 recognised by the parser, the evaluator, and the I/O code.

 If neighborhood() was a normal function, the above call would result in
 its first argument being the current row of the specified raster, which is
 no good for a neighborhood operation (and all of its other arguments would
 also be row-sized arrays of CELL/FCELL/DCELL values; a numeric literal is
 passed as a row-sized array filled with that value).

 I suspect that it might be more fruitful to add new aggregates to
 r.neighbors.

 That still leaves a gap between what can be implemented with a combination
 of r.mapcalc + r.neighbors + r.mapcalc and what could be implemented with
 a more general language. E.g. there isn't any combination which will allow
 you to calculate:
 {{{
 output[r,c] = sum<i,j>(input[r+i,c+j] <op> kernel[i,j])
 }}}
 for any <op> except multiplication.

 Implementing that specific case in r.mapcalc (or r.neighbors) would be a
 lot of work, but not entirely out of the question. My main concern is that
 it would be the thin end of the wedge; either we draw a line in the sand,
 or we end up with Perl.

 IMHO, if you can't do what you want with r.mapcalc + r.neighbors, you'll
 need a system with enough (virtual) memory to use Matlab/Octave/NumPy.

-- 
Ticket URL: <http://trac.osgeo.org/grass/ticket/857#comment:1>
GRASS GIS <http://grass.osgeo.org>


More information about the grass-dev mailing list