This example covers the callable methods of the Python AWIPS DAF when working with gridded data. We start with a connection to an EDEX server, then query data types, then grid names, parameters, levels, and other information. Finally the gridded data is plotted for its domain using Matplotlib and Cartopy.

DataAccessLayer.getSupportedDatatypes()

getSupportedDatatypes() returns a list of available data types offered by the EDEX server defined above.


In [1]:
from awips.dataaccess import DataAccessLayer
DataAccessLayer.changeEDEXHost("edex-cloud.unidata.ucar.edu")
dataTypes = DataAccessLayer.getSupportedDatatypes()
list(dataTypes)


Out[1]:
[b'acars',
 b'binlightning',
 b'bufrmosAVN',
 b'bufrmosETA',
 b'bufrmosGFS',
 b'bufrmosHPC',
 b'bufrmosLAMP',
 b'bufrmosMRF',
 b'bufrua',
 b'climate',
 b'common_obs_spatial',
 b'gfe',
 b'gfeEditArea',
 b'grid',
 b'maps',
 b'modelsounding',
 b'obs',
 b'practicewarning',
 b'profiler',
 b'radar',
 b'radar_spatial',
 b'satellite',
 b'sfcobs',
 b'topo',
 b'warning']

DataAccessLayer.getAvailableLocationNames()

Now create a new data request, and set the data type to grid to request all available grids with getAvailableLocationNames()


In [2]:
request = DataAccessLayer.newDataRequest()
request.setDatatype("grid")
available_grids = DataAccessLayer.getAvailableLocationNames(request)
available_grids.sort()
list(available_grids)


Out[2]:
[b'CMC',
 b'ESTOFS',
 b'ETSS',
 b'FFG-ALR',
 b'FFG-FWR',
 b'FFG-KRF',
 b'FFG-MSR',
 b'FFG-ORN',
 b'FFG-PTR',
 b'FFG-RHA',
 b'FFG-RSA',
 b'FFG-STR',
 b'FFG-TAR',
 b'FFG-TIR',
 b'FFG-TUA',
 b'FNMOC-FAROP',
 b'FNMOC-NCODA',
 b'GFS',
 b'GFS20',
 b'GribModel:9:0:160',
 b'GribModel:9:159:180',
 b'HFR-EAST_6KM',
 b'HFR-EAST_PR_6KM',
 b'HFR-US_EAST_DELAWARE_1KM',
 b'HFR-US_EAST_FLORIDA_2KM',
 b'HFR-US_EAST_NORTH_2KM',
 b'HFR-US_EAST_SOUTH_2KM',
 b'HFR-US_EAST_VIRGINIA_1KM',
 b'HFR-US_HAWAII_1KM',
 b'HFR-US_HAWAII_2KM',
 b'HFR-US_HAWAII_6KM',
 b'HFR-US_WEST_500M',
 b'HFR-US_WEST_CENCAL_2KM',
 b'HFR-US_WEST_LOSANGELES_1KM',
 b'HFR-US_WEST_LOSOSOS_1KM',
 b'HFR-US_WEST_NORTH_2KM',
 b'HFR-US_WEST_SANFRAN_1KM',
 b'HFR-US_WEST_SOCAL_2KM',
 b'HFR-US_WEST_WASHINGTON_1KM',
 b'HFR-WEST_6KM',
 b'HPCGuide',
 b'HPCqpf',
 b'HPCqpfNDFD',
 b'HRRR',
 b'LAMP2p5',
 b'MOSGuide',
 b'NAM12',
 b'NAM40',
 b'NCWF',
 b'NOHRSC-SNOW',
 b'NationalBlend',
 b'PROB3HR',
 b'QPE-RFC-STR',
 b'RAP13',
 b'RFCqpf',
 b'RTMA',
 b'SPCGuide',
 b'SeaIce',
 b'TPCWindProb',
 b'UKMET-MODEL1',
 b'URMA25',
 b'fnmocWave',
 b'nogaps']

