View License

Download apps, toolboxes, and other File Exchange content using Add-On Explorer in MATLAB.

» Watch video

Highlights from
READHGT: Import/download NASA SRTM data files (.HGT)

4.70588
4.7 | 22 ratings Rate this file 79 Downloads (last 30 days) File Size: 65.1 KB File ID: #36379 Version: 2.7
image thumbnail

READHGT: Import/download NASA SRTM data files (.HGT)

by

 

25 Apr 2012 (Updated )

Imports or download SRTM worldwide digital elevation model data files.

| Watch this File

File Information
Description

This function imports .HGT "height" binary data files from NASA SRTM global digital elevation model of Earth land, corresponding to 1x1 degree tiles of 3-arc seconds resolution (SRTM3, around 90 m) and 1-arc second (SRTM1, around 30 m), and returns coordinates vectors latitude and longitude, and a matrix of elevation values.
The function includes also an automatic download of data from the USGS SRTM webserver, so indicating latitude and longitude is sufficient to get the data and instant map plot anywhere in the World.
Few examples:
   readhgt(46:47,-123:-122)
plots a map of Seattle and surrounding volcanoes,
   X = readhgt(48,2,'plot');
plots a map of Paris (France) and returns downloaded SRTM data in structure X.
Type "doc readhgt" for syntax, options, other examples and use.

Acknowledgements

This file inspired Machine Learning (Regression And Classification) Demo.

Required Products MATLAB
MATLAB release MATLAB 7.13 (R2011b)
MATLAB Search Path
/
Tags for This File   Please login to tag files.
Please login to add a comment or rating.
Comments and Ratings (47)
07 Feb 2017 Jim Pincini

This appears to be amazing. Thank-you!!

07 Feb 2017 Andre Chaisson

02 Feb 2017 François Beauducel

for colormap and other plot options, please refer to the dem function and post comment on the appropriate page, not readhgt.m
Thanks

Comment only
02 Feb 2017 Andre Chaisson

Im almost there, just need to figure out how to make the colormap gray, but it will have to wait til tomorrow. Thanks again for help.

Comment only
02 Feb 2017 Andre Chaisson

Hmmm, actually that resulted in a very low resolution image file. I dont own a Mac and my linux box is my kids comp, but I opened it in photoshop and yea its small.

I dont use your dem color mapping, just a grayscale colopmap to create a height map. Print only ever seems to print the current figure display resolution, not the full depth of the data when zoomed in. Even when I force the resolution, no effect.

Comment only
01 Feb 2017 François Beauducel

Best way to export the whole figure is Encapsulated PostScript format:

print -depsc -painters -loose figure.eps

The output can be natively read with Linux and MacOS, and converted to image using ImageMagick convert command, e.g.:

convert export.eps export.jpg

or try .pdf to keep the vectorial format.

If you just want the shaded relief image itself:

X=readhgt(...);
I=dem(X.lon,X.lat,X.z,'latlon','decim',1,'noplot');
imwrite(I.rgb,'output.png')

Comment only
01 Feb 2017 Andre Chaisson

Thanks for the answer, the image came in beautifully.

I am having issue exporting the surface data to an image at native resolution. I have tried the print function and export_fig but the resolution always gets reduced on output. I tried imwrite() as well, but the data is a structure type, not an integer. Any insight again would be greatly appreciated.

Cheers,

Comment only
30 Jan 2017 François Beauducel

Dear André

Thanks for your feedback and sorry for my late reply: Mathworks seems not sending "watching e-mails" anymore...

The 'nodecim' option is only valid for the dem.m plot function. With readhgt.m, you must use readhgt(...,'decim',1) to force the highest resolution.

Regarding your second question, SRTM data are lat/lon grid so each pixel has different size in km. readhgt.m uses my dem.m function to plot a relatively realistic X/Y ratio to respect distances, i.e., it shrinks longitudes while absolute latitudes are increasing. If you want to overwrite that, you may do:

X=readhgt(...);
dem(X.lon,X.lat,X.z,'latlon','axisequal','off')

See my dem.m function documentation for further options.

Regards,

Comment only
18 Jan 2017 Andre Chaisson

17 Jan 2017 Andre Chaisson

