ee.Terrain.products

  • The ee.Terrain.products function calculates slope, aspect, and hillshade from a terrain DEM.

  • The input image must contain elevation data in meters, either as a single band or a band named 'elevation'.

  • The output includes 'slope' and 'aspect' bands in degrees, and an unsigned byte 'hillshade' band for visualization.

  • Missing values will appear around the edges of the image due to the 4-connected neighbor calculation.

Calculates slope, aspect, and a simple hillshade from a terrain DEM.

Expects an image containing either a single band of elevation, measured in meters, or if there's more than one band, one named 'elevation'. Adds output bands named 'slope' and 'aspect' measured in degrees plus an unsigned byte output band named 'hillshade' for visualization. All other bands and metadata are copied from the input image. The local gradient is computed using the 4-connected neighbors of each pixel, so missing values will occur around the edges of an image.

Usage Returns
ee.Terrain.products(input) Image
Argument Type Details
input
Image An elevation image, in meters.

Examples

Code Editor (JavaScript)

 // Demonstrate ee.Terrain functions with single-image and collection DEMs. 
 // DEMs in Earth Engine are often distributed as single images per asset 
 // (e.g., NASA/NASADEM_HGT/001) or as collections of tiled images that need 
 // to be mosaicked (e.g., COPERNICUS/DEM/GLO30). Terrain analysis functions 
 // compute values based on neighboring pixels, so care must be taken to 
 // select and prepare DEM inputs appropriately. 
 // 1. Single DEM image asset. 
 // Assets like NASADEM are presented as single images covering large areas. 
 // They generally have a single projection and can be used in terrain analysis 
 // with no preprocessing. 
 var 
  
 nasadem 
  
 = 
  
 ee 
 . 
 Image 
 ( 
 'NASA/NASADEM_HGT/001' 
 ). 
 select 
 ( 
 'elevation' 
 ); 
 // Calculate slope, aspect, and hillshade simultaneously using products(). 
 var 
  
 nasademProducts 
  
 = 
  
 ee 
 . 
 Terrain 
 . 
 products 
 ( 
 nasadem 
 ); 
 // Visualization parameters. 
 var 
  
 elevationVis 
  
 = 
  
 { 
  
 min 
 : 
  
 0.0 
 , 
  
 max 
 : 
  
 3000.0 
 , 
  
 palette 
 : 
  
 [ 
 '333399' 
 , 
  
 '00a2e5' 
 , 
  
 '55dd77' 
 , 
  
 'ffff99' 
 , 
  
 'aa926b' 
 , 
  
 'aa928d' 
 , 
  
 'ffffff' 
 ] 
 }; 
 var 
  
 slopeVis 
  
 = 
  
 { 
 min 
 : 
  
 0.0 
 , 
  
 max 
 : 
  
 60.0 
 }; 
 var 
  
 aspectVis 
  
 = 
  
 { 
 min 
 : 
  
 0.0 
 , 
  
 max 
 : 
  
 359.99 
 }; 
 var 
  
 hillshadeVis 
  
 = 
  
 { 
 min 
 : 
  
 150.0 
 , 
  
 max 
 : 
  
 255.0 
 }; 
 // Display layers. 
 Map 
 . 
 setCenter 
 ( 
 - 
 121.603 
 , 
  
 47.702 
 , 
  
 9 
 ); 
 Map 
 . 
 addLayer 
 ( 
 nasadem 
 , 
  
 elevationVis 
 , 
  
 'NASADEM Elevation' 
 , 
  
 false 
 ); 
 Map 
 . 
 addLayer 
 ( 
 nasademProducts 
 . 
 select 
 ( 
 'slope' 
 ), 
  
 slopeVis 
 , 
  
 'NASADEM Slope' 
 ); 
 Map 
 . 
 addLayer 
 ( 
 nasademProducts 
 . 
 select 
 ( 
 'aspect' 
 ), 
  
 aspectVis 
 , 
  
 'NASADEM Aspect' 
 ); 
 Map 
 . 
 addLayer 
 ( 
  
 nasademProducts 
 . 
 select 
 ( 
 'hillshade' 
 ), 
  
 hillshadeVis 
 , 
  
 'NASADEM Hillshade' 
 ); 
 // 2. Mosaicked DEM ImageCollection asset. 
 // In contrast to single-image assets like NASADEM, some DEMs like GLO30 are 
 // provided as a collection of images that need to be mosaicked before use. 
 // We use this mosaicked DEM for the terrain calculations below. 
 var 
  
 glo30collection 
  
 = 
  
 ee 
 . 
 ImageCollection 
 ( 
 'COPERNICUS/DEM/GLO30' 
 ); 
 // When mosaicking a DEM collection that will be used for terrain analysis, 
 // it is best practice to set the mosaic's default projection to the native 
 // projection of the DEM tiles. If you don't, Earth Engine's default 
 // projection for mosaics (EPSG:4326 at 1-degree scale) is used, which is 
 // often too coarse for analysis and can lead to resampling artifacts if 
 // the result is reprojected to a different CRS during computation. 
 // See: 
 // https://developers.google.com/earth-engine/guides/projections#reprojecting 
 var 
  
 glo30Proj 
  
 = 
  
 glo30collection 
 . 
 first 
 (). 
 projection 
 (); 
 var 
  
 glo30Image 
  
 = 
  
 glo30collection 
 . 
 select 
 ( 
 'DEM' 
 ). 
 mosaic 
 (). 
 setDefaultProjection 
 ( 
 glo30Proj 
 ); 
 // Calculate slope, aspect, and hillshade simultaneously using products(). 
 var 
  
 glo30Products 
  
 = 
  
 ee 
 . 
 Terrain 
 . 
 products 
 ( 
 glo30Image 
 ); 
 // Display layers. 
 Map 
 . 
 addLayer 
 ( 
 glo30Image 
 , 
  
 elevationVis 
 , 
  
 'GLO30 Elevation' 
 , 
  
 false 
 ); 
 Map 
 . 
 addLayer 
 ( 
 glo30Products 
 . 
 select 
 ( 
 'slope' 
 ), 
  
 slopeVis 
 , 
  
 'GLO30 Slope' 
 ); 
 Map 
 . 
 addLayer 
 ( 
 glo30Products 
 . 
 select 
 ( 
 'aspect' 
 ), 
  
 aspectVis 
 , 
  
 'GLO30 Aspect' 
 ); 
 Map 
 . 
 addLayer 
 ( 
  
 glo30Products 
 . 
 select 
 ( 
 'hillshade' 
 ), 
  
 hillshadeVis 
 , 
  
 'GLO30 Hillshade' 
 ); 

