[GRASS-user] Raster kml export script?

David Finlayson david.p.finlayson at gmail.com
Thu Jan 3 18:36:48 EST 2008


I have attached a script that almost works.

The problem I am having is that I can't create a PNG file EXACTLY the
same size as the region. I know I could export the raster as a GeoTiff
and get an accurate bounding box, but I would lose transparency.

Can anyone give me a hand in fixing the bounding box of the PNG to be
the same size as the region?

Here is the script

>>>> script starts <<<<

#!/bin/bash
############################################################################
#
# MODULE:       r.out.kml
# AUTHOR(S):    David Finlayson, 2008
#               david.p.finlayson at gmail.com
#
# PURPOSE:	    Create a skeleton kml file from a raster map.
#
# COPYRIGHT:	(C) 2007 by the GRASS Development Team
#
#		This program is free software under the GNU General Public
#		License (>=v2). Read the file COPYING that comes with GRASS
#		for details.
#
#############################################################################
#
# January 2008 - First version of the script posted to GRASS

#%Module
#%  description: creates a kml file from a GRASS raster
#%End
#%flag
#%  key: l
#%  description: add legend icon to kml
#%end
#%option
#% key: input
#% type: string
#% gisprompt: old,cell,raster
#% description: Name of input raster
#% required : yes
#%end
#%option
#% key: output
#% type: string
#% description: Name of output kml file
#% required : yes
#%end

# Constants (hard to guess what will work best)
LEGEND_WIDTH=500
LEGEND_HEIGHT=500

# Check that we are in GRASS
if [ -z "$GISBASE" ] ; then
    echo "You must be in GRASS GIS to run this program." 1>&2
    exit 1
fi

# Run g.parser
if [ "$1" != "@ARGS_PARSED@" ] ; then
  PARSER=`which g.parser`
  exec $PARSER "$0" "$@"
fi

# Check that this is a geographic projection (required by Google Earth)
PROJECTION=`g.proj -p | grep "name" | sed "s/\ //g" | cut -c6-`
if [ "$PROJECTION" != "Latitude-Longitude" ] ; then
    echo "r.out.kml: error: export only works from a
Latitude-Longitude location"
    exit 1
fi

# Check that this is a WGS84 datum
DATUM=`g.proj -d | grep "datum code: wgs84" | cut -d: -f2`
if [ "$DATUM" != " wgs84" ] ; then
    echo "r.out.kml: error: export only works from a WGS84 datum location"
    exit 1
fi

# Store current environment
g.region rast=$GIS_OPT_INPUT
OLD_GRASS_WIDTH=$GRASS_WIDTH
OLD_GRASS_HEIGHT=$GRASS_HEIGHT
OLD_GRASS_PNGFILE=$GRASS_PNGFILE
OLD_GRASS_TRANSPARENT=$GRASS_TRANSPARENT
OLD_GRASS_TRUECOLOR=$GRASS_TRUECOLOR

# define the driver settings
export GRASS_WIDTH=`g.region -g | grep "cols" | cut -d= -f2`
export GRASS_HEIGHT=`g.region -g | grep "rows" | cut -d= -f2`
export GRASS_PNGFILE=${GIS_OPT_OUTPUT}.png
export GRASS_TRANSPARENT=TRUE
export GRASS_TRUECOLOR=TRUE

# draw the raster
if [ -n "$GIS_OPT_INPUT" ] ; then
    d.mon start=PNG
    d.mon select=PNG
    d.rast -o $GIS_OPT_INPUT
    d.mon stop=PNG
fi

# draw the legend (if requested)
if [ $GIS_FLAG_L -eq 1 ] ; then
    export GRASS_WIDTH=$LEGEND_WIDTH
    export GRASS_HEIGHT=$LEGEND_HEIGHT
    export GRASS_PNGFILE=${GIS_OPT_OUTPUT}_legend.png
    d.mon start=PNG
    d.mon select=PNG
    d.legend -s map=$GIS_OPT_INPUT
    d.mon stop=PNG
