moving raster maps across UTM zone boundaries

Hello fellow GRASS users.

  I've been fortunate in the past to have data sets well within UTM zones.
Unfortunately, that happy period is at an end. I am dealing with county soils
and land use data for Oklahoma which is split between zones 14 and 15. What I
want to do is bring the raster map for a county in zone 15, and patch it with
a raster map in zone 14. I've tried this procedure:

1) used r.poly to convert the zone 15 map to a vector map.
2) used v.out.ascii to convert the grass vector map to ascii.
3) used m.u2ll to convert the ascii vector UTM map to lat.-lon. coordinates
4) used m.ll2u to convert lat-lon. ascii vector map to zone 14 utm coordinates
5) used v.in.ascii to convert new zone14 ascii vector map to grass vector map.

Now, I'm stuck. The manual hints that I should apply v.digit to re-assign
attributes to the vector map before using v.to.rast. BUT, I'm dealing with
_thousands_ of cells. Is there a better way to do this whole process? Or
does anyone have any suggestions? I suspect this question may be posted
frequently, but I only recently began monitoring this discussion. Thanks in
advance for any and all replies.

Sincerely,

Fred L. Ogden
Iowa Institute of Hydraulic Research
The University of Iowa
Iowa City, IA 52242

flogden@hml.uiowa.edu

flogden@hml.uiowa.edu (Fred Ogden) writes:

Hello fellow GRASS users.

I've been fortunate in the past to have data sets well within UTM zones.
Unfortunately, that happy period is at an end. I am dealing with county soils
and land use data for Oklahoma which is split between zones 14 and 15. What I
want to do is bring the raster map for a county in zone 15, and patch it with
a raster map in zone 14.

[.....]

Fred L. Ogden
Iowa Institute of Hydraulic Research
The University of Iowa
Iowa City, IA 52242

flogden@hml.uiowa.edu

I checked my archives, because I recalled dealing with this before.
Here is a shellscript that was kindly sent to me by Scott Wade some
time ago. I think it will help you with your task...

Chris Rewerts

---------------------------8<-------------------------------
#!/bin/sh

# UTM ZONE TRANSFORMATION SCRIPT FOR GRASS VECTOR DATA
#
# This Bourne shell script, for use in GRASS4.0, transforms GRASS
# vector data from one UTM zone to another. This would typically be
# needed where a location straddles the boundary between two UTM zones.
# For the entire data set in the location to be sensible, one of the
# zones needs to be 'extended' to encompass all of the available data.
#
# All dig and dig_ascii vector data in the current mapset search path
# (not just the current mapset) can potentially be transformed. All
# results are stored as binary dig layers in the current mapset.
#
# The script is loosely based on a GRASS3 C-shell script written by Kenn
# Gardels, University of California, Berkeley. His reference: Department
# of the Army (1973), "Universal Transverse Mercator Grid Technical Manual",
# TM 5-241-8.
#
# This script was written in June 1992 by Scott Wade, Spatial Analysis and
# Systems Team, US Army Corps of Engineers Construction Engineering Research
# Laboratories [ wade@zorro.cecer.army.mil ].
#
# WARNING: This script has not been extensively tested.
# WARNING: The Clarke 1866 spheroid is assumed.

#######################################################################
# Determine if GRASS is being used

if [ ! "$GISBASE" ]
  then
  echo ""
  echo "ERROR: must be in GRASS to use `basename $0`"
  echo ""
  exit
fi

#######################################################################
# Request needed information from user

echo ""
echo -n "Enter old UTM zone (zone to be converted FROM): "
read OLDZONE
echo ""
if [ "$OLDZONE" -lt "1" -o "$OLDZONE" -gt "60" ]
  then
  echo "ERROR: invalid UTM zone: $OLDZONE"
  echo ""
  exit
fi

echo -n "Enter new UTM zone (zone to be converted TO): "
read NEWZONE
echo ""
if [ "$NEWZONE" -lt "1" -o "$NEWZONE" -gt "60" ]
  then
  echo "ERROR: invalid UTM zone: $NEWZONE"
  echo ""
  exit
fi
if [ "$NEWZONE" -eq "$OLDZONE" ]
  then
  echo "New zone same as old zone; no tranformation performed."
  echo ""
  exit
fi

echo "Enter layer(s) to be converted from zone $OLDZONE to zone $NEWZONE,"
echo "separated by spaces."
echo ""
echo -n "> "
read THELAYERS
echo ""

if [ "$THELAYERS" = "" ]
  then
  exit
fi

# Beginning of loop

for LAYER in $THELAYERS
do