DataAccessLayer.getAvailableParameters()

After datatype and model name (locationName) are set, you can query all available parameters with getAvailableParameters()


In [3]:
request.setLocationNames("RAP13")
availableParms = DataAccessLayer.getAvailableParameters(request)
availableParms.sort()
list(availableParms)


Out[3]:
[b'0to5',
 b'2xTP6hr',
 b'36SHRMi',
 b'50dbzZ',
 b'AV',
 b'Along',
 b'AppT',
 b'BLI',
 b'BRN',
 b'BRNEHIi',
 b'BRNSHR',
 b'BRNmag',
 b'BRNvec',
 b'BdEPT06',
 b'BlkMag',
 b'BlkShr',
 b'CAPE',
 b'CFRZR',
 b'CICEP',
 b'CIn',
 b'CP',
 b'CP1hr',
 b'CPr',
 b'CPrD',
 b'CRAIN',
 b'CSNOW',
 b'CURU',
 b'CXR',
 b'CapeStk',
 b'Corf',
 b'CorfF',
 b'CorfFM',
 b'CorfM',
 b'CritT1',
 b'CumNrm',
 b'CumShr',
 b'DIABi',
 b'DivF',
 b'DivFn',
 b'DivFs',
 b'DpD',
 b'DpDt',
 b'DpT',
 b'Dpress',
 b'DthDt',
 b'EHI',
 b'EHI01',
 b'EHIi',
 b'EPT',
 b'EPTA',
 b'EPTC',
 b'EPTGrd',
 b'EPTGrdM',
 b'EPTs',
 b'EPVg',
 b'EPVs',
 b'EPVt1',
 b'EPVt2',
 b'ESP',
 b'ESP2',
 b'FRZR12hr',
 b'FRZRrun',
 b'FVecs',
 b'FeatMot',
 b'FnVecs',
 b'FsVecs',
 b'Fzra1',
 b'Fzra2',
 b'GH',
 b'GHxSM',
 b'GHxSM2',
 b'Gust',
 b'HI',
 b'HI1',
 b'HI3',
 b'HI4',
 b'HIdx',
 b'HPBL',
 b'Heli',
 b'HeliC',
 b'INV',
 b'IPLayer',
 b'Into',
 b'KI',
 b'L-I',
 b'LIsfc2x',
 b'LM5',
 b'LM6',
 b'MAdv',
 b'MCon',
 b'MCon2',
 b'MLLCL',
 b'MMP',
 b'MMSP',
 b'MSFDi',
 b'MSFi',
 b'MSFmi',
 b'MSG',
 b'MTV',
 b'Mix1',
 b'Mix2',
 b'Mmag',
 b'MnT',
 b'MpV',
 b'MxT',
 b'NBE',
 b'NST',
 b'NST1',
 b'NST2',
 b'NetIO',
 b'OmDiff',
 b'P',
 b'PAdv',
 b'PBE',
 b'PEC',
 b'PEC_TT24',
 b'PFrnt',
 b'PGrd',
 b'PGrd1',
 b'PGrdM',
 b'PIVA',
 b'PR',
 b'PTvA',
 b'PTyp',
 b'PVV',
 b'PW',
 b'PW2',
 b'PoT',
 b'PoTA',
 b'QPV1',
 b'QPV2',
 b'QPV3',
 b'QPV4',
 b'REFC',
 b'RH',
 b'RH_001_bin',
 b'RH_002_bin',
 b'RM5',
 b'RM6',
 b'RMGH2',
 b'RMprop',
 b'RMprop2',
 b'RRtype',
 b'RV',
 b'Rain1',
 b'Rain2',
 b'Rain3',
 b'Ro',
 b'SA12hr',
 b'SA1hr',
 b'SA24hr',
 b'SA36hr',
 b'SA3hr',
 b'SA48hr',
 b'SA6hr',
 b'SAcc',
 b'SArun',
 b'SH',
 b'SHx',
 b'SLI',
 b'SNSQ',
 b'SNW',
 b'SNWA',
 b'SRMl',
 b'SRMlM',
 b'SRMm',
 b'SRMmM',
 b'SRMr',
 b'SRMrM',
 b'SSP',
 b'SSi',
 b'STP',
 b'STP1',
 b'Shear',
 b'ShrMag',
 b'SnD',
 b'Snow1',
 b'Snow2',
 b'Snow3',
 b'SnowT',
 b'St-Pr',
 b'StrTP',
 b'StrmMot',
 b'SuCP',
 b'T',
 b'TAdv',
 b'TGrd',
 b'TGrdM',
 b'TORi',
 b'TORi2',
 b'TP',
 b'TP12hr',
 b'TP168hr',
 b'TP1hr',
 b'TP24hr',
 b'TP36hr',
 b'TP3hr',
 b'TP48hr',
 b'TP6hr',
 b'TP72hr',
 b'TPrun',
 b'TPx12x6',
 b'TPx1x3',
 b'TQIND',
 b'TShrMi',
 b'TV',
 b'TW',
 b'T_001_bin',
 b'Tdef',
 b'Tdend',
 b'ThGrd',
 b'Thom5',
 b'Thom5a',
 b'Thom6',
 b'TmDpD',
 b'Tmax',
 b'Tmin',
 b'Topo',
 b'TotQi',
 b'Tstk',
 b'TwMax',
 b'TwMin',
 b'Twstk',
 b'TxSM',
 b'USTM',
 b'VAdv',
 b'VAdvAdvection',
 b'VGP',
 b'VSTM',
 b'Vis',
 b'WCD',
 b'WD',
 b'WEASD',
 b'WEASD1hr',
 b'WGS',
 b'Wind',
 b'WndChl',
 b'ageoVC',
 b'ageoW',
 b'ageoWM',
 b'cCape',
 b'cCin',
 b'cTOT',
 b'capeToLvl',
 b'dCape',
 b'dGH12',
 b'dP',
 b'dP1hr',
 b'dP3hr',
 b'dP6hr',
 b'dPW1hr',
 b'dPW3hr',
 b'dPW6hr',
 b'dT',
 b'dVAdv',
 b'dZ',
 b'defV',
 b'del2gH',
 b'df',
 b'fGen',
 b'fnD',
 b'fsD',
 b'gamma',
 b'gammaE',
 b'geoVort',
 b'geoW',
 b'geoWM',
 b'loCape',
 b'maxEPT',
 b'minEPT',
 b'mixRat',
 b'msl-P',
 b'muCape',
 b'pV',
 b'pVeq',
 b'qDiv',
 b'qVec',
 b'qnVec',
 b'qsVec',
 b'shWlt',
 b'snoRat',
 b'snoRatCrocus',
 b'snoRatEMCSREF',
 b'snoRatOv2',
 b'snoRatSPC',
 b'snoRatSPCdeep',
 b'snoRatSPCsurface',
 b'staticCoriolis',
 b'staticSpacing',
 b'staticTopo',
 b'swtIdx',
 b'tTOT',
 b'tWind',
 b'tWindU',
 b'tWindV',
 b'uFX',
 b'uW',
 b'uWStk',
 b'ulSnoRat',
 b'vSmthW',
 b'vTOT',
 b'vW',
 b'vWStk',
 b'vertCirc',
 b'wDiv',
 b'wSp',
 b'wSp_001_bin',
 b'wSp_002_bin',
 b'wSp_003_bin',
 b'wSp_004_bin',
 b'zAGL']