Python setup

See the Python Environment page for information on the Python API and using geemap for interactive development.

 import 
  
 ee 
 import 
  
 geemap.core 
  
 as 
  
 geemap 

Colab (Python)

 # Demonstrate ee.Terrain functions with single-image and collection DEMs. 
 # DEMs in Earth Engine are often distributed as single images per asset 
 # (e.g., NASA/NASADEM_HGT/001) or as collections of tiled images that need 
 # to be mosaicked (e.g., COPERNICUS/DEM/GLO30). Terrain analysis functions 
 # compute values based on neighboring pixels, so care must be taken to 
 # select and prepare DEM inputs appropriately. 
 # 1. Single DEM image asset. 
 # Assets like NASADEM are presented as single images covering large areas. 
 # They generally have a single projection and can be used in terrain analysis 
 # with no preprocessing. 
 nasadem 
 = 
 ee 
 . 
 Image 
 ( 
 'NASA/NASADEM_HGT/001' 
 ) 
 . 
 select 
 ( 
 'elevation' 
 ) 
 # Calculate slope, aspect, and hillshade simultaneously using products(). 
 nasadem_products 
 = 
 ee 
 . 
 Terrain 
 . 
 products 
 ( 
 nasadem 
 ) 
 # Visualization parameters. 
 elevation_vis 
 = 
 { 
 'min' 
 : 
 0.0 
 , 
 'max' 
 : 
 3000.0 
 , 
 'palette' 
 : 
 [ 
 '333399' 
 , 
 '00a2e5' 
 , 
 '55dd77' 
 , 
 'ffff99' 
 , 
 'aa926b' 
 , 
 'aa928d' 
 , 
 'ffffff' 
 , 
 ], 
 } 
 slope_vis 
 = 
 { 
 'min' 
 : 
 0.0 
 , 
 'max' 
 : 
 60.0 
 } 
 aspect_vis 
 = 
 { 
 'min' 
 : 
 0.0 
 , 
 'max' 
 : 
 359.99 
 } 
 hillshade_vis 
 = 
 { 
 'min' 
 : 
 150.0 
 , 
 'max' 
 : 
 255.0 
 } 
 # Display layers. 
 m 
 = 
 geemap 
 . 
 Map 
 () 
 m 
 . 
 set_center 
 ( 
 - 
 121.603 
 , 
 47.702 
 , 
 9 
 ) 
 m 
 . 
 add_layer 
 ( 
 nasadem 
 , 
 elevation_vis 
 , 
 'NASADEM Elevation' 
 , 
 False 
 ) 
 m 
 . 
 add_layer 
 ( 
 nasadem_products 
 . 
 select 
 ( 
 'slope' 
 ), 
 slope_vis 
 , 
 'NASADEM Slope' 
 ) 
 m 
 . 
 add_layer 
 ( 
 nasadem_products 
 . 
 select 
 ( 
 'aspect' 
 ), 
 aspect_vis 
 , 
 'NASADEM Aspect' 
 ) 
 m 
 . 
 add_layer 
 ( 
 nasadem_products 
 . 
 select 
 ( 
 'hillshade' 
 ), 
 hillshade_vis 
 , 
 'NASADEM Hillshade' 
 ) 
 # 2. Mosaicked DEM ImageCollection asset. 
 # In contrast to single-image assets like NASADEM, some DEMs like GLO30 are 
 # provided as a collection of images that need to be mosaicked before use. 
 # We use this mosaicked DEM for the terrain calculations below. 
 glo30_collection 
 = 
 ee 
 . 
 ImageCollection 
 ( 
 'COPERNICUS/DEM/GLO30' 
 ) 
 # When mosaicking a DEM collection that will be used for terrain analysis, 
 # it is best practice to set the mosaic's default projection to the native 
 # projection of the DEM tiles. If you don't, Earth Engine's default 
 # projection for mosaics (EPSG:4326 at 1-degree scale) is used, which is 
 # often too coarse for analysis and can lead to resampling artifacts if 
 # the result is reprojected to a different CRS during computation. 
 # See: 
 # https://developers.google.com/earth-engine/guides/projections#reprojecting 
 glo30_proj 
 = 
 glo30_collection 
 . 
 first 
 () 
 . 
 projection 
 () 
 glo30_image 
 = 
 ( 
 glo30_collection 
 . 
 select 
 ( 
 'DEM' 
 ) 
 . 
 mosaic 
 () 
 . 
 setDefaultProjection 
 ( 
 glo30_proj 
 ) 
 ) 
 # Calculate slope, aspect, and hillshade simultaneously using products(). 
 glo30_products 
 = 
 ee 
 . 
 Terrain 
 . 
 products 
 ( 
 glo30_image 
 ) 
 # Display layers. 
 m 
 . 
 add_layer 
 ( 
 glo30_image 
 , 
 elevation_vis 
 , 
 'GLO30 Elevation' 
 , 
 False 
 ) 
 m 
 . 
 add_layer 
 ( 
 glo30_products 
 . 
 select 
 ( 
 'slope' 
 ), 
 slope_vis 
 , 
 'GLO30 Slope' 
 ) 
 m 
 . 
 add_layer 
 ( 
 glo30_products 
 . 
 select 
 ( 
 'aspect' 
 ), 
 aspect_vis 
 , 
 'GLO30 Aspect' 
 ) 
 m 
 . 
 add_layer 
 ( 
 glo30_products 
 . 
 select 
 ( 
 'hillshade' 
 ), 
 hillshade_vis 
 , 
 'GLO30 Hillshade' 
 ) 
 m 
Design a Mobile Site
View Site in Mobile | Classic
Share by: