[GRASS5] ps.atlas
Jachym Cepicky
jachym.cepicky at centrum.cz
Mon Jul 11 04:03:14 EDT 2005
Hallo developers,
after some time, I puted together script for making something like
atlas of maps using ps.map.
The script splits the current region into number of columns and rows
and in each field it runs ps.map with defined input configuratin file.
The resulting atlas of maps can be stored in vector file. Desired
overlaping can be also set.
Example result can be seen at
http://les-ejk.cz/~jachym/img/grass/krkonose_prehledka.jpg
[375.04KB]
It would need some testing. It works with GNU bash, version 3.00.16.
Thanks
Jachym
--
Jachym Cepicky
e-mail: jachym.cepicky at centrum.cz
URL: http://les-ejk.cz
GPG: http://les-ejk.cz/gnupg_public_key/
-------------- next part --------------
#!/bin/sh
############################################################################
#
# script: ps.atlas
# author: Jachym Cepicky <jachym.cepicky at centrum.cz>
# description: Makes "atlas of maps" of region for defined number of rows
# and columns
# date: 2005-07-11
# copyright: This program is free software under the GNU General Public
# License (>=v2).
# needs: - sed
# - grep
# - awk
# - bc
# - ps2pdf
#############################################################################
if test "$GISBASE" = ""; then
echo "You must be in GRASS GIS to run this program." >&2
exit 1
fi
#%Module
#% description: Prints atlas of maps with ps.map
#%end
#%option
#% key: input
#% type: string
#% description: Mapfile for ps.map
#% required : yes
#%End
#%option
#% key: output
#% type: string
#% description: Prefix of output files
#% required : yes
#%End
#%option
#% key: rows
#% type: integer
#% description: Number of rows in region
#% required : yes
#% answer: 1
#%End
#%option
#% key: cols
#% type: integer
#% description: Number of columns in region
#% required : yes
#% answer: 1
#%End
#%option
#% key: scale
#% type: string
#% description: Scale of the output map, e.g. 1:25000
#% answer: 1:1
#% required : no
#%End
#%option
#% key: overlap
#% type: integer
#% description: Overlap in map units
#% answer: 0
#% required : no
#%End
#%option
#% key: format
#% type: string
#% description: Format of the paper (a3, a4,...) (for ps2pdfwr).
#% answer: a4
#% required : no
#%End
#%flag
#% key: p
#% description: Create pdf
#%end
#%flag
#% key: v
#% description: Create vector file, which will contain the map boundaries
#%end
#%flag
#% key: r
#% description: Rotate plot
#%End
## parser
if [ "$1" != "@ARGS_PARSED@" ] ; then
exec g.parser "$0" "$@"
fi
# sed
if [ -z "`which sed`" ] ; then
echo "ERROR: Script needs sed."
exit 1
fi
# grep
if [ -z "`which grep`" ] ; then
echo "ERROR: Script needs grep."
exit 1
fi
# awk
if [ -z "`which awk`" ] ; then
echo "ERROR: Script needs awk."
exit 1
fi
# bc
if [ -z "`which bc`" ] ; then
echo "ERROR: Script needs bc."
exit 1
fi
# ps2pdfwr
if [ -z "`which ps2pdfwr`" ] && [ $GIS_FLAG_p -eq 1 ]; then
echo "ERROR: Script needs ps2pdfwr."
exit 1
fi
# input file
if [ ! -e "$GIS_OPT_input" ]; then
echo "ERROR: Input file $GIS_OPT_input does not exist."
exit 1;
fi
## vars
eval `g.gisenv`
: ${GISBASE?} ${GISDBASE?} ${LOCATION_NAME?} ${MAPSET?}
input="$GIS_OPT_input"
out="$GIS_OPT_output"
rows="$GIS_OPT_rows"
cols="$GIS_OPT_cols"
scale="$GIS_OPT_scale"
rotate=""
overlap="$GIS_OPT_overlap"
oldregion="region_$$"
newvector=$out"_atlas"
TMP1="`g.tempfile pid=$$`"
# removing vector, if exists
if [ $GIS_FLAG_v -eq 1 ] && [ "`g.mlist vect |grep $newvector`" != "" ]; then
echo "Vector exists, removing..."
g.remove vect=$newvector
fi
# rotate flag
if [ $GIS_FLAG_r -eq 1 ]; then
rotate="-r";
fi
# informing
echo "ps.map $rotate in=$input out=$out.eps scale=$scale"
# use only hlaf of overlaping
overlap=`echo "$overlap/2"|bc -l`;
#######################################################################
cleanup()
{
g.region $oldregion
rm -f $GISDBASE/$LOCATION_NAME/$MAPSET/windows/$oldregion
rm -f $TMP1
}
# what to do in case of user break:
exitprocedure()
{
echo "User break!"
cleanup
exit 1
}
# shell check for user break (signal list: trap -l)
trap "exitprocedure" 2 3 15
#######################################################################
g.region save=$oldregion
# must be because of awk and non-english locale
export LANG=C
# setign maxeast, maxnorth, maxwest and maxsouth variables with help of g.region
eval `g.region -p|grep '^north\|^east\|^west\|^south'| sed -e s/:\ */=/ | sed -e s/^/max/`;
# be simple ps.map
if [ "$cols" == "" ]; then
cols=1;
fi
if [ "$rows" == "" ]; then
rows=1;
fi
########################################################################
north=$maxnorth;
west=$maxwest;
# size of steps
estep=`echo "($maxeast - $maxwest) / $cols"| bc -l`;
nstep=`echo "($maxnorth - $maxsouth) / $rows"| bc -l`;
# setting first region
south=`echo "($north - $nstep)" |bc -l`;
east=`echo "($west + $estep)" |bc -l`;
# number of region
no_of_region=0;
### ascii file
if [ $GIS_FLAG_v -eq 1 ]; then
echo "Creating ascii file + vector table"
echo -n "ORGANIZATION: GRASS Development Team
DIGIT DATE:
DIGIT NAME: -
MAP NAME: $newvector
MAP DATE: 2005
MAP SCALE: 10000
OTHER INFO: Atlas
ZONE: 0
MAP THRESH: 0.500000
VERTI:
" > $TMP1
### creating database
echo "CREATE TABLE $newvector (cat int, region int);"| db.execute
fi
### rows N-S
while [ `echo $south $maxsouth |awk '{printf("%d", $1 >= $2);}'` == 1 ];
do
echo "north->south" # test
# columns W-E
while [ `echo $east $maxeast |awk '{printf("%d", $1 <= $2);}'` == 1 ];
do
echo "west->east" # test
# overlapping 10% = 5% on both sides
over_north=`echo $north $overlap|awk '{printf("%f", $1+$2);}'`;
over_west=`echo $west $overlap|awk '{printf("%f", $1-$2);}'`;
over_east=`echo $east $overlap|awk '{printf("%f", $1+$2);}'`;
over_south=`echo $south $overlap|awk '{printf("%f", $1-$2);}'`;
east_center=`echo "$over_east+(($over_west)-($over_east))/2" |bc `
north_center=`echo "$over_south+(($over_north)-($over_south))/2" |bc `
g.region n=$over_north s=$over_south w=$over_west e=$over_east;
west=$east
east=`echo "($west + $estep)" |bc -l`;
no_of_region=$(( no_of_region=$no_of_region+1 ))
echo "-------------- REGION NUMBER $no_of_region OF $(( $rows * $cols )) ---------------"
# storing coordinaes to ascii file
if [ $GIS_FLAG_v -eq 1 ]; then
echo "B 5" >> $TMP1
echo "$over_east $over_north" >> $TMP1
echo "$over_east $over_south" >> $TMP1
echo "$over_west $over_south" >> $TMP1
echo "$over_west $over_north" >> $TMP1
echo "$over_east $over_north" >> $TMP1
echo -e "C 1 1\n$east_center $north_center\n1 $no_of_region" >> $TMP1
echo "INSERT INTO $newvector (cat, region) VALUES ($no_of_region,$no_of_region);"|db.execute
fi
#################################################################
# create ps & pdf
#################################################################
ps.map -e $rotate in=$input out=$out$no_of_region.eps scale=$scale
if [ "$GIS_FLAG_p" = "1" ]; then
ps2pdfwr -sPAPERSIZE=$GIS_OPT_format $out$no_of_region.eps
fi
#################################################################
#
#################################################################
done
north=$south
south=`echo "($north - $nstep)" |bc -l`;
# go back to west!
west=$maxwest
east=`echo "($west + $estep)" |bc -l`;
done;
if [ $GIS_FLAG_v -eq 1 ]; then
# import the vector of regions
outtmp="$newvector"_tmp
v.in.ascii in=$TMP1 out=$outtmp format=standard
v.clean tool=break,rmdupl in=$outtmp out=$newvector
g.remove vect=$outtmp
v.db.connect map=$newvector table=$newvector
fi
### cleaning
cleanup
More information about the grass-dev
mailing list