File Exchange

image thumbnail

DEM: Shaded relief image plot (digital elevation model)

version (13 KB) by François Beauducel
Pretty shaded relief map as flat image.


Updated 20 May 2019

View Version History

View License

This function plots regular grids of elevation X,Y,Z in a more efficient manner than SURFL Matlab's function, because it recomputes lighting and displays result as shaded color flat RGB image. It uses also median-style filter to deal with min/max values of elevations and gradient, and proposes two specific colormaps "landcolor" and "seacolor".
Color mapping and lighting parameters can be changed from default values. In addition, several options are available: 'cartesian' to add decimal axis, 'latlon' to add geographical axis (GMT-like), 'legend' for an automatic scaling legend, 'lake' for automatic flat area color-filling and 'interp' to fill the novalue gaps...
This may be useful to produce high-quality and moderate-size Postscript image adapted for publication. Also, the output image is not dependant on current figure colormap, thus additional plots with indexed colors can be added (contour, pcolor, ...).
Figure examples:
Moon North Pole using the bone colormap and high contrast lighting (DEM source: raster LRO/LOLA LTVT)
Indonesia archipelago using default colormaps, 'latlon' axis basemap and legend scales (DEM source: raster NOAA/NGDC ETOPO1)

Soufrière of Guadeloupe volcano lava dome: 1-m resolution with NaN values (DEM source: OVSG-IPGP/SCIAC)

See "doc dem" for syntax, examples and help. See also the READHGT function from same author.

Cite As