DataAccessLayer.getAvailableLevels()

Selecting "T" for temperature.


In [4]:
request.setParameters("T")
availableLevels = DataAccessLayer.getAvailableLevels(request)
for level in availableLevels:
    print(level)


100.0b'MB'
175.0b'MB'
125.0b'MB'
200.0b'MB'
150.0b'MB'
250.0b'MB'
225.0b'MB'
275.0b'MB'
300.0b'MB'
325.0b'MB'
350.0b'MB'
400.0b'MB'
375.0b'MB'
425.0b'MB'
450.0b'MB'
475.0b'MB'
500.0b'MB'
525.0b'MB'
550.0b'MB'
575.0b'MB'
650.0b'MB'
625.0b'MB'
600.0b'MB'
675.0b'MB'
700.0b'MB'
725.0b'MB'
750.0b'MB'
775.0b'MB'
825.0b'MB'
800.0b'MB'
850.0b'MB'
875.0b'MB'
900.0b'MB'
925.0b'MB'
975.0b'MB'
1000.0b'MB'
0.0b'SFC'
950.0b'MB'
0.0b'TROP'
340.0_350.0b'K'
290.0_300.0b'K'
700.0_600.0b'MB'
700.0_300.0b'MB'
320.0b'Ke'
800.0_750.0b'MB'
0.0_610.0b'FHAG'
60.0b'TILT'
5.3b'TILT'
1000.0_900.0b'MB'
340.0b'K'
1000.0_500.0b'MB'
5500.0_6000.0b'FHAG'
255.0b'K'
255.0_265.0b'K'
3000.0_6000.0b'FHAG'
25.0b'TILT'
2000.0b'FHAG'
0.0_500.0b'FHAG'
1000.0_850.0b'MB'
850.0_250.0b'MB'
280.0_290.0b'Ke'
1524.0b'FHAG'
320.0_330.0b'K'
0.0b'TILT'
150.0_180.0b'BL'
0.0_30.0b'BL'
310.0_320.0b'Ke'
310.0b'Ke'
330.0b'K'
900.0_800.0b'MB'
550.0_500.0b'MB'
2.4b'TILT'
50.0b'TILT'
3500.0b'FHAG'
35.0b'TILT'
12.0b'TILT'
300.0_310.0b'K'
3000.0_12000.0b'FHAG'
0.9b'TILT'
320.0b'K'
400.0_350.0b'MB'
500.0b'FHAG'
750.0_700.0b'MB'
1000.0_400.0b'MB'
345.0b'K'
250.0_260.0b'K'
300.0b'Ke'
290.0b'Ke'
950.0_900.0b'MB'
4572.0b'FHAG'
275.0_285.0b'Ke'
335.0b'Ke'
295.0_305.0b'Ke'
275.0_285.0b'K'
600.0_550.0b'MB'
310.0b'K'
9000.0b'FHAG'
335.0b'K'
1000.0_7000.0b'FHAG'
700.0_500.0b'MB'
9144.0b'FHAG'
325.0_335.0b'K'
2000.0_8000.0b'FHAG'
0.0_609.6b'FHAG'
300.0b'K'
0.0b'MAXOMEGA'
315.0_325.0b'K'
325.0b'K'
340.0b'Ke'
0.0_4000.0b'FHAG'
5000.0_5500.0b'FHAG'
300.0_250.0b'MB'
1.5b'TILT'
335.0_345.0b'K'
2.0b'FHAG'
315.0b'K'
3.4b'TILT'
2500.0b'FHAG'
10000.0b'FHAG'
0.0_2000.0b'FHAG'
7000.0b'FHAG'
0.0_1000.0b'FHAG'
5000.0b'FHAG'
330.0b'Ke'
90.0_120.0b'BL'
500.0_400.0b'MB'
1000.0_1500.0b'FHAG'
305.0b'K'
285.0_295.0b'Ke'
14.0b'TILT'
3000.0_3500.0b'FHAG'
325.0_335.0b'Ke'
2000.0_5000.0b'FHAG'
7620.0b'FHAG'
850.0_800.0b'MB'
120.0_150.0b'BL'
6096.0b'FHAG'
6000.0_7000.0b'FHAG'
2000.0_7000.0b'FHAG'
9000.0_10000.0b'FHAG'
295.0b'Ke'
305.0b'Ke'
30.0_60.0b'BL'
265.0_275.0b'K'
7000.0_8000.0b'FHAG'
3000.0_8000.0b'FHAG'
700.0_650.0b'MB'
1000.0_6000.0b'FHAG'
0.5b'TILT'
450.0_400.0b'MB'
1.8b'TILT'
330.0_340.0b'K'
800.0_700.0b'MB'
850.0_300.0b'MB'
4000.0b'FHAG'
6.0b'TILT'
900.0_850.0b'MB'
3657.6b'FHAG'
0.0_5000.0b'FHAG'
320.0_330.0b'Ke'
8.7b'TILT'
650.0_600.0b'MB'
0.0b'FHAG'
600.0_400.0b'MB'
55.0b'TILT'
270.0_280.0b'Ke'
30.0b'TILT'
310.0_320.0b'K'
1500.0b'FHAG'
1000.0_950.0b'MB'
1.0b'PV'
5500.0b'FHAG'
250.0_200.0b'MB'
1.5b'PV'
500.0_1000.0b'FHAG'
400.0_300.0b'MB'
500.0_100.0b'MB'
1000.0_3000.0b'FHAG'
8000.0b'FHAG'
285.0b'Ke'
290.0b'K'
305.0_315.0b'K'
285.0_295.0b'K'
0.0_2500.0b'FHAG'
925.0_850.0b'MB'
275.0b'Ke'
1500.0_2000.0b'FHAG'
2.0b'PV'
300.0_200.0b'MB'
610.0_40000.0b'FHAG'
260.0_270.0b'K'
0.0_6000.0b'FHAG'
2743.2b'FHAG'
3000.0b'FHAG'
315.0_325.0b'Ke'
600.0_500.0b'MB'
16.7b'TILT'
0.5b'PV'
280.0b'K'
500.0_250.0b'MB'
40.0b'TILT'
1000.0b'FHAG'
3048.0b'FHAG'
400.0_200.0b'MB'
300.0_310.0b'Ke'
270.0_280.0b'K'
1000.0_700.0b'MB'
45.0b'TILT'
850.0_500.0b'MB'
60.0_90.0b'BL'
2500.0_3000.0b'FHAG'
609.6b'FHAG'
0.0_8000.0b'FHAG'
295.0b'K'
4.3b'TILT'
295.0_305.0b'K'
330.0_340.0b'Ke'
270.0b'K'
4000.0_4500.0b'FHAG'
280.0_290.0b'K'
925.0_700.0b'MB'
0.0_1500.0b'FHAG'
260.0b'K'
10.0b'TILT'
3500.0_4000.0b'FHAG'
325.0b'Ke'
285.0b'K'
290.0_300.0b'Ke'
7.5b'TILT'
1828.8b'FHAG'
280.0b'Ke'
500.0_450.0b'MB'
305.0_315.0b'Ke'
250.0b'K'
4500.0b'FHAG'
1250.0b'FHAG'
0.0_10000.0b'FHAG'
4500.0_5000.0b'FHAG'
250.0_350.0b'K'
270.0b'Ke'
275.0b'K'
315.0b'Ke'
500.0_300.0b'MB'
350.0_300.0b'MB'
750.0b'FHAG'
19.5b'TILT'
0.0_3000.0b'FHAG'
2000.0_2500.0b'FHAG'
850.0_700.0b'MB'
350.0b'K'
265.0b'K'
6000.0b'FHAG'
8000.0_9000.0b'FHAG'
  • 0.0SFC is the Surface level
  • FHAG stands for Fixed Height Above Ground (in meters)
  • NTAT stands for Nominal Top of the ATmosphere
  • BL stands for Boundary Layer, where 0.0_30.0BL reads as 0-30 mb above ground level
  • TROP is the Tropopause level

