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@gclements.plus.com]
Inviato: sabato 12 dicembre 2009 17.59
A: Aldo Clerici
Cc: grass-user@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@gclements.plus.com>