R: [GRASS-user] r.rescale categories definition

Aldo Clerici aldo.clerici at unipr.it
Sun Dec 13 06:55:32 EST 2009




Glynn,
tanks for your detailed explanations. As an ordinary user I was a bit
confused in looking the command results and trying to find an explanation in
the manual pages. 
For my purposes I would prefer an equal classes subdivision but probably
there is some effective reason for such kind of classes definition. I'm not
able to evaluate it. 
If the current computation is necessary (or not modifiable) couldn't be
useful to warn the user about the specific (and probably unexpected) way the
categories are computed (may be in the manual)? 

Best regards
A.Clerici

 

-----Messaggio originale-----
Da: Glynn Clements [mailto:glynn at gclements.plus.com] 
Inviato: sabato 12 dicembre 2009 17.59
A: Aldo Clerici
Cc: grass-user at lists.osgeo.org
Oggetto: Re: [GRASS-user] r.rescale categories definition


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