r.slope.aspect(1grass)

πŸ’– NAME πŸ’–

Okay so bestie, meet r.slope.aspect β€” straight out of the GRASS User's Manual (that's the (1grass) on the end, iykyk). It generates raster maps of slope, aspect, curvatures and partial derivatives from an elevation raster map.

And the one thing you gotta remember: aspect is calculated counterclockwise from east. Periodt. πŸ’…


🌈 KEYWORDS 🌈

raster, terrain, aspect, slope, curvature, parallel


✨ SYNOPSIS ✨

r.slope.aspect
r.slope.aspect --help
r.slope.aspect [-aen] elevation=name  [slope=name]   [aspect=name]
[format=string]   [precision=string]   [pcurvature=name]
[tcurvature=name]   [dx=name]   [dy=name]   [dxx=name]   [dyy=name]
[dxy=name]   [zscale=float]   [min_slope=float]   [nprocs=integer]
[memory=memory in MB]   [--overwrite]  [--help]  [--verbose]  [--quiet]
[--ui]

πŸŽ€ Flags πŸŽ€

  • -a β€” Do not align the current region to the raster elevation map
  • -e β€” Compute output at edges and near NULL values
  • -n β€” Create aspect as degrees clockwise from North (azimuth), with flat = -9999. Default: degrees counter-clockwise from East, with flat = 0
  • --overwrite β€” Allow output files to overwrite existing files
  • --help β€” Print usage summary
  • --verbose β€” Verbose module output
  • --quiet β€” Quiet module output
  • --ui β€” Force launching GUI dialog

πŸ¦‹ Parameters πŸ¦‹

  • elevation=name [required] β€” Name of input elevation raster map
  • slope=name β€” Name for output slope raster map
  • aspect=name β€” Name for output aspect raster map
  • format=string β€” Format for reporting the slope
    • Options: degrees, percent
    • Default: degrees
  • precision=string β€” Type of output aspect and slope maps. Storage type for resultant raster map
    • Options: CELL, FCELL, DCELL
    • Default: FCELL
    • CELL: Integer
    • FCELL: Single precision floating point
    • DCELL: Double precision floating point
  • pcurvature=name β€” Name for output profile curvature raster map
  • tcurvature=name β€” Name for output tangential curvature raster map
  • dx=name β€” Name for output first order partial derivative dx (E-W slope) raster map
  • dy=name β€” Name for output first order partial derivative dy (N-S slope) raster map
  • dxx=name β€” Name for output second order partial derivative dxx raster map
  • dyy=name β€” Name for output second order partial derivative dyy raster map
  • dxy=name β€” Name for output second order partial derivative dxy raster map
  • zscale=float β€” Multiplicative factor to convert elevation units to horizontal units
    • Default: 1.0
  • min_slope=float β€” Minimum slope value (in percent) for which aspect is computed
    • Default: 0.0
  • nprocs=integer β€” Number of threads for parallel computing
    • 0: use OpenMP default; >0: use nprocs; <0: use MAX-nprocs
    • Default: 0
  • memory=memory in MB β€” Maximum memory to be used (in MB). Cache size for raster rows
    • Default: 300

πŸ‘‘ DESCRIPTION πŸ‘‘

So r.slope.aspect generates raster maps of slope, aspect, curvatures and first and second order partial derivatives from a raster map of true elevation values. You must specify the input elevation raster map, and at least one output raster map β€” like, at least one, please, we're not doing all this math for nothing 🫢. You can also specify the format for slope (degrees, percent; default=degrees), and the zscale: the multiplicative factor that converts elevation units to horizontal units (default 1.0).

The elevation input raster map you hand over has to contain true elevation values β€” not rescaled or categorized data, okay? If the elevation values are in other units than the horizontal units, they must be converted to horizontal units using the parameter zscale. In GRASS, vertical units are not assumed to be meters any more. So for example, if both your vertical and horizontal units are feet, the parameter zscale must not be used. 🌸

The aspect output raster map tells you the direction that slopes are facing, counterclockwise from East: 90 degrees is North, 180 is West, 270 is South, 360 is East. A zero aspect means flat areas with zero slope. Category and color table files are also generated for the aspect raster map. πŸ’«

Note: these values can be transformed to azimuth values (90 is East, 180 is South, 270 is West, 360 is North) using r.mapcalc:

