GRASS GIS For Geomorphologists: An Introductory Guide: Andrew Wickert April 16, 2012
GRASS GIS For Geomorphologists: An Introductory Guide: Andrew Wickert April 16, 2012
GRASS GIS For Geomorphologists: An Introductory Guide: Andrew Wickert April 16, 2012
An Introductory Guide
Andrew Wickert
1 Introduction 7
1.1 GIS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2 What is GRASS? . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.2.1 GRASS Interfaces . . . . . . . . . . . . . . . . . . . . . . 8
1.2.2 Topology . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2.3 File structure . . . . . . . . . . . . . . . . . . . . . . . . . 9
3
4 CONTENTS
9 Wrap-up 65
9.1 Thoughts from the Author . . . . . . . . . . . . . . . . . . . . . . 65
9.2 Useful Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
9.3 Future Plans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
9.4 Contact Information . . . . . . . . . . . . . . . . . . . . . . . . . 66
Boxes
Notes
Original draft nished 22 December 2011
License
5
6 BOXES
Chapter 1
Introduction
1.1 GIS
Most of you are probably familiar with GIS, and some of you probably use
it very often. But for those of you who don't, GIS stands for "Geographical
Information System". It is a software / programming language that is designed
to work with data that are displayed spatiallyin x,y,z or lat/lon,z coordinates.
Geospatial data take two main forms. Raster data are regularly-spaced
Cartesian grids. Vector data are specied by sets of ungridded x,y,z points
that do not necessarily coincide with the position and spacing of raster grids.
These can include points, lines, and areas. Raster and vector data types can be
used in three dimensions as well, with three dimensional grids and the addition
of volume-lling vector elements. The most common geomorphic raster is the
digital elevation model (DEM); other common rasters are classied land-use
maps and remotely sensed imagery: in general, they represent the intensity of
some value across the whole region of interest. Common examples of vector data
in geomorphology are river channels (lines), lakes (areas), and sample locations
(points).
GIS packages contain a number of tools to work with raster and vector
data, make calculations based on them, perform le input/output, reproject
data from one coordinate system to another, manage databases of georeferenced
information, and create human-readable maps to display the data that the GIS
package stores and processes.
Some reasons that geomorphologists use GIS are to:
1. Build maps
7
8 CHAPTER 1. INTRODUCTION
10
5. Calculate regional values, such as insolation and Be production rates
Why GRASS?
I use GRASS because it is cross-platform (I am much more comfortable
on UNIX-like systems than on Windows); it is very good at hydrologic
analyses; it is very scriptable for easy batch processing, sharing of
reproducible analyses, and geospatial integration of numerical models; it
is open-source (so I can change components to t my needs), and because
I can share my work with anyone from around the world without being
tied down to expensive software.
1.2.2 Topology
A major feature of GRASS is that it is a topological GIS. That is, it is impossible
to have small gaps or overlaps between vector areas (or polygons). It also forces
lines to meet and interact according to some fairly logical rules. This helps for
consistency in geologic mapping and allows users to queery vector maps based
on their neighbors.
Type your password, press "y" for yes, and wait as the computer installs the
program and its dependencies.
2.2 Mac OS X
(Written after installing GRASS for Mac OS 10.6: Snow Leopard)
11
12 CHAPTER 2. DOWNLOADING AND INSTALLING GRASS
Apple computers come with pre-installed python, but this is often out-of-
date because of the 1-2 year Apple release cycle. So go to:
http://www.python.org/download/releases/
and click on the highest Python 2.X you can nd. Then scroll down to "Mac
OS X 64-bit/32-bit x86-64/i386 Installer" (under "Download"). As of the time
of writing, the highest 2.X version of Python is 2.7.2, and a direct link to that is:
http://www.python.org/ftp/python/2.7.2/python-2.7.2-macosx10.6.dmg
http://www.kyngchaos.com/software/unixport/grass. This
Now, go to
http://grass.osgeo.org/grass64/
is the bottom link on your current page,
binary/macosx/. This gives you the instructions to install GRASS and the
required "frameworks packages". These are listed in the order in which they
should be installed. Click on one of the frameworks packages or go directly
to: http://www.kyngchaos.com/software/frameworks to download the .dmg
les and install them.
As of the time of writing, these are direct links in the order that they should
be installed for Mac OS 10.6 "Snow Leopard":
GDAL:
http://www.kyngchaos.com/files/software/frameworks/PROJ_Framework-4.
7.0-2-snow.dmg
Free Type:
http://www.kyngchaos.com/files/software/frameworks/FreeType_Framework-2.
4.6-1-snow.dmg
cairo:
http://www.kyngchaos.com/files/software/frameworks/cairo_Framework-1.
10.2-3a-snow.dmg
You may also download the R programming language for statistics, but I
won't be using it here.
Once all of these frameworks packages have been installed, you are ready to
download and install GRASS. The links are given on the GRASS mac page,
http://www.kyngchaos.com/software/unixport/grass. The URL for the
download for Mac OS 10.6 is:
http://www.kyngchaos.com/files/software/grass/GRASS-6.4.1-5-Snow.dmg
2.3. WINDOWS 7 13
2.3 Windows 7
There are two ways you can install GRASS in Windows. The rst, the "Native
Install", is very easy and runs "out-of-the-box". This is sucient for the exer-
cises that we will work here. However, it is incompatible with scripting in Bash
to create reusable sets of code for repeating certain processes and analyses. (I
think that the standard Windows GRASS should work ne with Python script-
ing, but I haven't tested this.) For running Bash scripts, you need to install the
UNIX oriented version of GRASS.
The instructions on the following pages assume that you are running an
Unix-like system, so you may have to make some changes if you are running
Windows... I'm not entirely sure what those might be though, other than need-
ing to enter commands in the GRASS command prompt instead of in either this
command prompt or the terminal...
http://grass.osgeo.org/grass64/binary/mswindows/native/
To download GRASS, click the link under "Installing GRASS" on that web
page, or go directly to this URL:
http://grass.osgeo.org/grass64/binary/mswindows/native/WinGRASS-6.
4.2RC2-1-Setup.exe
will need to download and install the Cygwin package and then install GRASS.
For the most part, you can follow the instructions on:
http://grass.osgeo.org/grass64/binary/mswindows/cygwin/
When you get to Part 2: GRASS GIS installation, step 4, the install le is
the grass-6.4.0* le that you can see at the top of the page and will need to
download.
In the "To start GRASS" instructions, you will want to use the new wx-
python GUI: instead of typing:
grass64 -tcltk
Type:
grass64 -wx
Chapter 3
grass64 -wx
There must be a way to start it in the command line on Mac, but I haven't been
able to make a Mac know where its programs are (whichgrass and whichgrass64
turn up blanks).
If you click on the icon, check if your operating system also opens a terminal
window. GRASS has an internal terminal, but I prefer the to use the system
default one. (You, of course, are welcome to use either.)
Don't worry if you aren't used to using the command prompt: all of the
GRASS commands have a very consistent structure and good documentation,
and we will discuss those in depth later.
15
16 CHAPTER 3. STARTING GRASS AND CREATING A LOCATION
MAPSET=PERMANENT
# Then set the database
db.connect driver=sqlite database='$GISDBASE/$LOCATION_NAME/$MAPSET/sqlite.db'
db.connect -p
Figure 3.1: GRASS GIS start-up screen on Ubuntu. If you have just in-
stalled GRASS, you will have no project locations or mapsets, and your Create
mapset, Rename mapset, and Start GRASS buttons will be grayed out.
There is a reason and a big advantage to this initial set-up step. GRASS in-
ternally manages its le structure, and keeps all of its data inside subdirectories
of this directory. So long as you don't add and delete les from this directory
outside of GRASS (unless you really know what you are doing), this keeps ev-
erything very well organized: I have never had to mess with any of this. A
big advantage of this internal organization is that your GRASS directories are
portable: just copy/paste the entire GRASS directory or location folder, and it
will be properly set up on another machine without any of those painful broken
links to data les.
18 CHAPTER 3. STARTING GRASS AND CREATING A LOCATION
Figure 3.3: We will be using the metadata with the Gordon Gulch LiDAR le
to georeference our map, though you can do this in many ways.
Figure 3.4: We will be using the metadata with the Gordon Gulch LiDAR le
to georeference our map, though you can do this in many ways.
20 CHAPTER 3. STARTING GRASS AND CREATING A LOCATION
Figure 3.5: You can click no, since the Gordon Gulck LiDAR metadata have
already properly set the computational region, which is the window that covers
the portion of the map of interest at the provided resolution. (Click yes to see
the parameters that can be set, but don't change them.)
Figure 3.6: If you click yes to edit the region (see Figure 3.5), you will get a
screen like this.
3.4. STARTING A GRASS GIS SESSION 21
Figure 3.7: Back at the start window, but all set to go.
22 CHAPTER 3. STARTING GRASS AND CREATING A LOCATION
Figure 3.8: The graphical user interface (GUI) windows in Mac OS. The right-
hand window is the layer manager that is the main graphical interface for
GRASS. The left-hand window is the map display.
The cd command changes directory. The ls command lists the les in the
directory. (On Windows this second command is dir.) The text after the ls
command is the list of les in my DEM directory: if this looks like what you
have, then you are in the right place.
The command that you will be using is r.in.gdal, which imports raster data
from any of the common GDAL formats (a GIS standard). Start by typing:
r.in.gdal help
This brings up a brief manual for that command that should look something
like:
Description:
Import GDAL supported raster file into a binary raster map layer.
Keywords:
raster, import
Usage:
r.in.gdal [-oeflk] [input=name] [output=name] [band=value]
[memory=value] [target=string] [title="phrase"] [location=string]
23
24 CHAPTER 4. BASIC RASTER DISPLAY AND REGION OPERATIONS
Flags:
-o Override projection (use location's projection)
-e Extend location extents based on new dataset
-f List supported formats and exit
-l Force Lat/Lon maps to fit into geographic coordinates (90N,S; 180E,W)
-k Keep band numbers instead of using band color names
--o Allow output files to overwrite existing files
--v Verbose module output
--q Quiet module output
Parameters:
input Raster file to be imported
output Name for output raster map
band Band to select (default is all bands)
memory Cache size (MiB)
target Name of location to read projection from for GCPs transformation
title Title for resultant raster map
location Name for new location to create
Help!
Typing help after any command gives a summary of what it does and
how it should be used. I have been using GRASS for a long time, and
I still do this fairly frequently to make sure that I am using commands
correctly, especially when I am working in an interactive session. GRASS
has a lot of features, and it can be hard to remember all of the options
for all of them!
This command starts with r because it operates on rasters. GRASS uses
these X. beginnings of commands to help dierentiate the types of data on
which they operate.
4.2. VIEWING AND SETTING THE REGION 25
tmp = "testing"
d.mon x0 # open display monitor
d.rast $tmp # display "testing" raster, if it exists
d.out.file -t format=png output=$tmp_file # outputs "testing_file.png" -->
d.out.file adds the extension
Flags with one hyphen can be combined (e.g., -g -n = -gn), and I typically
put these before the main commands. I typcally put ags with two hyphens
after commands; the most commonly-used of these is the overwrite ag, o. If
this ag is not set, les will not be overwritten.
This command gives information on the projection type, region boundaries, and
resolution. The current (and default) region is the entire area dened by the
Gordon Gulch raster that you used to dene the coordinate system. If you
change the region and want to bring it back to this full extent and original
resolution, type:
This sets the region to the resolution and edges of the raster topo.
Note that this command starts with a g. These are the general utilities,
used for copying data sets, moving them, setting projections, and other general-
purpose commands.
When you run these commands, you should have a window appear that looks
like Figure 4.1.
Figure 4.1: A colorized digital elevation model (DEM) of Gordon Gulch in the
Boulder Creek Critical Zone Observatory.
We can show the shaded relief map using the GUI. Add the shaded relief map
to the layer manager below the topo DEM. Then right-click on topo and select
change opacity level. This cannot be done using the command line in GRASS
6.4 (the command line graphics gets an overhaul in the upcoming GRASS 7.0).
I like 3040% opacity on the DEM that overlays the shaded relief map.
Now you have a pretty map that combines a DEM with shaded relief to give
a good sense of what the topography looks like (Figure 4.3). If you feel really
proud of your map, you can click the export image button on the toolbar and
save it to a le.
Figure 4.2: Displaying raster data in the GUI. Note that the command line
command is printed in the lower-left corner. A good way to learn how to script
in GRASS is to use the graphical interface and read how what you do graphically
relates to what you would type at the command prompt.
4.3. DISPLAYING RASTER DATA 29
# This creates a RGB triplet for the shaded relief map that you can display
d.mon x0
d.rgb r=colored_shaded_relief.r g=colored_shaded_relief.g b=colored_shaded_relief
.b
# We can use commands to add a title and other nifty features too!
# d.title is used to display the map title and other info; this is
# in the map's metadata.
# d.text adds selected text
# There are lots of d.* commands to choose from!
30 CHAPTER 4. BASIC RASTER DISPLAY AND REGION OPERATIONS
Click "run" and it prints out this command line string and runs the desired
command.
Try displaying one of the curvature maps in the viewer. It looks like a
bunch of random noise (Figure 5.2). This is because of the high (1 meter)
resolution of the LiDAR data: tiny bumps on the surface are dominating the
signal. Let's resample these data to 5 meter resolution. First, we have to
change our computational region's resolution. Then we use the "r.resample"
tool to coarsen our raster map.
31
32 CHAPTER 5. TOPOGRAPHIC AND HYDROLOGIC ANALYSES
That's better. The prole curvature follows the hillslope contours well, and
the tangential curvature traces out river channels (Figure 5.3). Look at the
slope maps as well, and how much more continuous and smooth the 5m slope
map is than the 1m slope map.
The GRASS help index tells you how to use the commands and what
research, theories, and/or publications the commands implement. This
help often comes with examples and/or diagrams to better explain the
situations.
In this particular case, we will navigate to the raster command index and
look for r.watershed, a watershed basin creation program. [NEW REF]
Figure 5.3: At 5 meter resolution, the tangential curvature is still noisy, but
channel networks have become visuallly discernable.
The thinning step ensures that there are no clumps of pixels, and that a
single vector line therefore can be drawn cleanly through the raster during the
r.to.vect step.
GRASS add-ons
GRASS GIS has a number of add-ons. These are applications that have
not been fully adopted and integrated into the GRASS suite of tools, but
that can still be very useful. One of these, r.stream, is used for the
kinds of watershed problems that we are tackling right now. We will be
using the built-in GRASS tools in this tutorial, but to learn more about
the GRASS add-ons, go to their wiki page: http://grass.osgeo.org/
wiki/GRASS_AddOns.
Box 5.2: GRASS add-ons
While the multiple ow direction algorithm is good for providing a more
5.3. GORDON GULCH DRAINAGE BASIN FROM SET POUR POINT 35
accurate representation of ow paths, single ow direction is needed for stream
proling. We are also going to relax the threshold drainage area down to 10,000
2
cells (10,000 m = 100x100 meters). Let's do that now.
Now we have a set of single vector stream lines in the basin, each of which
represents a segment of the full river channel.
Where I have been using the threshold, I have been doing so in terms of
cells. But if your cell sizes vary, or you want to input real ow contributions
from each cell, you can do that by setting the flow parameter in r.watershed
to the name of a raster map.
Let's cap our calculatory achievments by displaying the SFD streams on top
of the color shaded relief via the command line:
d.mon x0
# d.vect -c map=basins_mfd type=boundary # These get confusing, but this is how
to display area boundaries
d.rgb r=colored_shaded_relief.r g=colored_shaded_relief.g b=colored_shaded_relief
.b
d.vect map=streams color=blue
Let's look at this in the GRASS graphical user interface. First, click on the
add vector button (Figure 5.4). Then follow the sequence of events in Figures
5.5, 5.6, and 5.7 to display the basin.
Figure 5.4: Click on this button to open a GUI d.vect dialog to display the
vector map and select display preferences.
This is all for now, but we go back to this drainage basin and these streams
in Chapter 6, in which we learn how to work with vector data and database
tables.
5.3. GORDON GULCH DRAINAGE BASIN FROM SET POUR POINT 37
Figure 5.5: Select the vector to display. Then go through the tabs to show only
the boundary and make the line width be 2.
Figure 5.6: I've added our shaded relief map with topography draped over it
and a blue vector map of the streams (calculated with the SFD algorithm) to
my map along with the drainage basin.
38 CHAPTER 5. TOPOGRAPHIC AND HYDROLOGIC ANALYSES
Figure 5.7: In the display window of the GUI, I have added a North arrow and
scale bar.
5.4. SOLAR RADIATION 39
# Let's sum all of the three radiation types for the whole-day option, using the
map calculatior:
r.mapcalc "total_irradiation_day28 = beam_irradiation_day +
diffuse_irradiation_day + reflected_irradiation_day"
# Given time - segfaults as with 6.4.1: fixed in newer versions (6.4.2 might be
release version now, so we could be safe on this)
# Segfault also caused by including latitude as either value or raster
r.sun -s elevin=topo aspin=aspect slopein=slope lat=40 day=28 time=8.0 beam_rad=
beam_irradiance_0800 diff_rad=diffuse_irradiance_0800 refl_rad=
reflected_irradiance_0800
echo $radrast
d.rast $radrast
d.title -ds map=$radrast
d.grid -gw size="0:01" color=white textcolor=black fontsize=16
d.legend map=$radrast color=black at=15,85,15,18
d.barscale bcolor=none at=0,93
# save the image here
d.out.file -t output=$radrast format=png --o
sleep 1 # Take a look at it!
d.erase
done
Figure 5.8: Solar radiation maps for January 28th. Some of the features in the
standard GRASS output, like the grid and legend text, are thin and don't show
up well in this multi-color gure. This is a weakness of the GRASS automated
displays.
Figure 6.1: GRASS maintains vector topology, with shared boundaries between
areas and individual areas dened by centroids. Figures from GRASS Wiki,
http://grass.osgeo.org/wiki/Digitizing_Area_Features.
43
44 CHAPTER 6. VECTORS AND DATABASES
Other aspects of GRASS vector topology are that points cannot overlap, and
lines should not cross or overlap. The whole point of this is to make sure that
there are not redundancies or ambiguities in the vecto data: careful preparation
of vector data sets can be hugely important for data processing and interpreta-
tion!
The category, cat, is a unique ID for each vector feature that starts at 1
and goes upward. Value is 1 from the conversion from raster. Label is empty,
because there was no label attached to the drainage basin raster.
Let's add the area of the drainage basin. To do this, we need to add a
column:
There we go! This can be used to nd neighbors, line slopes, perimeters,
and lots more fun stu. Something I've thought about is writing a slope-area
calculation algorithm for a whole landscape... would be very do-able, but I just
haven't done it yet!
I will now add the positions of those points with v.to.db, as well as their
elevations via queerying the raster map with v.what.rast. (Getting their lo-
cations probably won't be necessary, but it's good practice; note also that you
46 CHAPTER 6. VECTORS AND DATABASES
can use v.to.db to get the start and end points of lines directly, in a database
table that is attached to those lines. Cool, huh?)
Some vector les (not this one) have z-coordinates attached as well, meaning
that we could skip the v.what.rast step and just use col=x,y,z.
Now that we have this value, we can nd the column that is associated with
this and save its x and y coordinates.
... but if you go to display this raster, you'll nd out that it is NOT our
big basin! We are looking at a small enough area that the normal assumption
that the biggest basin's outlet will have the lowest elevation won't always hold.
Interesting!
Other useful commands that are like this are v.overlay, which combines
(overlays) two vector maps, and v.extract, which extracts a subset of a vector
map based on database queeries.
The output of this command can be produced in the display window (Figure
6.2):
d.mon x0
d.shadedmap reliefmap=shaded drapemap=topo brighten=15
d.vect map=GGstreams color=blue
d.vect map=GGbasin color=black type=boundary width=2
d.text -b size=8 text="Gordon Gulch Drainage" color=black font=romanc
d.barscale bcolor=none at=0,93
On viewing this, you might notice two tributaries that should ow into the
downstream end of Gordon Gulch but don't: this is because of the road that
appears in the LiDAR. Look for it when you zoom in. Note that a segment of
the stream along the road ended up in the Gordon Gulch drainage by mistake!
We have to x that. On the GUI, click the Queery command (Figure 6.3, select
either display mode (will be displayed in the GRASS terminal tab of your
layers, etc. window) or edit mode (will show up in a pop-up window), select
the GGstreams layer, and click on that segment. On my computer, this returns
cat:788. We want to get rid of this, so we use v.extract with the -r ag to
invert our selection:
http://grass.osgeo.org/wiki/Creating_watersheds
http://www.surfaces.co.il/?p=241
Figure 6.3: The mouse shows how to queery attributes interactively. The DEM
shows where the tributaries to Gordon Gulch are cut o by the road in the
DEM. It is not immediately obvious to me whether or not culverts still connect
the real tributaries to the real mainstem. The blue polyline sitting by itself is an
artifact of drainage analysis with these roads: it is the piece of the now-blocked
Gordon Gulch tributary drainage that managed to live on the edge between
the Gordon Gulch and its would-be tributary basin boundaries, and therefore is
included in our nominally Gordon-Gulch-only subset of streams generated with
v.select.
50 CHAPTER 6. VECTORS AND DATABASES
Chapter 7
7.1 Raster
At the very beginning of this manual (Section 4.1), we imported raster data
with r.in.gdal. This allows us to import any of the GDAL compatible raster
formats. r.in.ascii allows import of ASCII grids with GRASS headers. There
are a lot of input and output commands based on this same r.in.* or r.out.
* pattern, and they work for everything from SRTM data and ArcGIS grids
to Matlab *.mat les to POV-RAY raytraceable les to images (and lots in-
between).
We will practice le input and output with the raster maps from Section
4.3.3. If we want to export these data to a le, we need to group the .r, .g,
and .b components together. For this, we use the group command, which is
in the i.* image processing command set.
Now we can export an image of the raster to a le. I like PNG for images
because it can have transparency.
51
52 CHAPTER 7. FILE INPUT AND OUTPUT
Image processing
A large component of GIS work deals with image processing. Grass has
a large set of image processing commands that are listed as i.*. They
look pretty nifty to me, but I've never had need to use them. The same
principles of GRASS scripting that we have discussed so far apply to these
commands.
Note the message in which the precision of the output is changed to match what
PNG can handle.
Let's also output a real GIS format. You can type:
r.out.gdal -l
3-channel data can be stored in GDAL formats, but not in a single ASCII le.
We don't have any raster that is called colored_shaded_relief: all we have
is the group that comprises the (r,g,b) triplet. All right - let's just export our
all-day solar intensity map instead:
Now that works. Note that r.out.ascii tends to take longer and make bigger
les. ASCII is the easiest and most universal to read, but is usually also the
largest and clunkiest letype.
This ASCII le has a GRASS header, allowing it to be read back in and
providing georeferencing information. This header can be left out if you chose
the -h ag. For the groundwater modelers, a -m ag writes a MODFLOW-
compatible grid.
We'll skip le input, but at this point, you know how the syntax should
work.
7.2 Vector
Vector I/O works in the same way as raster I/O. The vector I/O commands are:
7.3. GOOGLE EARTH 53
v.out.ogr is very useful, because it covers all of the OGR formats. v.out.
ascii writes all of the vector values to a human-readable ASCII text le. In
the place of v.out.ascii, I often pipe the output to a le with v.db.select,
because this allows me to suppress header printing (if I want to) and choose a
subset of the data (matching a SQL queery, here to choose only the very highest
points).
I have also changed the eld separator from the default | to a space, which
is natively friendly with Numpy. You will read more about piping to les in
Section 8.2.
The gpsbabel and garmin vector I/O options are very useful to me, be-
cause they let me insert my GPS points into GIS easily.
You can check out this stu on your own: at this point, you know the syntax,
how to get help, etc...
Now that we have this info, we can use it to dene our region:
Note from the output of this command that your E-W resolution is lower (more
degrees per cell) than your N-S resolution. This is because latitude and longitude
are not equal, and 1 degree of longitude at 40 N is less than a degree of latitude
at 40 N. You still have a regular 1-meter grid, and (if you didn't know it already)
discovered a major reason for map projections!
OK - enough blabbing. Let's import our topography grid, shaded relief map,
Gordon Gulch basin outline, and the streams within Gordon Gulch proper.
I'm going to do this inside for loops again, in Bash. The loops are totally
unnecessary, but are just to keep making you get used to Bash scripting (if you
aren't already). Educational research shows that giving sneak peeks of concepts
before they are formally introduced increases retention!
do
echo $vect
v.proj location=GordonGulch input=$vect
done
d.mon x0
d.shadedmap reliefmap=shaded drapemap=topo brighten=15
d.vect map=GGstreams color=blue
d.vect map=GGbasin color=black type=boundary width=2
d.text -b size=8 text="Gordon Gulch Drainage" color=black font=romanc
d.barscale bcolor=none at=0,93
Check out Figure 7.1 to see our projected map and how it diers from Figure
6.2.
Now that everything is imported, we are ready to send it out to Google
Earth!
7.3.2 Vector
Vector output to Google Earth is easy because KML is an OGR le format.
Just use:
For vector input and output, you use dsn (data source name) to refer to the
vector les, instead of input or output (whichever the le happens to be
output in this case).
Place the output in the googleearth folder that came with this manual;
this will let you have all of your raster and vector outputs in the same place.
7.3.3 Raster
Raster Export
We will output our raster as a PNG le, because this preserves transparency in
those nodata regions (instead of making ugly white splotches). First, we will
have to follow the procedure outlined in Sections 4.3.3 and 7.1 to blend and
group the topographyshaded relief combination into a RGB raster.
56 CHAPTER 7. FILE INPUT AND OUTPUT
Figure 7.1: Gordon Gulch in latitude and longitude. Note that there is some
whitespace at the edge of the map due to the coordinate transformation into
a geographic coordinate system (from a projected one), and that the location
looks smooshed in the vertical direction. Now think about this every time you
use Google Maps, which is just lat/lon: N-S distances look shorter there than
they really are, and by a not-so-insignicant amount!
Then we use what we learned in Section 7.1 to output this into a single, nice,
PNG le with transparency preserved:
mv GordonGulchMap.PNG GordonGulchMap_OpaqueOrig.PNG
convert -fuzz 3% -transparent white GordonGulchMap_OpaqueOrig.PNG GordonGulchMap.
PNG
7.3. GOOGLE EARTH 57
We now add one additional step. Because our blended output was a PNG,
it has no georeferencing information. To x this, we can use r.out.png one one
of the color channels to produce a world le: an ASCII le that geolocates our
image. This is necessary for a Google Earth import.
Then copy the world le such that the lename of the copied version corresponds
to the blended raster that you want to import.
cp colored_shaded_relief.b.wld GordonGulchMap.wld
After you do this once, you'll know how world les are formatted, so you can
just create them on your own. You can also just go to Wikipedia (http://
en.wikipedia.org/wiki/World_file) and learn all you'd ever want to know
about them right o the bat! Of course, once you read that, you'll realize that
rotation is possible, so that whole transparency thing should have been a non-
issue... but I really don't know anything about generating rasters that aren't in
a N-S-W-E orientation, so we're stuck with this for now! The good news can be
that if you are working entirely in geographic coordinates, you won't ever have
to worry about the transparency issue.
Rasters need to be tiled for Google Earth. I've included a Python script that
does this. This script, gdal2tiles.py is a standard part of the GDAL library.
It should be in the googleearth folder that accompanies this manual. We'll
write our output to that folder as well.
To run the Python script, you will need to have Python 2.X and (almost
certainly) Numpy on your computer. You might also need PIL, the Python
Imaging Library. There are also programs with nice graphical interfaces that
act as wrappers to gdal2tiles.py. I haven't used them as much, but MapTiler
seems pretty good (http://www.maptiler.org/; review / notes at
https://
alastaira.wordpress.com/2011/07/11/maptiler-gdal2tiles-and-raster-resampling/).
We'll go forward in a scripting sort of way though, since I'm sure you can work
your way through a GUI!
If you type
and/or execute the script without any arguments, you get a description of how
to run it.
We are going to run it now, and send the output to a subfolder of googleearth.
This is what this looks like on my computer; you can see that I have created a
grasstmp folder for the outputs we have created thus far.
58 CHAPTER 7. FILE INPUT AND OUTPUT
awickert@Cordilleran:~/Documents/geology_docs/courses/GRASS/googleearth$ ./
gdal2tiles.py -t "Gordon Gulch LiDAR" -k ~/grasstmp/GordonGulchMap.PNG ./
GordonGulchLidarMap
Generating Base Tiles:
0...10...20...30...40...50...60...70...80...90...100 - done.
Generating Overview Tiles:
0...10...20...30...40...50...60...70...80...90...100 - done.
The les are organized into levels of zoomed-out-ed-ness; this makes it easier
on the computer as you zoom in and out of the region. The KML le created
is named, by default, doc.kml. I want it to be more specic, so I change that:
mv GordonGulchLidarMap/doc.kml GordonGulchLidarMap/GordonGulchLiDAR.kml
Figure 7.2: The Google Earth les are organized in a hierarchical folder struc-
ture, with a vector KML le that is loaded by Google Earth and indexes them.
You probably noticed that there are lots of other options for gdal2tiles.py
that can be used to put the images on web servers, etc. I've never used them,
but I bet they could be pretty great for outreach work, making data available
to other researchers or the public, etc.
Open Google Earth. Go to File Open, and navigate to your les. Click
on them and watch them appear in your map! [Hey - Google Earth even zooms
you straight in to Gordon Gulch!]
The vector les will need some love to stop being that uniform spindly red.
Right-click on the vector layers in your left-hand panel in Google Earth, go to
the second tab [Style, Color], and click share style. This way Google Earth
knows that it can apply a consistent color scheme to all of these vector objects.
Give the vectors your desired color and width. They sure can look nice!
Figure 7.3: Above: top-down view of vector map. Below: perspective view of
raster and vector data with 3 vertical exaggeration. Don't you feel like you're
a scientist from the movies, zooming through a mission-critical landscape?
60 CHAPTER 7. FILE INPUT AND OUTPUT
Chapter 8
Windows: notepad++
61
62 CHAPTER 8. WRITING AND EXECUTING SCRIPTS
do
# Append new lines with all of the file names you find
# ">>" means append to file; ">" means create file
# Here, you are "piping" the output of "echo" into
# the file fnames.txt, instead of having it appear
# in the standard output (i.e. the terminal window)
echo $file >> fnames.txt
done
Use the vi (or your preferred) text editor to look at the le.
vi rasters.txt
As you can see, it isn't formatted in a nice way, with each entry on its own line.
(Press :q, then ENTER to exit when you are done viewing.) This calls for
a tool called sed, which can parse regular expressions. We will do a lot of nd
and replace commands with sed.
First, let's remove the rst, second and last lines:
Now, let's replace the spaces (any number of them) with newline characters,
and then remove blank lines that would be read as supposed raster names.
sed -i 's/ \+/\n/g' rasters.txt # Turns the spaces into newlines, and your data
into a single column!
sed -i '/^$/d' rasters.txt # Removes blank lines
http://grass.osgeo.org/wiki/GRASS_and_Python
http://grass.osgeo.org/wiki/GRASS_Python_Scripting_Library
http://grass.osgeo.org/wiki/Converting_Bash_scripts_to_Python
These sources are fairly comprehensive and link to additional sources of infor-
mation. This is a major reason why I am in no hurry to write this section:
good information exists, and once you know GRASS and Python, all you need
to know are the Python modules to import and the syntax to access GRASS
functionality. These Wiki articles comprise most (almost all?) of what I know
(and some more besides: I hadn't seen some of these articles before writing this
paragraph, and some have seen signicant overhaul in recent weeks/months),
and link to the rest of what I use.
The Wiki documentation is skimpy on vector handling (Python is still fairly
new to GRASS), but the Python API is largely built, so I have used infor-
mation from the GRASS programmer's manual (a useful resource in general)
See http://grass.osgeo.org/programming6/
to work through these issues.
namespacepython_1_1vector.html for the GRASS 6.5 version. I still haven't
found a way to write data to GRASS vectors from Python data structures: I
can use Python to run the standard GRASS vector commands, though.
The full GRASS Progammer's Manual (6.5, but similar to 6.4, and easily
found via a web search) is http://grass.osgeo.org/programming6/pythonlib.
html (here open to the Python section, but with access to the whole thing vis-
ible).
Python scripting has also provided me with a way to run my numerical
models in a geospatially-registered environment. This is great, because it means
that my model results can be compared instantly with real-world data. To get a
taste of both GRASS Python scripting and model integration, check out a copy
of my exural isostasy model from the CSDMS subversion repository:
svn co https://csdms.colorado.edu/svn/flexure
Wrap-up
I hope that this manual has been useful to you. Please let me know if there is
anything that needs to be xed, if you'd want to help and/or expand it in any
way, or if you have other questions or suggestions. I really hope that this helps
you to be more ecient at the computer, be able to do more insightful analyses
in a shorter period of time, and avoid paying sky-high fees for Arc and bursting
into tears as it crashes and burns and takes your day of work with it.
This manual has been an entirely free-time project to introduce the geomor-
phic community to an open-source, highly-automatable GIS and some of the
neat things you can do with it. As such, I won't always be able to answer all
questions in a timely manner, but I really, really promise that I will try.
65
66 CHAPTER 9. WRAP-UP
Markus Neteler and Helena Mitasova, 2008, Open Source GIS: A GRASS
GIS Approach. Third Edition. http://www.grassbook.org/
3. Code from specic projects and/or codes that I have written to do generally-
useful tasks (e.g., regional-scale stream proles, terrace identication)
4. CSDMS and GRASS but I need to work with CSDMS rst to see if I can
create a generic GRASS wrapper for their interfaces, and I would need to
have time to do that...
6. Add a section on interpolating data going from point clouds to grids, and
LiDAR processing
7. Remote sensing: learn it, or talk to someone who knows it, and then write
about it
9.4. CONTACT INFORMATION 67
E-mail: [email protected]
Permanent forwarding email: [email protected]
(because I'm graduating from CU soon-ish... right, Bob?)