[GRASS5] Re: [GRASSLIST:1551] Re: Use of neighbourhood operator in r.mapcalc

Hamish hamish_nospam at yahoo.com
Mon Oct 27 04:37:44 EST 2003


> > r.mapcalc buffmap = if(oldmap, oldmap, \
> >  if(oldmap[0,-1], oldmap[0,-1] \
> >   if(oldmap[0,1], oldmap[0,1] \
> >    if(oldmap[-1,0], oldmap[-1,0] \
> >     if(oldmap[1,0], oldmap[1,0])))))
>
> Aside: this operation seems to be sufficiently popular that we should
> consider adding an option to either r.buffer or r.grow to support it. 
> Using r.mapcalc quickly becomes impractical if you want a buffer
> larger than one cell.

[enter r.grow2]

Great, now I can get rid of my crappy script.

My use:
I've used this with a series of "region codes" at various site locations
which 'grow' outwards in a loop until the entire non-null region is
filled.

General method:
s.to.rast taking category number for raster value.
r.mapcalc base map so area of interest is 0 and no-go is NULL.
r.patch sites,basemap
r.grow_endless_loop
^C, check, r.grow_endless_loop [or {while find(==0)} might work..]

This allows me to 'grow' around corners; s.surf.rst+r.reclass has no
concept of impenetrable barriers, eg data from two parallel lakes
pollute each other.


One moderately important caveat:
For correct results I found I had to alternate the sign of the [-1,0]'s
(search order) after each iteration in order for it to make it around
certain corners and/or fill in some pixels which only have data on one
adjoining side. I cycled the search order but maybe randomly is more
appropriate.



thanks, this will be useful.
Hamish




More information about the grass-dev mailing list