request.setLevels()

For this example we will use Surface Temperature


In [5]:
request.setLevels("2.0FHAG")

DataAccessLayer.getAvailableTimes()

  • getAvailableTimes(request, True) will return an object of run times - formatted as YYYY-MM-DD HH:MM:SS
  • getAvailableTimes(request) will return an object of all times - formatted as YYYY-MM-DD HH:MM:SS (F:ff)
  • getForecastRun(cycle, times) will return a DataTime array for a single forecast cycle.

In [6]:
cycles = DataAccessLayer.getAvailableTimes(request, True)
times = DataAccessLayer.getAvailableTimes(request)
fcstRun = DataAccessLayer.getForecastRun(cycles[-1], times)
list(fcstRun)


Out[6]:
[<DataTime instance: 2018-10-05 20:00:00 >,
 <DataTime instance: 2018-10-05 20:00:00 >,
 <DataTime instance: 2018-10-05 20:00:00 >,
 <DataTime instance: 2018-10-05 20:00:00 >,
 <DataTime instance: 2018-10-05 20:00:00 >,
 <DataTime instance: 2018-10-05 20:00:00 >,
 <DataTime instance: 2018-10-05 20:00:00 >,
 <DataTime instance: 2018-10-05 20:00:00 >,
 <DataTime instance: 2018-10-05 20:00:00 >,
 <DataTime instance: 2018-10-05 20:00:00 >,
 <DataTime instance: 2018-10-05 20:00:00 >,
 <DataTime instance: 2018-10-05 20:00:00 >,
 <DataTime instance: 2018-10-05 20:00:00 >,
 <DataTime instance: 2018-10-05 20:00:00 >]