# convert angles from CCW from East to CW from North
# modulus (%) can not be used with floating point aspect values
r.mapcalc "azimuth_aspect = if(ccw_aspect == 0, 0, \
                            if(ccw_aspect < 90, 90 - ccw_aspect, \
                            450 - ccw_aspect)))"

Alternatively, the -n flag can be used to produce aspect as degrees CW from North. Aspect for flat areas is then set to -9999 (default: 0).

Note: the reason for using -9999 is to be compliant with gdaldem, which uses -9999 by default as the nodata value. πŸ‘€

The aspect for slope equal to zero (flat areas) is set to zero (-9999 with the -n flag). So like, most cells with a very small slope end up having category 0, 45, ..., 360 in aspect output. It is possible to reduce the bias in these directions by filtering out the aspect in areas where the terrain is almost flat. An option min_slope can be used to specify the minimum slope for which aspect is computed. For all cells with slope < min_slope, both slope and aspect are set to zero.

The slope output raster map contains slope values, stated in degrees of inclination from the horizontal if the format=degrees option (the default) is chosen, and in percent rise if the format=percent option is chosen. Category and color table files are generated. πŸ”₯

Profile and tangential curvatures are the curvatures in the direction of steepest slope and in the direction of the contour tangent respectively. The curvatures are expressed as 1/metres, e.g. a curvature of 0.05 corresponds to a radius of curvature of 20m. Convex form values are positive and concave form values are negative.

Example DEM

Slope (degree) from example DEM Aspect (degree) from example DEM

Tangential curvature (m-1) from example DEM Profile curvature (m-1) from example DEM

For some applications, the user will wish to use a reclassified raster map of slope that groups slope values into ranges of slope. This can be done using r.reclass. An example of a useful reclassification is given below:

          category      range   category labels
                     (in degrees)    (in percent)
             1         0-  1             0-  2%
             2         2-  3             3-  5%
             3         4-  5             6- 10%
             4         6-  8            11- 15%
             5         9- 11            16- 20%
             6        12- 14            21- 25%
             7        15- 90            26% and higher
     The following color table works well with the above
     reclassification.
          category   red   green   blue
             0       179    179     179
             1         0    102       0
             2         0    153       0
             3       128    153       0
             4       204    179       0
             5       128     51      51
             6       255      0       0
             7         0      0       0

πŸ’€ NOTES πŸ’€

To ensure that the raster elevation map is not inappropriately resampled, the settings for the current region are modified slightly (for the execution of the program only): the resolution is set to match the resolution of the elevation raster map, and the edges of the region (i.e. the north, south, east and west) are shifted, if necessary, to line up along edges of the nearest cells in the elevation map. If you really want the raster elevation map resampled to the current region resolution, the -a flag should be specified. πŸ™ˆ

The current mask is ignored.