Great tool! I am very new to matlab and I am managing my way though great because of this tool.

I have a few question if I may. I want to import an area that encompasses a range of a few degrees of lat and longitude using the STRM3 dataset but when I use the 'nodecim', it still decimates the data by a factor of 8. Could you provide an example of the correct syntax?

Also when I import an individual tile I was under the impression that the file would be 1201x1201 pixels yet when the figure comes in its rectangular.

I am very new to matlab so please excuse my ignorance.

Cheers,

28 Dec 2016 Cebri

Cebri (view profile)

Dear François,

Using SRTM3 tiles instead of SRTM1 worked perfectly.

Indeed, the scarce memory resources of my computer were the cause of the problem.

Many thanks once again and congratulations for developing such a powerful tool.

Salutations!

27 Dec 2016 François Beauducel

Dear Cebri,

This is not really a Matlab problem but a computer memory problem.

The area you want to download is too huge and the matrix itself (32401 x 79201 !) exceeds your RAM computer capacity.

I would recommend then:

a. to not use the 'srtm1' option: default SRTM3 will make a beautiful 10801 x 26401 image which might be sufficient for your needs;

b. to split the area in 4 tiles or even more so your computer can manage it one by one.

Cheers,

Comment only
27 Dec 2016 François Beauducel

but anyway you may have problems to open the image at the end with your present computer.

Comment only
26 Dec 2016 Cebri

Cebri (view profile)

Dear François,

Thanks a lot for updating the url protocols.

I am having problems with computer memory when I attempt to plot maps that cover large extensions of land. The function is always interrupted because MATLAB reaches the maximum array size limit.

I need to plot a map that extends from Latitude 32ºN to 40ºN and from Longitude 68ºE to 89ºE.

I am calling READHGT like this:
readhgt([32, 40, 68, 89], 'interp', 'srtm1', 'plot');

But after a few minutes of processing, MATLAB throws the following error message:

"Requested 32401x79201 (4.8GB) array exceeds maximum array size preference. Creation of arrays greater than this limit may take a long time and cause MATLAB to become unresponsive."

I would be grateful if you could provide any piece of advice in order to overcome this memory problems so that I can get a plot of the map.

For reference, I am running a 64-bit Windows 8.1 with 4 GB RAM.

Kind regards.

Comment only
24 Dec 2016 Cebri

Cebri (view profile)

16 Dec 2016 Felipe Macedo

13 Dec 2016 François Beauducel

Dear Cebri,
Thanks very much for the information. After a few investigations, it seems that USGS made a redirection from http:// to https:// URL, which is not handled by unzip Matlab's function (while it is using Octave!).
I will continue the checks and propose very quickly a new version.

Comment only
12 Dec 2016 Cebri

Cebri (view profile)

Dear François

I am also experiencing the same behavior as Shin Gwangsoo:

I have tried different coordinate ranges but I always get "tile not found. Considering offshore". So I end up having all 0 values for z.

Then I have executed every example in the source file and the only one that is working is the Misti volcano, Peru. For all the other examples I get "tile not found. Considering offshore".

I realized that for downloading the data, the Misti volcano example uses the url: "http://rmd.neoknet.com/srtm1/" while all the other examples use the url: "http://dds.cr.usgs.gov/srtm/".

I accessed the url: "http://dds.cr.usgs.gov/srtm/" via web browser and I could navigate through the directories and files without any problem.

I don't know where the problem might come from.

Thanks.

Comment only
09 Nov 2016 François Beauducel

- for non-USA SRTM1 I just updated the URL to avoid the message "tile not found"
- for default SRTM1/3 tiles, remember you need internet connection to download data AND a writable current directory.

Comment only
09 Nov 2016 Shin Gwangsoo

Thank you:-)

I want to play this code.

but, eroor..

"tile not found. Considering offshore..."

Comment only
02 Nov 2016 John Mungall

Quite remarkable -- thank you very much. I look forward to learning how to contour the data.

13 Sep 2016 Zach

Zach (view profile)

A great resource. Thank you!!!

07 Jul 2016 François Beauducel

Dear Jeremiah,

Thanks for your feedback.

Actually the height values of SRTM data are elevation above the geoid and not ellipsoid. The geoid is equivalent to the long-term mean sea level.

