From GRASS-Wiki
(Redirected from GRASS + SAGA)
Jump to navigation Jump to search

This tutorial is prepared to present possibilities for integration GRASS GIS with SAGA. The current version is only for Linux installation.

What is SAGA

SAGA GIS System for Automated Geoscientific Analyses is Open Source (GPL) all purpose GIS system but mainly focused on terrain analysis. More information on SAGA Home Page. First version of SAGA was only MS Windows program but form the 2.0 version is multiplatform program based on GTK wxWidgets and command line interface. This tutorial concerns on using GRASS and SAGA command line together in raster data processing. Vector processing will be added in the future.

Installing SAGA

Issues connected with SAGA installation presented below many occur/not occur depending on Linux distribution, architecture, and GDAL/OGR/PROJ installation.

Currently the only trustworthy installation on Linux is a compilation from the source. The source can be found here The how-to install from source is described here. If we want to have direct access to GRASS data we need also to have GDAL/OGR compiled from source with grass-gdal plugin correctly compiled before SAGA compilation. It is important to check before SAGA configuration of wxWidgets installation: is or not is compiled with unicode support. Consequently we must configure SAGA with --enable-unicode or --disable-unicode. For unknown reason for me compilation from source available on SAGA download page always failed both on 32 and 64 bits architecture

It is also possible to use precompiled version of SAGA but there are problems with GDAL/OGR and PROJ working, depending on architecture (32 or 64 bits) and GDAL installation. In that case direct access do GRASS data also is not possible.

Start to work with SAGA command line on Linux

To start to work with SAGA command line on Linux we need prior add access to SAGA libraries:

export SAGA_MLB=/usr/local/lib/saga

If libraries have been installed in other directory full path to that directory shall be added. If we use precompiled SAGA installation we shall add path to saga_installation_dir/lib. For example:

export SAGA_MLB=~/saga_gtk/lib

Import and Export GRASS data to SAGA and backward

Direct importing GRASS Data to SAGA (requires grass-gdal plugin)