François Beauducel (2021). DEM: Shaded relief image plot (digital elevation model) (, MATLAB Central File Exchange. Retrieved .

Comments and Ratings (38)

François Beauducel

Hi Jane,
To use a function you must add it into a directory that is defined in the Matlab path (see addpath function), for instance, .../Documents/MATLAB,
OR simply place it in your current folder.

Jane Roque

I tried to plot the DEM directly as:
dem(DEMdat.LON,DEMdat.LAT,z_dem) % Where z_dem is DEMdat.Z

I have the following problem:
"Unrecognized function or variable 'dem'."

What did I not consider?

François Beauducel

in addition, if you want to control everything on the colormap, set ZCUT to zero (...,'Zcut',0) to avoid the automatic median filter effect, and eventually use [ZMIN,ZMAX] option to set your own elevation limits.

François Beauducel

Hi Calvin,
ZMAX and ZMIN defines the max and min values of elevations for colormap instead of default which are the real min/max values of your DEM. If ZLIM is specified as input argument, it will use these values to fix the colormap scale. With default colormap ZMIN will be associated to dark blue and ZMAX to brown.
ZCUT is a median filter that uses all elevation data and "cut" a % of their lowest and highest values to adjust the colormap scale. By default, ZCUT is set to 0.5%, e.g., with a 500x500 DEM grid, the 1250 lowest elevation data and 1250 highest elevation data will be "overscaled" in the colormap, i.e., associated to min and max colors. This is useful to avoid unwanted effects when there is spikes values in the DEM. If the DEM is smooth, the small adjustment will not be detectable.

Calvin Hill

Hi François,

Thanks for the answer. One more question: I am trying to find the relationship between Zcut and Zlim (more specifically, could one calculate ZCUT knowing ZMAX and ZMIN?). Thanks again

François Beauducel

Dear Calvin,
Yes it is normal, you must use:
axis xy
after imshow() or imagesc() functions because they suppose an inverted Y-axis as for a photo. You can also use:
to get an image not vertically flipped.

Calvin Hill

Is there a reason why when trying to view the illuminated image I created by [H,I] = dem(x,y,z) using imshow(I), the image is vertically flipped (as opposed to the one see when just running dem(x,y,z)? Thanks in advance for the help! Really appreciate the great work


Thanks, François for your awesome code but why I get the following error for readhgt(26:38,44:63):

Error using interp1>reshapeAndSortXandV (line
X and V must be of the same length.

Error in interp1 (line 93)
[X,V,orig_size_v] =

Error in dem (line 590)
cmap =

Error in readhgt>fplot (line 531)

Error in readhgt (line 486)


Gia Albano

I just had to change the fontsizes of the labels but overall very useful. François Beauducel also replies promptly

Alexandra Boghosian

Is there a simple way to use your code to calculate the extent of shadows given a DEM and sun-earth geometry? I am trying to mask shadows from an image, so I'd like to produce a map of 0s and 1s, 0 if there is a shadow cast on the pixel location and 1 if there is not.


Shuo Yang

Is there a way to use input X,Y that are matrices of same size of Z?

Andre Chaisson

Andre Chaisson

I cannot seem to override the colormap options and define my own, I am sorry to keep asking for help. I have been trying to do this for last 2 days.

Andre Chaisson

Andre Chaisson

My apologies for posting inappropriately to the readhgt function.

Is there a parameter and value I can add to my dem() to output it as a gray colormap instead of the RGB relief map?

François Beauducel

From X,Y,Z values you have to interpolate them into regular grid before using dem.m
For example use the function griddata from Matlab.

rajyalakshmi k

hi sir could u pay small attention on my query
i have x,,y,z values but how to use this code to generate DEM from those xyz values pleas give me a example to use your code

Camilo Márquez

Hi François
Thank you for the code. Where i find the code of the pictures example's?

cheng joylin

François Beauducel

Dear Tomke,
Thanks for the rating and the tip. But freezecolors uses CData to make RGB colors. So you won't be able to print vectorial PostScript from your figure:
>> print -depsc -painters freeze.eps
Warning: RGB color data not yet supported in Painter's mode
> In /Applications/>hardcopy at 36
In graphics/private/render at 109
In print>LocalPrint at 276
In print at 233
And you get a raster image... Same problem with all previous releases of Matlab. I have already written a similar solution in dem.m, but I am working on a new one compatible with the painters mode.

Tomke Froechtenicht

Hi, thanks for your quick reply. When you install the oackage "freezecolors" ( than you can plot contourplots over the elevation map.

My code:
dem (lon,lat,topo,...'legend');
[c,h]=contour(xkoord,ykoord,I,100); %Konturplot
colormap hot;
hc=colorbar('location','Eastoutside','Fontname','FixedWidth'); %Legende
'position', [pos(1)*1.1 pos(2)*0.9 pos(3)*0.5 pos(4)],'fontsize',8);
Cheers! Tomke

François Beauducel

Dear Tomke,
This possible in principle: the image produced by dem.m is not indexed but RGB, so independant from colormap function. But I forgot to apply this transformation to the colorbar used by 'legend' option. I'll fix this in the next release. By now you can use a different colormap for contour, with colorbar, but without the elevation legend/colorbar.

Tomke Froechtenicht

how can I overlay the DEM-plot with a contourplot that has another colorbar/legend?

Melanie Bieli

Super beautiful, thanks a lot for sharing this!

Matteo Niccoli


Fred Massin

This is great to be able (finally!) to export vector shaded image with matlab, thank you!


Exactly what I was looking for. Great Job!



Looking forward to using this code. For those of us who mask our DEMs with NaNs, it would be great to have an option to set NaN to white instead of black.


François Beauducel

Hi Carlo,
To add the colorbar you need to use the dem(...,'scale') option. Type doc dem to get all the available options.

Simon Lind

thank you for the code
please, how can I add a colorbar?


sangram ganguly

This is a fantastic code - I love this as I do not have to use the surfl command and other mapping toolbox commands to generate my DEM and drape with other images. Thanks a ton !!
Guys - if you are dealing with 10m DEM with huge matrices, forget about mapping toolbox functions to do your draping - use this function - generate the DEM (use the matrices generated e.g. I in this case) and then use the geotiffwrite command to create beautiful tif images and do the rest in photoshop.

François Beauducel

Dear Cristopher,
You must download the file, unzip into your Matlab directory, then type "doc dem" at Matlab prompt.
Or, you can clic on dem.m (on the right of the function window under "Highlights from..."): this will display the function's comments including the doc.


Sorry, François:
I can't find the "doc dem" for sintax, examples and help.
Can you help me

Martin Richard

MATLAB Release Compatibility
Created with R2011b
Compatible with any release
Platform Compatibility
Windows macOS Linux

Inspired: shadem

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!