Due to the current gap in continued funding from the U.S. National Science Foundation (NSF), the NSF Unidata Program Center has temporarily paused most operations. See NSF Unidata Pause in Most Operations for details.

Requesting Grid Parameters and Levels with python-awips

The Python AWIPS Data Access Framework can be used to query available grid parameters and levels if given a known Grid name (as of AWIPS 15.1.3 we can not query derived parameters, only parameters which have been directly decoded).

This example requests the U and V wind components for the GFS 40km CONUS and plots the wind speed (total vector) as a gridded contour (color-filled isotachs, essentially):

from awips.dataaccess import DataAccessLayer    # Select grid  DataAccessLayer.changeEDEXHost('edex-cloud.unidata.ucar.edu')  request = DataAccessLayer.newDataRequest()  request.setDatatype('grid')  request.setLocationNames('RAP13')  

grid is given as the data type, and RAP13 is given as the grid name. The function getAvailableParameters() returns a list of parameters:

# Print parm list  available_parms = DataAccessLayer.getAvailableParameters(request)  available_parms.sort()  for parm in available_parms:      print parm  

printed as

    AV      BLI      CAPE      CFRZR6hr      CICEP6hr      CIn      CP6hr      CRAIN6hr      CSNOW6hr      GH      P      P6hr      PMSL      PVV      PW      RH      SLI      T      TP6hr      VSS      WEASD      WGH      uW      vW  

List Available Levels for Parameter

Selecting the u wind component (uW) first and printing the return from getAvailableLevels():

request.setParameters('uW')  available_levels = DataAccessLayer.getAvailableLevels(request)  available_levels.sort()  for level in available_levels:      print level  

prints as

    1000.0MB      950.0MB      925.0MB      900.0MB      875.0MB      850.0MB      825.0MB      800.0MB      775.0MB      725.0MB      600.0MB      575.0MB      0.0_30.0BL      60.0_90.0BL      90.0_120.0BL      0.5PV      2.0PV      30.0_60.0BL      1.0PV      750.0MB      120.0_150.0BL      975.0MB      700.0MB      675.0MB      650.0MB      625.0MB      550.0MB      525.0MB      500.0MB      450.0MB      400.0MB      300.0MB      250.0MB      200.0MB      150.0MB      100.0MB      0.0TROP      1.5PV      150.0_180.0BL      350.0MB      10.0FHAG      0.0MAXW  

Construct Wind Field from U and V Components

Calling setLevels("10.0FHAG") and selecting the last available time t[-1]:

import numpy  from metpy.units import units  request.setLevels('10.0FHAG')  t = DataAccessLayer.getAvailableTimes(request)  # Select last time for u-wind  response = DataAccessLayer.getGridData(request, [t[-1]])  data_uw = response[-1]  lons,lats = data_uw.getLatLonCoords()  

Requesting the grid for v wind componeents (vW):

request.setParameters('vW')  response = DataAccessLayer.getGridData(request, [t[-1]])  data_vw = response[-1]    print 'Time :', t[-1]  print 'Model:', data_vw.getLocationName()  print 'Unit :', data_vw.getUnit()  print 'Parms :', data_uw.getParameter(), data_vw.getParameter()  print data_vw.getRawData().shape  

prints as

    Time : 2016-04-20 18:00:00 (240)      Model: GFS40      Unit : m*sec^-1      Parms : vW vW      (185, 129)      windArray = [[ 1.47078204  1.69705617  0.69296461 ...,  6.98621511 ...,  0.91923875  1.24450791   1.28693426]]   

Calculate absolute wind speed from U and V

The data objects data_uw.getRawData() and data_vw.getRawData()

spd = numpy.sqrt( data_uw.getRawData()**2 + data_vw.getRawData()**2 )  spd = spd * units.knot  print 'windArray =', spd  

Plotting a Grid with Basemap

Using matplotlib, numpy, and basemap:

python  %matplotlib inline  import matplotlib.tri as mtri  import matplotlib.pyplot as plt  from matplotlib.transforms import offset_copy  from mpl_toolkits.basemap import Basemap, cm  import numpy as np  from numpy import linspace, transpose  from numpy import meshgrid    plt.figure(figsize=(12, 12), dpi=100)    map = Basemap(projection='cyl',        resolution = 'c',        llcrnrlon = lons.min(), llcrnrlat = lats.min(),        urcrnrlon =lons.max(), urcrnrlat = lats.max()  )  map.drawcoastlines()  map.drawstates()  map.drawcountries()    #   # We have to reproject our grid, see https://stackoverflow.com/questions/31822553/m  #  x = linspace(0, map.urcrnrx, data_uw.getRawData().shape[1])  y = linspace(0, map.urcrnry, data_uw.getRawData().shape[0])  xx, yy = meshgrid(x, y)  ngrid = len(x)  rlons = np.repeat(np.linspace(np.min(lons), np.max(lons), ngrid),        ngrid).reshape(ngrid, ngrid)  rlats = np.repeat(np.linspace(np.min(lats), np.max(lats), ngrid),        ngrid).reshape(ngrid, ngrid).T  tli = mtri.LinearTriInterpolator(mtri.Triangulation(lons.flatten(),        lats.flatten()), spd.flatten())  rdata = tli(rlons, rlats)  #cs = map.contourf(rlons, rlats, rdata, latlon=True)  cs = map.contourf(rlons, rlats, rdata, latlon=True, vmin=0, vmax=20, cmap='BuPu')    # Add colorbar  cbar = map.colorbar(cs,location='bottom',pad='5%')    cbar.set_label('Wind Speed (Knots)')    # Show plot  plt.show()  

png

or use pcolormesh rather than contourf

python  plt.figure(figsize=(12, 12), dpi=100)  map = Basemap(projection='cyl',        resolution = 'c',        llcrnrlon = lons.min(), llcrnrlat = lats.min(),        urcrnrlon =lons.max(), urcrnrlat = lats.max()  )  map.drawcoastlines()  map.drawstates()  map.drawcountries()  cs = map.pcolormesh(rlons, rlats, rdata, latlon=True, vmin=0, vmax=20, cmap='BuPu')  

png

Plotting a Grid with Cartopy

python  import os  import matplotlib.pyplot as plt  import numpy as np  import iris  import cartopy.crs as ccrs  from cartopy import config    lon,lat = data.getLatLonCoords()  plt.figure(figsize=(12, 12), dpi=100)  ax = plt.axes(projection=ccrs.PlateCarree())  cs = plt.contourf(rlons, rlats, rdata, 60, transform=ccrs.PlateCarree(), vmin=0, vmax=20, cmap='BuPu')  ax.coastlines()  ax.gridlines()    # add colorbar  cbar = plt.colorbar(orientation='horizontal')  cbar.set_label('Wind Speed (Knots)')  plt.show()  

png

Comments:

Post a Comment:
Comments are closed for this entry.
Unidata Developer's Blog
A weblog about software development by Unidata developers*
Unidata Developer's Blog
A weblog about software development by Unidata developers*

Welcome

FAQs

News@Unidata blog

Take a poll!

What if we had an ongoing user poll in here?

Browse By Topic
Browse by Topic
« May 2025
SunMonTueWedThuFriSat
    
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
       
Today