sun_angle documentation

sun_angle gives the solar azimuth and elevation for any time at any location on Earth. This function was adapted from the SolarAzEl function by Darin C. Koblick.

Back to Climate Data Tools Contents.

Contents

Syntax

[az,el] = sun_angle(t,lat,lon)
[az,el] = sun_angle(t,lat,lon,h)

Description

[az,el] = sun_angle(t,lat,lon) gives the solar azimuth and elevation in degrees at the specified geographic locations and times t in UTC. Input t can be datenum, datestr, or datetime format.

[az,el] = sun_angle(t,lat,lon,h) specifies height above sea level in meters. If no height is specified, elevations are automatically determined via the CDT function topo_interp.

Example 1: Time series at one location

As I write this, I'm sitting at a coffee shop in Pasadena, California, (34.16N,118.13W). Determine the sun's azimuth and elevation right now and for the next 10 days.

t = linspace(now,now+10,10000); % a time array 10 days long
t = t + 8/24; % converts Pacific Standard Time to UTC

[az,el] = sun_angle(t,34.16,-118.13);

Use subsubplot to plot the sun's angles:

subsubplot(2,1,1)
plot(t,az)
axis tight
ylabel 'azimuth (deg)'
datetick('x','keeplimits')

subsubplot(2,1,2)
plot(t,el)
axis tight
ylabel 'elevation (deg)'
datetick('x','keeplimits')

Example 2: Global grid

Use cdtgrid to create a quarter-degree global grid and get the sun angles everywhere around the globe at the UTC strike of midnight on May 27, 2019:

[lat,lon] = cdtgrid(1/4);

[az,el] = sun_angle('may 27, 1984 00:00:00',lat,lon);

Use imagescn to plot the solar azimuth and set the colormap to cmocean phase. Add political boundaries for context using borders.

figure
imagescn(lon,lat,az)
cb = colorbar;
ylabel(cb,'solar azimuth (deg)')
caxis([0 360])
cmocean phase
borders('countries','color',rgb('gray'))

Overlay sun elevation as contours. Of course, the sun elevation is only physical where the sun is above 0 elevation, so only include positive contours:

hold on
contour(lon,lat,el,[0 0],'k') % solid zero contour
contour(lon,lat,el,0:10:90,'k:')

text(0,0,{'It''s night time';'everywhere south';'of the solid contour'},...
   'horiz','center')

Example 3: The tiny effects of elevation

The sun's angle is affected by elevation above sea level. By default, sun_angle uses topo_interp to determine ground surface elevation above sea level if no elevation is specified. But here we consider a hypothetical tower, 10,000 meters tall in the center of London (51.51N, 0.123W). What's the sun azimuth and elevation along this tower at 7:45 pm on July 14, 2019?

t = 'july 14, 2019 7:45 pm';
lat = 51.51;
lon = -0.123;
z = 0:10000; % height along tower (m)

[az,el] = sun_angle(t,lat,lon,z);

figure
subplot(1,2,1)
plot(az-az(1),z) % plot relative to base
axis tight
xlabel '\Delta azimuth (deg)'
ylabel 'elevation (m)'

subplot(1,2,2)
plot(el-el(1),z) % plot relative to base
axis tight
xlabel '\Delta elevation (deg)'

Note the scientific notation on the x axis scales. That tells us the effect of elevation is miniscule on the scale of a few thousand meters.

Author Info

This function was originally written by Darin C. Koblick using the formulas described here: http://stjarnhimlen.se/comp/tutorial.html#5. It was adapted for the Climate Data Toolbox for Matlab in 2019 by Chad A. Greene.