"Automatic" Zoom
Lars Schylberg
larss at fmi.kth.se
Fri Feb 4 02:50:17 EST 1994
> Hi people,
> I need a function, a tool or something else, that allows me to restrict
> a region only where there are significant data (i.e. not zero!), without
> use d.zoom utility or interactive tools.
>
> Thank you in advance for any suggestion.
>
> -- FRY.
I wrote a little script a couple years ago, that zooms in around specified
categories. Maybe you can get some ideas from this script. In my case the
significant data is the categories that I specify.
Lars
Lars Schylberg Email: lasc at celsiustech.se
CelsiusTech Systems AB or: larss at fmi.kth.se
S-175 88 Jarfalla Tel. +46 8 580 847 03
Sweden Fax. +46 8 580 872 59
------------------------------------------------------------------
r.zoom_cats.sh
------------------------------------------------------------------
#!/bin/sh
#
# r.zoom_cats.sh
#
# Zoom the region setting so that the region have one or a specified
# number of cells free around the max and min coordinates of one or
# several categories.
#
# It's useful for zooming in on one category or many category areas
# that has been creted with the r.clump program for local processing
# of that area.
#
# Author: Lars Schylberg
# email: larss at fmi.kth.se
#
# Date: 920304
#
#------------------------------------------------------------------------
# Check if GRASS is running
#
test "$GISRC" || echo "GRASS is not running" || exit 2
#----------------------------------------------------------------------------
#
# Evaluate arguments
#
if [ $# != 4 ]
then
echo
echo Usage: `basename $0`
echo ' input=mapname '
echo ' cats=cat[,cat,cat] '
echo ' border=cells '
echo ' visual=yes|no'
echo
echo ' This program zooms the region around the max and min'
echo ' coordinates of one or several category values '
echo
exit 1
fi
# Parse input arguments
for i do
case $i in
input=*)
IN=`echo $i | sed s/input=//` ;;
in=*)
IN=`echo $i | sed s/in=//` ;;
i=*)
IN=`echo $i | sed s/i=//` ;;
cats=*)
CATS=`echo $i | sed s/cats=//` ;;
c=*)
CATS=`echo $i | sed s/c=//` ;;
border=*)
BORDER=`echo $i | sed s/border=//` ;;
b=*)
BORDER=`echo $i | sed s/b=//` ;;
visual=*)
VIS=`echo $i | sed s/visual=//` ;;
vis=*)
VIS=`echo $i | sed s/vis=//` ;;
v=*)
VIS=`echo $i | sed s/v=//` ;;
*)
echo ""
echo "Unrecognized option: $i"
echo 'Options: input=mapname '
echo ' cats=cat[,cat,cat] '
echo ' border=cells '
echo ' visual=yes|no '
exit 1
esac
done
#-------------------------------------------------------------------------
# Check the input arguments
eval `g.findfile element=cell file=$IN`
if [ ! "$file" ]
then
echo "$IN - cell file not found"
exit 2
fi
TMP=/tmp/.`basename $0`.$$
DUMMY=/tmp/dummy.$$
RCRULE=/tmp/rcrule.`basename $0`.$$
if test -f $RCRULE
then
/bin/rm $RCRULE
fi
touch $RCRULE
for i in `echo $CATS | awk -F, '{ for (i=1; i<=NF; i++) print $i }'`
do
echo $i' = 1' >> $RCRULE
done
cat $RCRULE | r.reclass input=$IN output=OBJ.cell
/bin/rm $RCRULE
# Get the categories max and min coordinates
g.region rast=OBJ.cell zoom=OBJ.cell
g.region -p | sed "s/\..*//" > $TMP
g.remove rast=OBJ.cell >> $DUMMY
N=`grep north $TMP | sed "s/[^0-9]*//"`
S=`grep south $TMP | sed "s/[^0-9]*//"`
E=`grep east $TMP | sed "s/[^0-9]*//"`
W=`grep west $TMP | sed "s/[^0-9]*//"`
/bin/rm $TMP
# Determine current resolution to place
# a n pixel border around the categories
g.region -p | sed "s/\..*//" > $TMP
NSRES=`grep nsres $TMP | sed "s/[^0-9]*//"`
EWRES=`grep ewres $TMP | sed "s/[^0-9]*//"`
/bin/rm $TMP
NSBORDER=`expr $NSRES \* $BORDER`
EWBORDER=`expr $EWRES \* $BORDER`
north=`expr $N + $NSBORDER`
south=`expr $S - $NSBORDER`
east=`expr $E + $EWBORDER`
west=`expr $W - $EWBORDER`
# Check that the new region not is
# outside the default region
g.region -dp | sed "s/\..*//" > $TMP
DN=`grep north $TMP | sed "s/[^0-9]*//"`
DS=`grep south $TMP | sed "s/[^0-9]*//"`
DE=`grep east $TMP | sed "s/[^0-9]*//"`
DW=`grep west $TMP | sed "s/[^0-9]*//"`
/bin/rm $TMP
if [ $north -gt $DN ]; then
north=$DN
fi
if [ $south -lt $DS ]; then
south=$DS
fi
if [ $east -gt $DE ]; then
east=$DE
fi
if [ $west -lt $DW ]; then
west=$DW
fi
# Set the new region
g.region n=$north s=$south e=$east w=$west nsres=$NSRES ewres=$EWRES
#
if [ $VIS = yes ] ; then
d.erase
d.rast $IN
fi
# Clean up
/bin/rm $DUMMY
More information about the grass-user
mailing list