Take the 2-minute tour ×
Geographic Information Systems Stack Exchange is a question and answer site for cartographers, geographers and GIS professionals. It's 100% free, no registration required.

Does anyone know how to calculate Topographic Ruggedness Index in Arcgis without access to command line arcinfo workstation?

"The topographic ruggedness index (TRI) is a measurement developed by Riley, et al. (1999) to express the amount of elevation difference between adjacent cells of a digital elevation grid. The process essentially calculates the difference in elevation values from a center cell and the eight cells immediately surrounding it. Then it squares each of the eight elevation difference values to make them all positive and averages the squares. The topographic ruggedness index is then derived by taking the square root of this average, and corresponds to average elevation change between any point on a grid and it’s surrounding area." -- from an aml arcscript by Jeffrey Evans

share|improve this question
    
depends upon the version of ArcGIS arcscripts.esri.com/details.asp?dbid=12646 some discussion from previous forums forums.esri.com/Thread.asp?c=93&f=982&t=145448 unchecked but search contained the term jennessent.com/arcgis/surface_area.htm –  Dan Patterson Feb 11 '11 at 1:38
add comment

4 Answers

up vote 10 down vote accepted

I would recommend to look outside ArcGIS) Very easy using the free gdal software: http://www.gdal.org/gdaldem.html

gdaldem TRI input_dem output_TRI_map

Or if you'd prefer it in saga gis: http://www.saga-gis.org/saga_modules_doc/ta_morphometry/ta_morphometry_16.html

share|improve this answer
4  
+1 I always appreciate seeing non-ArcGIS solutions to ArcGIS problems :-). This is a matter of principle, not antagonism towards ArcGIS in particular. One should avoid being locked in to a single software solution: not only is it professionally risky, it's intellectually stifling. –  whuber Feb 11 '11 at 15:03
    
I know I asked for an arcgis specific solution, but I'm accepting this one because of it's directness. GDAL Utilities are easy to acquire and install, universally acknowledged as best in class, and the command to generate this particular product is the definition of simplicity. –  matt wilkie Feb 14 '11 at 17:45
add comment

Let's do a little (just a little) algebra.

Let x be the value in the central square; let x_i, i = 1, .., 8 index the values in the neighboring squares; and let r be the topographic ruggedness index. This recipe says r^2 equals the sum of (x_i - x)^2. Two things we can compute easily are (i) the sum of the values in the neighborhood, equal to s = Sum{ x_i } + x; and (ii) the sum of squares of the values, equal to t = Sum{ x_i^2 } + x^2. (These are focal statistics for the original grid and for its square.)

Expanding the squares gives

r^2 = Sum{ (x_i - x)^2 }

= Sum{ x_i^2 + x^2 - 2*x*x_i }

= Sum{ x_i^2 } + 8*x^2 - 2*x*Sum{x_i}

= [Sum{ x_i^2 } + x^2] + 7*x^2 - 2*x*[Sum{ x_i } + x - x]

= t + 7*x^2 - 2*x*[Sum{ x_i } + x] + 2*x^2

= t + 9*x^2 - 2*x*s.

For example, consider a neighborhood

1 2 3
4 5 6
7 8 9

Here, x = 5, s = 1+2+...+9 = 45, and t = 1+4+9+...+81 = 285. Then

(1-5)^2 + (2-5)^2 + ... + (9-5)^2 = 16 + 9 + 4 + 1 + 1 + 4 + 9 + 16 = 60 = r^2

and the algebraic equivalence says

60 = r^2 = 285 + 9*5^2 -2*5*45 = 285 + 225 - 450 = 60, which checks.

The workflow therefore is:

Given a DEM.

  • Compute s = Focal sum (over 3 x 3 square neighborhoods) of [DEM].

  • Compute DEM2 = [DEM]*[DEM].

  • Compute t = Focal sum (over 3 x 3 square neighborhoods) of [DEM2].

  • Compute r2 = [t] + 9*[DEM2] - 2*[DEM]*[s].

Return r = Sqrt([r2]).

This consists of 9 grid operations in toto, all of which are fast. They are readily carried out in the raster calculator (ArcGIS 9.3 and earlier), the command line (all versions), and Model Builder (all versions).

BTW, this is not an "average elevation change" (because elevation changes can be positive and negative): it is a root mean square elevation change. It is not equal to the "topographic position index" described at http://arcscripts.esri.com/details.asp?dbid=14156 , which (according to the documentation) equals x - (s - x)/8. In the example above, the TPI equals 5 - (45-5)/8 = 0 whereas the TRI, as we saw, is Sqrt(60).

share|improve this answer
1  
Thank you Bill. I appreciate seeing the specifics of how a tool or operation works. From this anyone with a suitable investment of time and intellectual energy can build a new apparatus to carry this job out using the tools they have at hand. It's information like this which will make GIS.se a useful service in the long haul. –  matt wilkie Feb 14 '11 at 17:50
1  
+1 Great explanation. I guess this means a steep but smooth surface could have a higher TRI than a flat but bumpy surface. –  Kirk Kuykendall Feb 14 '11 at 21:39
    
@Kirk That is correct. There are ways to remove the effect of the local slope in order to obtain an index of "relative" ruggedness if you like. Although I haven't worked out the details, I believe that subtracting some universal multiple of (c*a)^2 from r2--where c is the cellsize and a is the slope (as rise/run, not as an angle or percent)--ought to do the trick. –  whuber Feb 20 '13 at 17:09
add comment

This sounds very much like the Topographic Position Index, a process I used recently for one of my projects. There's an ArcScript on the ESRI support page, a Topography toolbox on the ESRI Resource Center page, and some more info on the process on the Jenness Enterprises page.

share|improve this answer
add comment

TRI (Riley 1999) and TPI (Jenness 2002) are similar, but different.

To calculate TRI and TPI using ArcGIS 10.x...

Step 1: Use the Focal Statistics tool to make 2 new raster datasets from a DEM.

Raster 1 "MAX") Neighborhood: Rectangle, Height: 3, Width: 3, Units: Cell, Statistics type: Maximum

Raster 2 "MIN") Neighborhood: Rectangle, Height: 3, Width: 3, Units: Cell, Statistics type: Minimum

Step 2: Use the Raster Calculator to perform the following functions on the 2 raster datasets you just created.

For TRI: SquareRoot(Abs((Square("%MAX%") - Square("%MIN%"))))

For TPI: ("%Input DEM%" - "%MIN%") / ("%MAX%" - "%MIN%")

Here is sample Python code exported from a model I built for TRI....

# -*- coding: utf-8 -*-

---------------------------------------------------------------------------

script.py

Created on: 2014-03-06 08:56:13.00000

(generated by ArcGIS/ModelBuilder)

Usage: script

Description:

---------------------------------------------------------------------------

Import arcpy module

import arcpy

Check out any necessary licenses

arcpy.CheckOutExtension("spatial")

Script arguments

Input_raster = arcpy.GetParameterAsText(0)

TRI_Raster = arcpy.GetParameterAsText(1) if TRI_Raster == '#' or not TRI_Raster: TRI_Raster = "C:\Users\Documents\ArcGIS\Default.gdb\rastercalc1" # provide a default value if unspecified

Local variables:

MIN = Input_raster MAX = Input_raster

Process: 3x3Max

arcpy.gp.FocalStatistics_sa(Input_raster, MAX, "Rectangle 3 3 CELL", "MAXIMUM", "DATA")

Process: 3x3Min

arcpy.gp.FocalStatistics_sa(Input_raster, MIN, "Rectangle 3 3 CELL", "MINIMUM", "DATA")

Process: Raster Calculator

arcpy.gp.RasterCalculator_sa("SquareRoot(Abs((Square(\"%MAX%\") - Square(\"%MIN%\"))))", TRI_Raster)

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.