fi

# Create the kml file
TITLE=`r.info -m $GIS_OPT_INPUT | cut -d= -f2`
NORTH=`g.region -g | grep -m1 "n=" | cut -d= -f2`
SOUTH=`g.region -g | grep -m1 "s=" | cut -d= -f2`
EAST=`g.region -g | grep -m1 "e=" | cut -d= -f2`
WEST=`g.region -g | grep -m1 "w=" | cut -d= -f2`

echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > ${GIS_OPT_OUTPUT}.kml
echo "<kml xmlns=\"http://earth.google.com/kml/2.2\">" >> ${GIS_OPT_OUTPUT}.kml
echo "<Folder>" >> ${GIS_OPT_OUTPUT}.kml
echo "<name>$TITLE</name>" >> ${GIS_OPT_OUTPUT}.kml
echo "<description>$TITLE</description>" >> ${GIS_OPT_OUTPUT}.kml
echo "<GroundOverlay>" >> ${GIS_OPT_OUTPUT}.kml
echo "<name>$TITLE</name>" >> ${GIS_OPT_OUTPUT}.kml
echo "<description>Enter Description Here</description>" >>
${GIS_OPT_OUTPUT}.kml
echo "<Icon>" >> ${GIS_OPT_OUTPUT}.kml
echo "<href>${GIS_OPT_OUTPUT}.png</href>" >> ${GIS_OPT_OUTPUT}.kml
echo "</Icon>" >> ${GIS_OPT_OUTPUT}.kml
echo "<LatLonBox>" >> ${GIS_OPT_OUTPUT}.kml
echo "<north>$NORTH</north>" >> ${GIS_OPT_OUTPUT}.kml
echo "<south>$SOUTH</south>" >> ${GIS_OPT_OUTPUT}.kml
echo "<east>$EAST</east>" >> ${GIS_OPT_OUTPUT}.kml
echo "<west>$WEST</west>" >> ${GIS_OPT_OUTPUT}.kml
echo "<rotation>0.0</rotation>" >> ${GIS_OPT_OUTPUT}.kml
echo "</LatLonBox>"  >> ${GIS_OPT_OUTPUT}.kml
echo "</GroundOverlay>"  >> ${GIS_OPT_OUTPUT}.kml
echo "</Folder>"  >> ${GIS_OPT_OUTPUT}.kml
echo "</kml>"  >> ${GIS_OPT_OUTPUT}.kml

# Restore the environment
export GRASS_WIDTH=$OLD_GRASS_WIDTH
export GRASS_HEIGHT=$OLD_GRASS_HEIGHT
export GRASS_PNGFILE=$OLD_GRASS_PNGFILE
export GRASS_TRANSPARENT=$OLD_GRASS_TRANSPARENT
export GRASS_TRUECOLOR=$OLD_GRASS_TRUECOLOR

>>>> script ends <<<<

On Dec 30, 2007 7:12 AM, Markus Neteler <neteler at osgeo.org> wrote:
> On Dec 22, 2007 6:48 AM, David Finlayson <david.p.finlayson at gmail.com> wrote:
> > Before I write one myself, I was wondering if anyone has a handy
> > export script to convert a GRASS raster to kml?
>
> I would be also interested.
>
> > By the way, what happened to all of the scripts on the Wiki? There
> > used to be a page with several good scripts there.
>
> Several URLs fixed:
> http://grass.gdf-hannover.de/wiki/GRASS_AddOns
>
> Markus
> _______________________________________________
> grass-user mailing list
> grass-user at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/grass-user
>



-- 
David Finlayson, Ph.D.
Operational Geologist

U.S. Geological Survey
Pacific Science Center
400 Natural Bridges Drive
Santa Cruz, CA  95060, USA

Tel: 831-427-4757, Fax: 831-427-4748, E-mail: dfinlayson at usgs.gov


More information about the grass-user mailing list