DataAccessLayer.getGridData()

Now that we have our request and DataTime fcstRun arrays ready, it's time to request the data array from EDEX.


In [7]:
response = DataAccessLayer.getGridData(request, [fcstRun[-1]])
for grid in response:
    data = grid.getRawData()
    lons, lats = grid.getLatLonCoords()
    print('Time :', str(grid.getDataTime()))

print('Model:', str(grid.getLocationName()))
print('Parm :', str(grid.getParameter()))
print('Unit :', str(grid.getUnit()))
print(data.shape)


Time : 2018-10-05 20:00:00
Model: b'RAP13'
Parm : b'T'
Unit : b'K'
(337, 451)

Plotting with Matplotlib and Cartopy

1. pcolormesh


In [8]:
%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
import numpy as np
import numpy.ma as ma
from scipy.io import loadmat
def make_map(bbox, projection=ccrs.PlateCarree()):
    fig, ax = plt.subplots(figsize=(16, 9),
                           subplot_kw=dict(projection=projection))
    ax.set_extent(bbox)
    ax.coastlines(resolution='50m')
    gl = ax.gridlines(draw_labels=True)
    gl.xlabels_top = gl.ylabels_right = False
    gl.xformatter = LONGITUDE_FORMATTER
    gl.yformatter = LATITUDE_FORMATTER
    return fig, ax