It is possible to import grass data directly to SAGA without transitional export to GeoTIFF or other GDAL format. But this method has some limitation (some of them are well known for R' spgrass6 users):

  1. plugin can import only the whole map. It ignores both current region resolution and region boundary
  2. there are problems with NULL interpretation if we use plugin to import grass raster directly.

So we can use direct import only if raster map have no NULL values and we need both extend an map resolution. On the other hand we need to use transactional GeoTiff.

How to import: in command line we need to use following SAGA command:

saga_cmd libio_gdal 0 -GRIDS elev -FILE ~/grassdata/spearfish60/PERMANENT/cellhd/elevation.dem


  • saga_cmd: command
  • cmd libio_gdal: library tu use (inpit output gdal)
  • 0: comand read gdal symbol
  • -GRIDS elev option name of SAGA grid file (extensions will be added by SAGA)
  • -FILE ~/grassdata/spearfish60/PERMANENT/cellhd/elevation.dem path to imported GRASS data

More about SAGA command line syntax can be found here Regardless of the import method method SAGA will create three files with extensions: sgrd, sdat and mgrd. The file with extension sgrd shall be used in future operations.

Import to SAGA with transactional GeoTiff

If we have data with NULL values or we need import only fragment of data or data with resolution differ than original map resolution we need to use transactional GeoTiff to export data from GRASS and import it to SAGA. To do that we need two commands:

r.out.gdal input=dem type=Float32 output=tmp.tif nodata=-9999
saga_cmd libio_gdal 0 -GRIDS tmp_dem -FILE tmp.tif

The SAGA command was described in previous section, for GRASS command syntax see GRASS documentation.

Note that it is important to define nodata as -9999. SAGA use that value to define nodata. Floating point (FCELL and DCELL) GRASS nodata value is interpreted by SAGA as nan (not a number). Integer (CELL) GRASS nodata value is interpreted as a number.

Export from SAGA with transactional GeoTiff

It is impossible to export data directly to GRASS because GRASS raster format for GDAL is read-only. So whatever method we used to import data to SAGA we can export them only using transactional GeoTiff. Two methods of export are possible:

  • export from SAGA to GeoTiff and import file by file (every file in separate command) or:
  • export from SAGA to multiband GeoTiff (one file) and next import it to GRASS as set of bands. Because during export to GeoTiff we cannot name separate bands (file names are not preserved) I recommend first method.

To properly export data from SAGA to GRASS we need two commands:

saga_cmd libio_gdal 2 -GRIDS demon.sgrd -FILE output.tif -o input=output.tif output=dem_demon

Note that in export SAGA command wee nedd use file name with extension .sgrd to proper export.

For unknown reason SAGA exports no data as -99999 instead of -9999 so if we import data with nodata cell we need to use r.null to change -99999 to no data after importing to GRASS.

Processing data with SAGA command line

Because this tutorial concerns SAGA and GRASS integration, only few information about SAGA command line syntax will be shown. More informations can be found on SAGA module reference Saga command line syntax is not typical Linux command syntax and in my private opinion is sometimes inconsistent and difficult to manage. The most important are connected with small/large caps in options in similar commands (-Method, -method, -METHOD, inconsistencies in option names (-elev, -ELEVATION, -dem, -DEM, depending on command) so it is difficult to give general rule about SAGA syntax. In general we can find proper option successively using SAGA command in pseudo-interactive mode. First if we type saga_cmd program will show list of available libraries (with .so extension) which we can use in further data processing.



saga_cmd libta_hydrology -h

Next after we add library (without extension) saga will list list of commands for this library.

jarekj@jarekj:~$ saga_cmd libta_hydrology
  #####   ##   #####    ##
 ###     ###  ##       ###
  ###   # ## ##  #### # ##
   ### ##### ##    # #####
##### #   ##  ##### #   ##

SAGA CMD 2.0.4

Load table: /home/jarekj/saga.srs...


error: module

available modules:
 0	- Parallel Processing
 1	- Recursive Upward Processing
 2	- Flow Tracing
[3]	- [interactive] Upslope Area
 4	- Upslope Area
[5]	- [interactive] Downslope Area
 6	- Flow Path Length
 7	- Slope Length
[8]	- [interactive] Isochrones Constant Speed
[9]	- [interactive] Isochrones Variable Speed
 10	- Cell Balance
[11]	- [interactive] Flow Sinuosity
[12]	- [interactive] Flow Depth
 13	- Edge Contamination
 14	- Topographic Indices
 15	- SAGA Wetness Index
 16	- Lake Flood
[17]	- [interactive] Lake Flood
 18	- Flow Accumulation, Mass-Flux Method
 19	- Flow Width

type -h or --help for further information

We can use only modules without square brackets around digits (non-interactive). Interactive modules can only be used in Graphical Mode. We can use command as a name (with parenthesis) or as a number. Both options are correct:

saga_cmd libta_hydrology 0 
saga_cmd libta_hydrology "Parallel Processing"

It will list the syntax with options and default values for given command. If option has default value listed if we do not type this option default value will be used.

jarekj@jarekj:~$ saga_cmd libta_hydrology "Parallel Processing"
  #####   ##   #####    ##
 ###     ###  ##       ###
  ###   # ## ##  #### # ##
   ### ##### ##    # #####
##### #   ##  ##### #   ##

SAGA CMD 2.0.4

Load table: /home/jarekj/saga.srs...

library path:	/usr/local/lib/saga
library name:	libta_hydrology
module name :	Parallel Processing
author      :	(c) 2001 by O.Conrad
Usage: Parallel Processing -ELEVATION <str> [-SINKROUTE <str>] [-WEIGHT <str>] -CAREA <str> [-CHEIGHT <str>] [-CSLOPE <str>] [-STEP <num>] [-CASPECT <str>] [-FLWPATH <str>] [-Method <num>] [-DOLINEAR] [-LINEARTHRS <str>] [-CONVERGENCE <str>]
  -ELEVATION:<str>  	Elevation
	Grid (input)
  -SINKROUTE:<str>  	Sink Routes
	Grid (optional input)
  -WEIGHT:<str>     	Weight
	Grid (optional input)
  -CAREA:<str>      	Catchment Area
	Grid (output)
  -CHEIGHT:<str>    	Catchment Height
	Grid (optional output)
  -CSLOPE:<str>     	Catchment Slope
	Grid (optional output)
  -STEP:<num>       	Step
	Minimum: 1.000000
  -CASPECT:<str>    	Catchment Aspect
	Grid (optional output)
  -FLWPATH:<str>    	Flow Path Length
	Grid (optional output)
  -Method:<num>     	Method
	Available Choices:
	[0] Deterministic 8
	[1] Rho 8
	[2] Braunschweiger Reliefmodell
	[3] Deterministic Infinity
	[4] Multiple Flow Direction
	[5] Multiple Triangular Flow Directon
  -DOLINEAR         	Linear Flow
  -LINEARTHRS:<str> 	Linear Flow Threshold
	Floating point
  -CONVERGENCE:<str>	Convergence
	Floating point
	Minimum: 0.000000

Now we have proper SAGA command:

saga_cmd libta_hydrology 0 -ELEVATION poccessed.sgrd  -CAREA Dinf_elev -Method 3

working example

This working example is a single script which use DEM data stored in the GRASS dataset and calculate all possible accumulation maps available in SAGA (where Rho8, Dinf, KRA, DEMON and Braunschweiger Relief Model methods are not available in GRASS) and export them back to GRASS. Before calculating accumulation map SAGA remove depressions using deeping channel method (known also as breaching) also not available directly in GRASS (is part of r.watershed). Run in GRASS environment for example in Spearfish dataset.

export SAGA_MLB=/usr/local/lib/saga

methods=(D8 Rho8 Braun Dinf MFD MTFD KRA DEMON)

#export from grass, import to saga
r.out.gdal input=$input type=Float32 output=tmps_dem.tif nodata=-9999
saga_cmd libio_gdal 0 -GRIDS tmps_dem -FILE tmps_dem.tif

#preprocessing: options: 1 fill sinks; 0 breach
saga_cmd libta_preprocessor 1 -DEM  tmps_dem.sgrd -DEM_PREPROC tmps_proc -METHOD 0

for i in `seq 0 7`

	if [ $i -le 5 ]; then
                #use  module parallel processing
                saga_cmd libta_hydrology 0 -ELEVATION tmps_proc.sgrd  -CAREA tmps_accum -Method $i
                #use  module flow tracing for DEMON and KRA
		saga_cmd libta_hydrology 2 -ELEVATION  tmps_proc.sgrd -CAREA tmps_accum -Method $((i-5))
	saga_cmd libio_gdal 2 -GRIDS tmps_accum.sgrd -FILE tmps_accum.tif -o input=tmps_accum.tif output=$pref${methods[i]}


#remove tmps
rm tmps*

Resulting map can be now processed in GRASS for example as accumulation maps in