Converts these data to ellipsoid reference like WGS84 is quite easy to do... good suggestion ! for a future release ?

Comment only
02 Jun 2016 Jeremiah Graber

Francois,

Thank you for the awesome file.

I was hoping for clarification on what height is reported. In reading about SRTM it appears height is listed either as height above the WGS84 ellipsoid or the EGM96 ellipsoid. Your code says it returns height above sea level.

Could you confirm which height you are returning? Also, would it be possible to have an option to return height above WGS84 ellipsoid? The offset is given in the data.

28 May 2016 E. Cheynet

24 Nov 2015 François Beauducel

Dear akfarell,
If you need the full indexing, you must use the meshgrid function:
X=readght(...);
[lon,lat]=meshgrid(X.lon,X.lat);
then lon,lat and X.z have the same size and indexed the same way.
François.

Comment only
23 Nov 2015 akfarrell

Dear Francois,
Just to clarify, how is the z matrix indexed with reference to the latitude and longitude values? Is it (lat(1:end), lon(1:end))? Thank you!

Comment only
19 Nov 2015 akfarrell

22 Aug 2015 Paolo

Paolo (view profile)

26 Apr 2015 mohamed nazih

thank you

Comment only
17 Oct 2014 vinod pillai

Dear Francois,
Thanks for the suggestion,
regards

vinod pillai

Comment only
15 Oct 2014 François Beauducel

Dear Vinod,
SRTM .hgt files are freely available at http://dds.cr.usgs.gov/srtm/version2_1
Once downloaded, a single tile (1 by 1 degree) is coded as a simple matrix of 1201 by 1201 binary int16 values, big-endian. No header. Integer values represent elevations in meter. -32768 value means "no data".
For SRTM1 tiles (USA territories), tiles are 3601 by 3601.
That's all. See online documentation for further details but this is easily readable in any language.
Regards,
François.

Comment only
15 Oct 2014 vinod pillai

Dear Francois,

I joined Matworks today only, while searching for some help on extracting height from SRTM file, and happen to catch your link. Though i have not worked on MATLAB, is there any other way ( say in VB.NET) to capture the height from SRTM .hgt.

regards

vkp

Comment only
02 Oct 2014 Einat

Einat (view profile)

Thanks, saved me some work :-)

09 Sep 2014 François Beauducel

Dear John,
Yes, you missed the required version of Matlab (2014a) which contains a new function "strjoin".
I just updated the script to improve compatibility with older versions of Matlab. Please let me know.
François.

Comment only
08 Sep 2014 John

John (view profile)

This seems to be a great tool, but I am having issues getting it to work properly. I've tried many of the examples from the help. All of them are returned with:

Undefined function 'strjoin' for input arguments of type 'cell'.

Error in dem>checkparam (line 976)
mes = sprintf('%s (%s)',mes,strjoin(val,' or '));

Error in dem (line 415)
[s,axeq] = checkparam(varargin,'axisequal',@ischar,{'auto','manual','off'});

Error in readhgt>fplot (line 395)
dem(x,y,z,demoptions{:})

Error in readhgt (line 350)
fplot(Y.lon,Y.lat,Y.z,decim,url,novalue)

Is there something I am missing?

26 Jul 2014 François Beauducel

thanks Daniel.

Comment only
25 Jul 2014 Daniel Pereira

Daniel Pereira (view profile)

MATLAB MASTER!

Thank you very much for this submission.
This is an awesome tool.

Chapeau.

16 May 2014 Greg

Greg (view profile)

Great tool, definitely useful!

I discovered one issue when downloading hgt files of North America data at all latitudes above 54°N.

On the USGS website these files are not in the *.hgt.zip format, and are instead *hgt.zip (no decimal point before hgt).

Therefore line 236 in 'readhgt.m' fails for these latitudes:
k = find(~cellfun('isempty',strfind(idx{1},ff)));

I changed this line to:
k = find(~cellfun('isempty',strfind(idx{1},ff(1:end-8))));

which works, but might not be the most elegant!

Comment only
16 May 2014 Greg

Greg (view profile)

29 Nov 2013 beatrice berthelot

30 Sep 2013 Peter Nave

