[GRASS5] Re: [GRASSLIST:8999] r.statistics vs v.rast.stats vs ??
Hamish
hamish_nospam at yahoo.com
Thu Nov 10 21:25:23 EST 2005
> I am trying to calculate statistics such as mean elevation, slope,
> maximum drainage area etc for a very large number of small plots. The
> plots are in a vector file and I have been trying to use v.rast.stats
> on the various rasters that represent elevation, slope, drainage area,
> etc.
>
> The problem is that the rasters are very high resolution, the plots
> are quite small, and I have more than 600 to process. If you look at
> the code for v.rast.stats, it converts each plot into a raster to use
> as a mask and then runs r.univar on the entire map (now mostly null
> values), once for each statistic. In my situation it can take several
> minutes for each plot. In other words hours for each of the above
> rasters that I am interested in and more than 2 days for the whole
> set.
>
> Is there a more efficient way of calculating these statistics? I have
> tried to use r.statistics and can't make sense of the inputs and
> outputs. Alternatively, if I could control the region size in the
> critical part of the v.rast.stats script I might be able to improve
> the speed of the script.
for i in $CATSLIST ; do
echo "Processing category $i ($CURRNUM/$NUMBER)"
g.remove MASK > /dev/null 2> /dev/null
r.mapcalc "MASK=if(${VECTOR}_${TMPNAME} == $i, 1, null())" 2> /dev/null
#n, min, max, range, mean, stddev, variance, coeff_var, sum
n=`r.univar -g $RASTER | cut -d'=' -f2 | tr '\n' ' ' | cut -d' ' -f1`
min=`r.univar -g $RASTER | cut -d'=' -f2 | tr '\n' ' ' | cut -d' ' -f2`
max=`r.univar -g $RASTER | cut -d'=' -f2 | tr '\n' ' ' | cut -d' ' -f3`
range=`r.univar -g $RASTER | cut -d'=' -f2 | tr '\n' ' ' | cut -d' ' -f4`
mean=`r.univar -g $RASTER | cut -d'=' -f2 | tr '\n' ' ' | cut -d' ' -f5`
stddev=`r.univar -g $RASTER | cut -d'=' -f2 | tr '\n' ' ' | cut -d' ' -f6`
variance=`r.univar -g $RASTER | cut -d'=' -f2 | tr '\n' ' ' | cut -d' ' -f7`
cf_var=`r.univar -g $RASTER | cut -d'=' -f2 | tr '\n' ' ' | cut -d' ' -f8`
sum=`r.univar -g $RASTER | cut -d'=' -f2 | tr '\n' ' ' | cut -d' ' -f9`
a couple of things,
1) r.univar is running 9 times when it only needs to be run once:
eval `r.univar -g $RASTER`
Then $cf_var gets renamed $coeff_var, needs to be carried through.
2) if g.region zoom= respects MASK, we can do:
g.region save=${TMPNAME}_rastres
for i in $CATSLIST ; do
echo "Processing category $i ($CURRNUM/$NUMBER)"
g.remove MASK > /dev/null 2> /dev/null
r.mapcalc "MASK=if(${VECTOR}_${TMPNAME} == $i, 1, null())" 2> /dev/null
+g.region zoom=$RASTER
#n, min, max, range, mean, stddev, variance, coeff_var, sum
eval `r.univar -g $RASTER`
+g.region ${TMPNAME}_rastres
...
done
g.remove region=${TMPNAME}_rastres
but g.region zoom= can take a _long_ time so maybe no advantage/worse?
Would need to check/reset NSRES and EWRES to raster's values or
is that redundant? (what about g.region -a?) Some checking needs
to be done that we're not screwing up the cells.. at minimum
a before/after check to see that the same answer comes out both
ways.
3) rm twice??
cleanup()
{
#restore settings:
g.region region=${TMPNAME}
g.remove region=${TMPNAME} > /dev/null
twice??
4) isn't -p > /dev/null circular?
g.region nsres=$NSRES ewres=$EWRES -ap > /dev/null
5) cleanup should happen before echo "Done."
Hamish
More information about the grass-dev
mailing list