cmap = plt.get_cmap('rainbow')
bbox = [lons.min(), lons.max(), lats.min(), lats.max()]
fig, ax = make_map(bbox=bbox)
cs = ax.pcolormesh(lons, lats, data, cmap=cmap)
cbar = fig.colorbar(cs, extend='both', shrink=0.5, orientation='horizontal')
cbar.set_label(grid.getLocationName().decode('UTF-8')  +" " \
               + grid.getLevel().decode('UTF-8') + " " \
               + grid.getParameter().decode('UTF-8') \
               + " (" + grid.getUnit().decode('UTF-8') + ") " \
               + "valid " + str(grid.getDataTime().getRefTime()))


2. contourf


In [9]:
fig2, ax2 = make_map(bbox=bbox)
cs2 = ax2.contourf(lons, lats, data, 80, cmap=cmap,
                  vmin=data.min(), vmax=data.max())
cbar2 = fig2.colorbar(cs2, extend='both', shrink=0.5, orientation='horizontal')
cbar2.set_label(grid.getLocationName().decode('UTF-8')  +" " \
               + grid.getLevel().decode('UTF-8') + " " \
               + grid.getParameter().decode('UTF-8') \
               + " (" + grid.getUnit().decode('UTF-8') + ") " \
               + "valid " + str(grid.getDataTime().getRefTime()))