Menu

[r7555]: / trunk / toolkits / basemap / examples / daynight.py  Maximize  Restore  History

Download this file

76 lines (71 with data), 2.8 kB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import numpy as np
from mpl_toolkits.basemap import Basemap, netcdftime
import matplotlib.pyplot as plt
from datetime import datetime
def epem(date):
"""
input: date - datetime object (assumed UTC)
ouput: gha - Greenwich hour angle, the angle between the Greenwich
meridian and the meridian containing the subsolar point.
dec - solar declination.
"""
dg2rad = np.pi/180.
rad2dg = 1./dg2rad
# compute julian day from UTC datetime object.
jday = netcdftime.JulianDayFromDate(date)
jd = np.floor(jday) # truncate to integer.
# utc hour.
ut = d.hour + d.minute/60. + d.second/3600.
# calculate number of centuries from J2000
t = (jd + (ut/24.) - 2451545.0) / 36525.
# mean longitude corrected for aberration
l = (280.460 + 36000.770 * t) % 360
# mean anomaly
g = 357.528 + 35999.050 * t
# ecliptic longitude
lm = l + 1.915 * np.sin(g*dg2rad) + 0.020 * np.sin(2*g*dg2rad)
# obliquity of the ecliptic
ep = 23.4393 - 0.01300 * t
# equation of time
eqtime = -1.915*np.sin(g*dg2rad) - 0.020*np.sin(2*g*dg2rad) \
+ 2.466*np.sin(2*lm*dg2rad) - 0.053*np.sin(4*lm*dg2rad)
# Greenwich hour angle
gha = 15*ut - 180 + eqtime
# declination of sun
dec = np.arcsin(np.sin(ep*dg2rad) * np.sin(lm*dg2rad)) * rad2dg
return gha, dec
def daynightgrid(date, nlons):
"""
date is datetime object (assumed UTC).
nlons is # of longitudes used to compute terminator."""
nlats = ((nlons-1)/2)+1
dg2rad = np.pi/180.
lons = np.linspace(-180,180,nlons)
# compute greenwich hour angle and solar declination
# from datetime object (assumed UTC).
tau, dec = epem(date)
longitude = lons + tau
lats = np.arctan(-np.cos(longitude*dg2rad)/np.tan(dec*dg2rad))/dg2rad
lons2 = np.linspace(-180,180,nlons)
lats2 = np.linspace(-90,90,nlats)
lons2, lats2 = np.meshgrid(lons2,lats2)
daynight = np.ones(lons2.shape, np.float)
for nlon in range(nlons):
daynight[:,nlon] = np.where(lats2[:,nlon]>lats[nlon],0,daynight[:,nlon])
return lons2,lats2,daynight
# now, in UTC time.
d = datetime.utcnow()
# miller projection
map = Basemap(projection='mill',lon_0=0)
# plot coastlines, draw label meridians and parallels.
map.drawcoastlines()
map.drawparallels(np.arange(-90,90,30),labels=[1,0,0,0])
map.drawmeridians(np.arange(-180,180,60),labels=[0,0,0,1])
# create grid of day=0, night=1
lons,lats,daynight = daynightgrid(d,1441)
x,y = map(lons, lats)
# contour this grid with 1 contour level, specifying colors.
# (gray for night, axis background for day)
map.contourf(x,y,daynight,1,colors=[plt.gca().get_axis_bgcolor(),'0.7'])
plt.title('Day/Night Map for %s (UTC)' %d )
plt.show()