#######################################################################
# Search for the dig_ascii file in the current mapset search path.
# If not found, seaarch for the dig layer. If neither are found,
# move on to the next named layer.
# The use of g.findfile and eval sets the variables $file and $mapset.

  eval `g.findfile element=dig_ascii file=$LAYER`

  if [ "$file" ]
    then
    DOIT=ASCII
  else
    eval `g.findfile element=dig file=$LAYER`

    if [ "$file" ]
      then
      DOIT=binary

#######################################################################
# If needed, convert old zone binary dig data to old zone dig_ascii file

      v.out.ascii input=$LAYER output=$LAYER.old

    else
      DOIT=n
      echo ""
      echo "ERROR: layer $LAYER"
      echo "Neither dig nor dig_ascii file found in current mapset search path."
      echo ""
    fi

  fi

  if [ "$DOIT" = "ASCII" -o "$DOIT" = "binary" ]
    then
    echo ""
    echo -n "Converting $DOIT $LAYER to binary $LAYER.shift ..."

#######################################################################
# Convert old zone UTM ASCII data to old zone lat/long ASCII data.
# Lat/long is used as a 'data standard' for the transformation.
# The old-zone data is exported to lat/long, then later imported
# back into UTM using the new zone.

    if [ "$DOIT" = "binary" ]
      then
      m.u2ll -r spheroid=clark66 zone=$OLDZONE input=$LOCATION/dig_ascii/$LAYER.old output=$LOCATION/dig_ascii/$LAYER.ll
    else
      m.u2ll -r spheroid=clark66 zone=$OLDZONE input=$LOCATION/dig_ascii/$LAYER output=$LOCATION/dig_ascii/$LAYER.ll
    fi

    if [ $? -ne 0 ]
      then
      echo ""
      echo "Problem using m.u2ll for layer $LAYER"
      echo ""
      exit
    fi

    echo -n "..."

# remove unneeded file

    if [ -f "$LOCATION/dig_ascii/$LAYER.old" ]
      then
      rm $LOCATION/dig_ascii/$LAYER.old
    fi
    echo -n "..."

#######################################################################
# Convert old zone lat/long ASCII data to new zone UTM dig_ascii data.
# The lat/long data is imported back into UTM using the new zone, so
# this is where the zone transformation occurs for the vector data.

    m.ll2u -rz spheroid=clark66 zone=$NEWZONE input=$LOCATION/dig_ascii/$LAYER.ll output=$LOCATION/dig_ascii/$LAYER.shift

    if [ $? -ne 0 ]
      then
      echo ""
      echo "Problem using m.ll2u for layer $LAYER"
      echo ""
      exit
   fi

    echo -n "..."

# remove unneeded file

    if [ -f "$LOCATION/dig_ascii/$LAYER.ll" ]
      then
      rm $LOCATION/dig_ascii/$LAYER.ll
    fi
    echo -n "..."

#######################################################################
# Convert new zone UTM dig_ascii data to new zone binary dig data

    v.in.ascii input=$LAYER.shift output=$LAYER.shift

    if [ $? -ne 0 ]
      then
      echo ""
      echo "Problem using v.in.ascii for layer $LAYER.shift"
      echo ""
      exit
    fi

    echo -n "..."

# remove unneeded file

    if [ -f "$LOCATION/dig_ascii/$LAYER.shift" ]
      then
      rm $LOCATION/dig_ascii/$LAYER.shift
    fi
    echo -n "..."

#######################################################################
# Convert dig_att data to new zone

# The old dig_att file is rearranged using AWK so that the GRASS commands
# m.u2ll and m.ll2u will work properly and still preserve all the needed
# data in the file. AWK is used again to rearrange the results into the
# correct dig_att form. The variable $mapset is set by g.findfile and
# eval earlier in the script.

    if [ -f "$LOCATION/../$mapset/dig_att/$LAYER" ]
      then
      cat $LOCATION/../$mapset/dig_att/$LAYER | awk '{ printf "%14s %14s %11s %1s\n", $2, $3, $4, $1 }' | m.u2ll sph=clark66 zone=$OLDZONE | m.ll2u -z sph=clark66 zone=$NEWZONE | awk '{ printf "%1s %14s %14s %11s\n", $4, $1, $2, $3 }' > $LOCATION/dig_att/$LAYER.shift
    else
      echo ""
      echo "WARNING: no attribute data for $LAYER"
      echo ""
    fi

#######################################################################
# Copy dig_cats data to new name

  if [ -f "$LOCATION/../$mapset/dig_cats/$LAYER" ]
    then
    if [ ! -d "$LOCATION/dig_cats" ]
      then
      mkdir $LOCATION/dig_cats
    fi
    cp $LOCATION/../$mapset/dig_cats/$LAYER $LOCATION/dig_cats/$LAYER.shift
  fi

#######################################################################
# Run v.support for the newly transformed data layer

    v.support -r map=$LAYER.shift option=build

  fi

done