[GRASS-user] r.rescale categories definition

Glynn Clements glynn at gclements.plus.com
Sat Dec 12 11:59:02 EST 2009


Aldo Clerici wrote:

> Dear GRASS Users and Developers,
> I'm having some problem in understanding the categories resulting from
> r.rescale 
>  
> With:
> r.rescale in=elevation.dem from=1200,1500 to=1,2 out=elev.resc
>  
> I have this result:
> 1   1200 thru 1349
> 2   1350 thru 1500
>  
> Two categories with a range of 150 meters each.
>  
> But with a new three categories subdivision:
>  r.rescale in=elevation.dem from=1200,1500 to=1,3 out=elev.resc
> the result is:
> 1    1200 thru 1274
> 2    1275 thru 1424
> 3    1425 thru 1500
>  
> The first and last categories have a range of 75 meters and the second one
> of 150 meters. 
>  
> Similar result with a four categories subdivision:
> r.rescale in=elevation.dem from=1200,1500 to=1,4 out=elev.resc
>  
> 1    1200 thru 1250
> 2    1251 thru 1350
> 3    1351 thru 1450
> 4    1451 thru 1500
>   
> Categories 1 and 4 have a range of 50 meters, 2 and 3 a range of 100 meters.
>  
> It seems that the first and last categories have the half range of all the
> others ones. Is this correct? Shouldn't the range be the same for all
> categories?

This is a result of r.rescale rounding rather than truncating, so the
minimum and maximum input values are the midpoints of the first and
last intervals:

    old_delta = old_max - old_min;
    new_delta = new_max - new_min;
    divisor = (float)new_delta / (float)old_delta;
	...
    for (cat = old_min; cat <= old_max; cat++) {
	value = (int)(divisor * (cat - old_min) + new_min + .5);

You can get balanced intervals with:

#!/bin/sh
inmap=$1
outmap=$2
to_min=$3
to_max=$4
eval `r.info -r $inmap`
awk -vold_min=$min -vold_max=$max -vnew_min=$to_min -vnew_max=$to_max '
BEGIN {
  new_delta = new_max - new_min + 1
  old_delta = old_max - old_min + 1
  for (i = 0; i < new_delta; i++) {
    lo = old_min + i     * old_delta / new_delta
    hi = old_min + (i+1) * old_delta / new_delta - 1
    new = new_min + i
    printf("%d thru %d = %d %d\n", lo, hi, new, lo)
  }
}' | r.reclass in=$inmap out=$outmap

E.g.:

	./rescale.sh elevation.dem elev.resc 1 4

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


More information about the grass-user mailing list