Distance analysis

Hello,

I've been searching the grass users archives for scripts that have to do with
distance analysis. So far I have not found any.

I want to write a script that would return the shortest distance from a specificparcel of land to a specific landuse class e.g. urban land.

r.cost seemed like a good place but if someone out there has some experience
wih this I would like to hear from you.

Thanks in advance.

Bill Jackson

I wrote a little script (r.distance.sh) last year that makes something
that is close to this. I used r.buffer on a clump map (produced by
r.clump). Maybe you could start with this script and modify it for your
needs. This scripts lets the user point on two clumps and then the
scripts computes the shortest distance between those.
The script is included in the end of this message. Please let me know
if you come up with some bright idea concening this. I am allways
interested to see new scritps if you write any concerning this.
I guess you could include the r.clump operation in your script, display
the cateogory map and compute distances on the clump map.

Lars

Lars Schylberg Email: larss@fmi.kth.se
Dept. of Geodesy and Photogrammetry
Royal Institute of Technology (KTH) Tel. +46 8 790 86 33
S-100 44 STOCKHOLM, SWEDEN Fax. +46 8 790 66 10

I've been searching the grass users archives for scripts that have to do with
distance analysis. So far I have not found any.

I want to write a script that would return the shortest distance
from a specificparcel of land to a specific landuse class e.g. urban
land.

r.cost seemed like a good place but if someone out there has some experience
wih this I would like to hear from you.

Thanks in advance.

Bill Jackson

#!/bin/sh
#
# r.distance.sh
#
# Author: Lars Schylberg (larss@fmi.kth.se) 921019
#
#--------------------------------------------------------------------------
# Check if GRASS is running
#
test "$GISRC" || echo "GRASS is not running" || exit 2
#----------------------------------------------------------------------------
#
# Evaluate arguments
#
if [ $# != 1 ]
then
    echo
    echo Usage: `basename $0`
    echo ' clumpmap=mapname '
    echo
    exit 1
fi
#
# parse input arguments
#
for i do
  case $i in
    clumpmap=*)
      CLUM=`echo $i | sed s/clumpmap=//` ;;
    clum=*)
      CLUM=`echo $i | sed s/clum=//` ;;
    c=*)
      CLUM=`echo $i | sed s/c=//` ;;
    *)
      echo ""
      echo "Unrecognized option: $i"
      echo 'Options: clumpmap=mapname '
                        echo
      exit 1
  esac
done
#-----------------------------------------------------------------------
#
# Check the input arguments
#
eval `g.findfile element=cell file=$CLUM`
if [ ! "$file" ]
then
    echo "$CLUM - clump cell file not found"
    exit 2
fi
#
#---------------------------------------------------------------------
#
# Show category map
#
d.rast $CLUM
#
# retrieve the two objects by pointing with cursor
#
echo
echo "POINT WITH CURSOR ON THE FIRST OBJECT"
#
d.what.rast -1t map=$CLUM > stat
#
obj1=`cat stat | sed -n '3p' | awk -f: '{print $2}'`
#
#
echo
echo "Object 1 has object number $obj1"
echo
echo "POINT WITH CURSOR ON THE SECOND OBJECT"
#
d.what.rast -1t map=$CLUM > stat
#
obj2=`cat stat | sed -n '3p' | awk -f: '{print $2}'`
#
#
echo
echo "Object 2 has object number $obj2"
echo
/bin/rm stat
#
# Determine clostest distance between the two objects
#
echo "$obj1 = 1" | r.reclass input=$CLUM output=obj1
echo "$obj2 = 1" | r.reclass input=$CLUM output=obj2

MAX_DISTANCE=200

ZONES=`echo $MAX_DISTANCE | awk 'BEGIN { printf "5"}
                          { for (i=10; i<=$1; i+=5) printf ",%d", i }'`

r.buffer input=obj1 output=zones dis=$ZONES 2>&1

r.cats map=zones fs=space | sed '1,2d' | awk '{ print $1"="$2 }' > rcrule1

cat rcrule1 | r.reclass input=zones output=dist 2>&1

DIST=`r.stats -q input=obj2,dist | \
      awk '{ if ( $1 == 1 && $2 > 0 ) print $2 }' | sed -n '1p'`

echo 'distance = '$DIST

g.remove rast=obj1,obj2,zones 2>&1