Code Editor (JavaScript)
// Use of ee.Image.reproject is rarely needed and should generally be avoided.
// Defining the projection and scale of analysis should be handled by "scale",
// "crs", and "crsTransform" parameters whenever they are offered by a function.
// It is occasionally useful for forcing computation or visualization at a
// desired scale and projection when alternative methods are not available. In
// this example it is used to compute and visualize terrain slope from a DEM
// composite.
// Calculate mean elevation from two DEM datasets. The resulting composite
// image has a default CRS of WGS84 with 1 degree pixels.
var dem1 = ee.Image('NASA/NASADEM_HGT/001').select('elevation');
var dem2 = ee.Image('CGIAR/SRTM90_V4').select('elevation');
var demMean = ee.ImageCollection([dem1, dem2]).mean();
// Display the DEMs on the map, note that they all render as expected.
var demVisParams = {min: 500, max: 2500};
Map.setCenter(-123.457, 47.815, 11);
Map.addLayer(dem1, demVisParams, 'DEM 1');
Map.addLayer(dem2, demVisParams, 'DEM 2');
Map.addLayer(demMean, demVisParams, 'DEM composite');
// Calculate terrain slope from the composite DEM (WGS84, 1 degree pixel scale).
var demCompSlope = ee.Terrain.slope(demMean);
// Because the composite has 1 degree pixel scale, the slope calculation
// is essenstially meaningless and difficult to even display (you may need to
// zoom out to see the individual 1 degree pixels).
Map.addLayer(demCompSlope, {min: 0, max: 0.3}, 'Slope');
// We can use ee.Image.reproject to force the slope calculation and display
// the result with a reasonable scale of 30 m on WGS84 CRS, for example.
var slopeScale = ee.Terrain.slope(
demMean.reproject({
crs: 'EPSG:4326',
scale: 30
})
);
Map.addLayer(slopeScale, {min: 0, max: 45}, 'Slope w/ CRS and scale');
// To more precisely control the reprojection, you can use the "crsTransform"
// parameter instead of the "scale" parameter or set the projection according to
// a reference image. For example, here the input composite image for the slope
// function is set to match the grid spacing and alignment of the NASADEM image.
var nasademProj = dem1.projection();
var demMeanReproj = demMean.reproject(nasademProj);
var slopeRefProj = ee.Terrain.slope(demMeanReproj);
Map.addLayer(slopeRefProj, {min: 0, max: 45}, 'Slope w/ reference proj');
print('Reference projection', nasademProj);
print('DEM composite projection', demMeanReproj.projection());
// An alternative method for changing the projection of image composites
// (not accepting the default WGS84 CRS with 1 degree pixel scale) is to
// explicitly set the default projection using ee.Image.setDefaultProjection,
// which will not force resampling, like ee.Image.reproject will.
var demMeanProj = ee.ImageCollection([dem1, dem2]).mean()
.setDefaultProjection(nasademProj);
var slopeProj = ee.Terrain.slope(demMeanProj);
Map.addLayer(slopeProj, {min: 0, max: 45}, 'slope w/ default projection set');
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)
# Use of ee.Image.reproject is rarely needed and should generally be avoided.
# Defining the projection and scale of analysis should be handled by "scale",
# "crs", and "crsTransform" parameters whenever they are offered by a function.
# It is occasionally useful for forcing computation or visualization at a
# desired scale and projection when alternative methods are not available. In
# this example it is used to compute and visualize terrain slope from a DEM
# composite.
# Calculate mean elevation from two DEM datasets. The resulting composite
# image has a default CRS of WGS84 with 1 degree pixels.
dem_1 = ee.Image('NASA/NASADEM_HGT/001').select('elevation')
dem_2 = ee.Image('CGIAR/SRTM90_V4').select('elevation')
dem_mean = ee.ImageCollection([dem_1, dem_2]).mean()
# Display the DEMs on the map, note that they all render as expected.
dem_vis_params = {'min': 500, 'max': 2500}
m = geemap.Map()
m.set_center(-123.457, 47.815, 11)
m.add_layer(dem_1, dem_vis_params, 'DEM 1')
m.add_layer(dem_2, dem_vis_params, 'DEM 2')
m.add_layer(dem_mean, dem_vis_params, 'DEM composite')
# Calculate terrain slope from the composite DEM (WGS84, 1 degree pixel scale).
dem_comp_slope = ee.Terrain.slope(dem_mean)
# Because the composite has 1 degree pixel scale, the slope calculation
# is essenstially meaningless and difficult to even display (you may need to
# zoom out to see the individual 1 degree pixels).
m.add_layer(dem_comp_slope, {'min': 0, 'max': 0.3}, 'Slope')
# We can use ee.Image.reproject to force the slope calculation and display
# the result with a reasonable scale of 30 m on WGS84 CRS, for example.
slope_scale = ee.Terrain.slope(dem_mean.reproject(crs='EPSG:4326', scale=30))
m.add_layer(slope_scale, {'min': 0, 'max': 45}, 'Slope w/ CRS and scale')
# To more precisely control the reprojection, you can use the "crsTransform"
# parameter instead of the "scale" parameter or set the projection according to
# a reference image. For example, here the input composite image for the slope
# function is set to match the grid spacing and alignment of the NASADEM image.
nasadem_proj = dem_1.projection()
dem_mean_reproj = dem_mean.reproject(nasadem_proj)
slope_ref_proj = ee.Terrain.slope(dem_mean_reproj)
m.add_layer(slope_ref_proj, {'min': 0, 'max': 45}, 'Slope w/ reference proj')
display('Reference projection', nasadem_proj)
display('DEM composite projection', dem_mean_reproj.projection())
# An alternative method for changing the projection of image composites
# (not accepting the default WGS84 CRS with 1 degree pixel scale) is to
# explicitly set the default projection using ee.Image.setDefaultProjection,
# which will not force resampling, like ee.Image.reproject will.
dem_mean_proj = (
ee.ImageCollection([dem_1, dem_2]).mean().setDefaultProjection(nasadem_proj)
)
slope_proj = ee.Terrain.slope(dem_mean_proj)
m.add_layer(
slope_proj, {'min': 0, 'max': 45}, 'slope w/ default projection set'
)
m