The algorithm used to determine slope and aspect uses a 3x3 neighborhood around each cell in the raster elevation map. So slope and aspect are not determineed for cells adjacent to the edges and NULL cells in the elevation map layer. (Yes, "determineed" β€” we keep the original's typo energy, bestie, no cap. 😭) These cells are by default set to nodata in output raster maps. With the -e flag, output values are estimated for these cells, avoiding cropping along the edges.

Horn's formula is used to find the first order derivatives in x and y directions.

Only when using integer elevation models, the aspect is biased in 0, 45, 90, 180, 225, 270, 315, and 360 directions; i.e., the distribution of aspect categories is very uneven, with peaks at 0, 45, ..., 360 categories. When working with floating point elevation models, no such aspect bias occurs. ⭐

πŸš€ PERFORMANCE πŸš€

To enable parallel processing, the user can specify the number of threads to be used with the nprocs parameter (default 1). The memory parameter (default 300) can also be provided to determine the size of the buffer for computation.

Figure: Benchmark on the left shows execution time for different number of cells, benchmark on the right shows execution time for different memory size for 5000x5000 raster. See benchmark scripts in source code. (Intel Core i9-10940X CPU @ 3.30GHz x 28)

To reduce the memory requirements to minimum, set option memory to zero. To take advantage of the parallelization, GRASS needs to compiled with OpenMP enabled. πŸ’…

πŸŽ€ EXAMPLES πŸŽ€

✨ Calculation of slope, aspect, profile and tangential curvature ✨

okay bestie so in this lil example we're pulling a slope, an aspect, a profile curvature and a tangential curvature map straight outta an elevation raster map (this is the North Carolina sample dataset, iconic btw):

g.region raster=elevation
r.slope.aspect elevation=elevation slope=slope aspect=aspect pcurvature=pcurv tcurvature=tcurv
# set nice color tables for output raster maps
r.colors -n map=slope color=sepia
r.colors map=aspect color=aspectcolr
r.colors map=pcurv color=curvature
r.colors map=tcurv color=curvature
Figure: Slope, aspect, profile and tangential curvature raster map (North Carolina dataset)

like yes we set the color tables ourselves because default vibes are mid, no shade πŸ’…


🧭 Classification of major aspect directions in compass orientation 🧭

In the following example (based on the North Carolina sample dataset) we first generate the standard aspect map (oriented CCW from East), then convert it to compass orientation, and finally classify four major aspect directions (N, E, S, W):

g.region raster=elevation -p
# generate integer aspect map with degrees CCW from East
r.slope.aspect elevation=elevation aspect=myaspect precision=CELL
# generate compass orientation and classify four major directions (N, E, S, W)
r.mapcalc "aspect_4_directions = eval( \
   compass=(450 - myaspect ) % 360, \
     if(compass >=0. && compass < 45., 1)  \
   + if(compass >=45. && compass < 135., 2) \
   + if(compass >=135. && compass < 225., 3) \
   + if(compass >=225. && compass < 315., 4) \
   + if(compass >=315., 1) \
)"
# assign text labels
r.category aspect_4_directions separator=comma rules=- << EOF
1,north
2,east
3,south
4,west
EOF
# assign color table
r.colors aspect_4_directions rules=- << EOF
1 253,184,99
2 178,171,210
3 230,97,1
4 94,60,153
EOF
Aspect map classified to four major compass directions (zoomed subset shown)

the <rainbow>(450 - myaspect) % 360</rainbow> move? that's the girl math that flips CCW-from-East into compass degrees and it EATS every single time 🫢


πŸ“š REFERENCES πŸ“š

  • Horn, B. K. P. (1981). Hill Shading and the Reflectance Map, Proceedings of the IEEE, 69(1):14-47.
  • Mitasova, H. (1985). Cartographic aspects of computer surface modeling. PhD thesis. Slovak Technical University , Bratislava
  • Hofierka, J., Mitasova, H., Neteler, M., 2009. Geomorphometry in GRASS GIS. In: Hengl, T. and Reuter, H.I. (Eds), Geomorphometry: Concepts, Software, Applications. Developments in Soil Science, vol. 33, Elsevier, 387-410 pp, doi:10.1016/S0166-2481(08)00017-2, https://www.geomorphometry.org

like they really did their research, we love an academically rigorous queen πŸ‘‘


πŸ‘€ SEE ALSO πŸ‘€

r.mapcalc, r.neighbors, r.reclass, r.rescale

go read those too, they're the supporting cast and honestly? they understood the assignment πŸ’œ


πŸ‘‘ AUTHORS πŸ‘‘

  • Michael Shapiro, U.S.Army Construction Engineering Research Laboratory
  • Olga Waupotitsch, U.S.Army Construction Engineering Research Laboratory

two absolute legends, respect the architects fr fr 🫑


πŸ’» SOURCE CODE πŸ’»

Available at: r.slope.aspect source code (history)

Latest change: Monday Feb 09 18:47:00 2026 in commit: 8cec756bc3c21c1086ba7c09dfda94b6a0e82f04

Main index | Raster index | Topics index | Keywords index | Graphical index | Full index

Β© 2003-2026 GRASS Development Team, GRASS 8.5.0 Reference Manual


and that's a wrap bestie!! ✨ this whole iconic little page is living inside the GRASS 8.5.0 Reference Manual, filed under r.slope.aspect(1grass) β€” so if you ever forget any of it, just pull up the r.slope.aspect(1grass) page in GRASS 8.5.0 and it'll be right there waiting for you like the loyal bestie it is πŸ’–πŸŒΈ no cap, now go compute some slopes πŸ¦‹

πŸ“¦ where this page comes from