Very useful tool, excellent documentation!

10 Apr 2013 Jeff

Jeff (view profile)

Regarding my previous comment, I just now noticed you recently added the 'crop' argument update which is exactly what I needed. You are way ahead of me... Amazing what a little bit of reading can do :) Thanks.

01 Aug 2012 François Beauducel

A user asked me how to extract an elevation profile from SRTM data... here is a little example (Mount Etna, Sicily):

X = readhgt(37,14:15,'merge','plot');
[x,y] = ginput(2)

then left-click on 2 different points: you will get 2 coordinates in x and y vectors. Then interpolate to create a profile vector:

xi = linspace(x(1),x(2));
yi = linspace(y(1),y(2));
zi = interp2(X.lon,X.lat,double(X.z),xi,yi);

note you need to use the DOUBLE command since SRTM elevation data are int16 class. Plot the profile on the DEM:

hold on,plot(xi,yi,'r'),hold off

Since x and y are longitudes and latitudes, the linear profile is an equirectangular approximation (rhumb line or loxodrome) of the great circle... To compute distance along this path:

di = sqrt(((xi-x(1)).*cosd(yi)).^2 + (yi-y(1)).^2)*6370*pi/180;

where cosd(yi) reduces longitude distance versus latitude, and last factor is latitude degree length in km. Then plot the profile:

figure
plot(di,zi)

that's all. If you know the profile coordinates, you don't need to use GINPUT and you directly define xi and yi with LINSPACE.

Comment only
28 May 2012 Martin Richard

15 May 2012 François Beauducel

Thanks Warwick for your kind feedback. I'll add a 2x2 tile option, in few days.
François.

Comment only
14 May 2012 Warwick

thank you. this is terrific, and surprisingly fast. A suggestion for a small increase in quick and easy usability would be an example of a 2by2 tile.

Updates
26 Apr 2012 1.1

- now reads also SRTM1 USA territory (1 arc-second resolution) data files.
- minor bug corrections.

14 May 2012 1.2

- adjust aspect ratio with latitude
- add minimal basemap axis ticks

18 May 2012 1.3

- adds possibility to download multiple tiles with merge option
- improved graphic output

29 May 2012 1.5

- minor modifications
- now uses DEM function (included in ZIP file) for basemap axis and legends

26 Sep 2012 1.6

Bug correction when "dem.m" function is not detected.

03 Jan 2013 1.7

- improves coding
- upgrades companion dem.m function

04 Jan 2013 1.8

minor update

21 Jan 2013 1.9

- new 'interp' option that fills the novalue gaps
- new 'crop' option to select rectangle part of tile(s)
- updated DEM companion function

23 Sep 2013 1.10

- bug correction in case of READHGT(FILENAME)
- rewriting of help
- minor corrections

19 May 2014 1.11

corrects an issue with tiles above latitude 54N (thanks to Greg).

09 Sep 2014 1.12

improve backward compatibility (strjoin)

06 Feb 2016 1.13

- 'merge' option is now default. Use new 'tiles' option to plot/download individual tiles when lat/lon are vectors
- LON argument is now automatically normalized to -180/+179°
- dem.m companion function update

06 May 2016 2.0

- new syntax readhgt(AREA)
- now can download SRTM1 30-m resolution tiles worldwide with option 'srtm1'

09 May 2016 2.1

- new options 'outdir' and 'url' (replacing former syntax)
- improves documentation

28 May 2016 2.2

- fix in AREA syntax

07 Jul 2016 2.3

- fix a problem when SRTM1 tiles are not found.

08 Jul 2016 2.4

- fix issue when merging SRTM1 tiles

09 Nov 2016 2.5

updates URL for world-wide SRTM1 tiles. Still unofficial...

13 Dec 2016 2.6

MAJOR UPDATE: changed URL protocol to access USGS SRTM3 files. This is to avoid "offshore tiles" message when downloading new files. An alternative is to always use the URL option:
readhgt(...,'url','https://dds.cr.usgs.gov/srtm/version2_1')

27 Dec 2016 2.7

adds new option 'wget' to workaround an issue with older releases (< 2014b), when downloading tiles automatically. This option works only for Linux and MacOSX. See documentation for further explanation.

Contact us