Trying to circumvent the r.mapcalc min/max limit, I found out another
problem when I'm trying to cast a buffer from one type to another.
The code is:
{{{
from __future__ import print_function
import numpy as np
from grass.pygrass.raster import RasterRow
from grass.pygrass.messages import get_msgr
def scale(mn, mx, newmn=0, newmx=1, dtype=np.float32):
print("from (%r, %r) to (%r, %r): %r" % (mn, mx, newmn, newmx, dtype))
def do(row):
return dtype((row - mn) / (mx - mn) * (newmx - newmn) + newmn)
return do
def rescale(input, output, new_min=0, new_max=255, mtype='CELL'):
dtype = np.int32 if mtype == 'CELL' else np.float32 if mtype ==
'FCELL' else np.float64
msgr = get_msgr()
with RasterRow(input, mode='r') as inp:
scaler = scale(inp.info.min, inp.info.max, new_min, new_max, dtype)
with RasterRow(output, mode='w', mtype=mtype, overwrite=True) as out:
binp = inp[0]
rows = inp._rows
for i in range(rows):
msgr.percent(i, rows, 1)
out.put_row(scaler(inp.get_row(i, binp)))
rescale('el', 'cel255', 0, 255, mtype='CELL')
rescale('el', 'fel255', 0, 255, mtype='FCELL')
rescale('el', 'del255', 0, 255, mtype='DCELL')
}}}
and these are the results
{{{
$ python2 cmd.py
from (0.3555224724894053, 0.9999997729286152) to (0, 255): <type 'numpy.int32'>
from (0.3555224724894053, 0.9999997729286152) to (0, 255): <type
'numpy.float32'>
from (0.3555224724894053, 0.9999997729286152) to (0, 255): <type
'numpy.float64'>
$ r.info cel255
[cut]
Range of data: min = -2147483405 max = 2147176055
$ r.info fel255
[cut]
Range of data: min = -3.402784e+38 max = 3.402818e+38
$ r.info del255
[cut]
Range of data: min = 0 max = 255
}}}
So even if I'm explicitly casting the result in the scaler function
with dtype(...), the result is not properly casted, do you have an
idea on how could I solve this problem?
All the best
Pietro