[GRASSLIST:7859] Re: Generating rasters at different resolutions

Glynn Clements glynn at gclements.plus.com
Thu Aug 11 11:06:52 EDT 2005


Jose Gomez-Dans wrote:

> I have generated rasters from vectors at a very fine resolution
> (related to the accuracy of the vector data), and I want to aggregate
> these cells to generate rasters at a much coarser resolution. For each
> cell in the aggregated raster, the value should be the value that is
> majoritary on the high resolution raster, provided it also exceeds an
> area threshold. Additionally, it would be nice to have a second raster
> with the percentage of area of the chosen category.

There isn't a simple way to do this.

The two approaches which spring to mind are:

1. Use r.statistics with a base map where each cell has a unique
category, e.g.:

	g.region res=$low_res
	cols=`g.region -p | fgrep cols: | cut -c 6-`
	r.mapcalc "base = row() * $cols + col()"
	g.region res=$high_res
	r.statistics base=base cover=inmap output=mode method=mode
	r.mapcalc 'ismode = (inmap == mode)'
	r.statistics base=base cover=ismode method=average output=area
	r.mapcalc "outmap = if(area > $min_area,mode,null())"
	g.remove rast=base,mode,ismode,area

2. Use r.neighbors and downsample the output, e.g.:

	g.region res=$high_res
	r.neighbors input=inmap output=mode.hi method=mode size=$size
	g.region res=$low_res
	r.resample input=mode.hi output=mode
	g.region res=$high_res
	r.mapcalc 'ismode = (inmap == mode)'
	r.neighbors inmap=ismode output=area.hi method=average size=$size
	g.region res=$low_res
	r.resample input=area.hi output=area
	g.region res=$high_res
	r.mapcalc "outmap = if(area > $min_area,mode,null())"
	g.remove rast=mode.hi,mode,ismode,area.hi,area

Note that r.neighbors will only work with odd-sized an neighbourhood.

Enough people ask for this that it would be useful to have something
which combines r.resample and r.neighbors using gridded
neighbourhoods.

> In principle, I had thought about using r.mapcalc, but I haven't
> sussed out how to select the neighborhood to be considered. There's
> the ewres and the nsres operators, but I don't think I understand how
> to use them, or how to carry out what I want to do!

r.mapcalc doesn't do neighbourhood operations. You can implement them
manually using multiple offset terms, but this quickly becomes
impractical unless the neighbourhood size is very small.

-- 
Glynn Clements <glynn at gclements.plus.com>




More information about the grass-user mailing list