2016-03-12 14:17:35 -07:00
{
"cells": [
2016-03-12 20:07:23 -06:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Python AWIPS Data Access Framework\n",
"\n",
2016-03-13 19:38:46 -05:00
"The [`python-awips`](http://www.github.com/Unidata/python-awips) package provides a Data Acccess Framework (DAF) for requesting data from a remote AWIPS II EDEX server. \n",
2016-03-12 20:07:23 -06:00
"\n",
2016-03-13 19:38:46 -05:00
"The [AWIPS II Python Stack](http://) installed via RPM contains the DAF, matplotlib, numpy, scipy, basemap, pint, shapely, and other packages. \n",
2016-03-12 20:07:23 -06:00
"\n",
"## Listing a Grid Inventory"
]
},
2016-03-12 14:17:35 -07:00
{
"cell_type": "code",
2016-03-14 20:35:57 -05:00
"execution_count": 317,
2016-03-12 14:17:35 -07:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2016-03-12 22:17:13 -06:00
"AVN211\n",
"AVN225\n",
"DGEX\n",
"ECMF-Global\n",
"ECMF1\n",
"ECMF10\n",
"ECMF11\n",
"ECMF12\n",
"ECMF2\n",
2016-03-12 14:17:35 -07:00
"ECMF3\n",
"ECMF4\n",
"ECMF5\n",
2016-03-12 22:17:13 -06:00
"ECMF6\n",
"ECMF7\n",
2016-03-12 14:17:35 -07:00
"ECMF8\n",
2016-03-12 22:17:13 -06:00
"ECMF9\n",
2016-03-12 14:17:35 -07:00
"ETA\n",
"GFS\n",
2016-03-12 22:17:13 -06:00
"GFS40\n",
"GFSGuide\n",
"GFSLAMP5\n",
"HPCGuide\n",
"HPCqpfNDFD\n",
"HRRR\n",
"LAMP2p5\n",
"MRMS_1000\n",
2016-03-12 14:17:35 -07:00
"NAM12\n",
2016-03-12 22:17:13 -06:00
"NAM40\n",
2016-03-12 14:17:35 -07:00
"NCWF\n",
"NOHRSC-SNOW\n",
2016-03-12 22:17:13 -06:00
"NamDNG\n",
"NamDNG5\n",
"QPE-MSR\n",
"RAP13\n",
"RAP40\n",
"RTMA\n",
"RTMA5\n",
"URMA25\n",
"estofsPR\n",
"estofsUS\n"
2016-03-12 14:17:35 -07:00
]
}
],
"source": [
"from awips.dataaccess import DataAccessLayer\n",
"\n",
"# Set host\n",
"DataAccessLayer.changeEDEXHost(\"edex-cloud.unidata.ucar.edu\")\n",
"\n",
"# Init data request\n",
"request = DataAccessLayer.newDataRequest()\n",
"\n",
"# Set datatype\n",
"request.setDatatype(\"grid\")\n",
"\n",
2016-03-13 19:38:46 -05:00
"# Get a list of all available models\n",
2016-03-12 14:17:35 -07:00
"available_grids = DataAccessLayer.getAvailableLocationNames(request)\n",
2016-03-13 19:38:46 -05:00
"\n",
"# Sort\n",
2016-03-12 22:17:13 -06:00
"available_grids.sort()\n",
2016-03-13 19:38:46 -05:00
"\n",
2016-03-12 14:17:35 -07:00
"for grid in available_grids:\n",
2016-03-12 22:17:13 -06:00
" print grid"
2016-03-12 14:17:35 -07:00
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
2016-03-12 20:07:23 -06:00
"**LocationNames** is different for different plugins\n",
2016-03-12 14:17:35 -07:00
"- radar is icao\n",
2016-03-12 20:07:23 -06:00
"- satellite is sector\n",
"\n",
"\n",
"## Requesting a Grid"
2016-03-12 14:17:35 -07:00
]
},
{
"cell_type": "code",
2016-03-14 20:35:57 -05:00
"execution_count": 318,
2016-03-12 14:17:35 -07:00
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2016-03-12 22:17:13 -06:00
"Time : 2016-02-23 15:00:00 (12)\n",
"Model: RAP40\n",
"Unit : %\n",
"Parm : RH\n",
"(151, 113)\n",
"[[ 93.05456543 93.05456543 87.05456543 ..., 73.05456543 72.05456543\n",
" 71.05456543]\n",
" [ 70.05456543 70.05456543 67.05456543 ..., 69.05456543 46.05456924\n",
" 37.05456924]\n",
" [ 40.05456924 56.05456924 68.05456543 ..., 51.05456924 73.05456543\n",
" 74.05456543]\n",
2016-03-12 14:17:35 -07:00
" ..., \n",
2016-03-12 22:17:13 -06:00
" [ 65.05456543 62.05456924 63.05456924 ..., 67.05456543 65.05456543\n",
" 46.05456924]\n",
" [ 48.05456924 59.05456924 62.05456924 ..., 4.05456877 5.05456877\n",
" 5.05456877]\n",
" [ 7.05456877 8.05456829 10.05456829 ..., 91.05456543 95.05456543\n",
" 95.05456543]]\n",
2016-03-12 14:17:35 -07:00
"lat array = [[ 54.24940109 54.35071945 54.45080566 ..., 57.9545517 57.91926193\n",
" 57.88272858]\n",
" [ 57.84495163 57.80593109 57.76566696 ..., 58.07667542 58.08861542\n",
" 58.09931183]\n",
" [ 58.10876846 58.11697769 58.12394714 ..., 56.40270996 56.46187973\n",
" 56.51980972]\n",
" ..., \n",
" [ 19.93209648 19.89832115 19.86351395 ..., 20.054636 20.06362152\n",
" 20.07156372]\n",
" [ 20.0784626 20.08431816 20.08912849 ..., 18.58354759 18.63155174\n",
" 18.67854691]\n",
" [ 18.72453308 18.76950836 18.81346893 ..., 17.49624634 17.42861557\n",
" 17.36001205]]\n",
"lon array = [[-139.83120728 -139.32348633 -138.81448364 ..., -79.26060486\n",
" -78.70166016 -78.14326477]\n",
" [ -77.58544922 -77.02822876 -76.47161865 ..., -100.70157623\n",
" -100.13801575 -99.57427216]\n",
" [ -99.01037598 -98.44634247 -97.88218689 ..., -121.69165039\n",
" -121.15060425 -120.60871887]\n",
" ..., \n",
" [ -82.65139008 -82.26644897 -81.88170624 ..., -98.52494049\n",
" -98.13802338 -97.75105286]\n",
" [ -97.36403656 -96.97698212 -96.58989716 ..., -113.07767487\n",
" -112.69831085 -112.31866455]\n",
" [-111.93874359 -111.5585556 -111.17810822 ..., -69.85433197\n",
" -69.48160553 -69.10926819]]\n"
]
}
],
"source": [
"# Grid request\n",
"request.setLocationNames('RAP40')\n",
2016-03-12 20:07:23 -06:00
"request.setParameters(\"RH\")\n",
"request.setLevels(\"850MB\")\n",
2016-03-12 14:17:35 -07:00
"\n",
"# Get available times\n",
"t = DataAccessLayer.getAvailableTimes(request)\n",
"\n",
"# Select last available time [-1]\n",
2016-03-12 22:17:13 -06:00
"response = DataAccessLayer.getGridData(request, [t[0]])\n",
2016-03-12 14:17:35 -07:00
"data = response[0]\n",
2016-03-12 22:17:13 -06:00
"lon,lat = data.getLatLonCoords()\n",
2016-03-12 14:17:35 -07:00
"\n",
"# Print info\n",
2016-03-12 22:17:13 -06:00
"print 'Time :', t[-1]\n",
"print 'Model:', data.getLocationName()\n",
"print 'Unit :', data.getUnit()\n",
"print 'Parm :', data.getParameter()\n",
2016-03-12 14:17:35 -07:00
"\n",
"# Print data array\n",
2016-03-12 22:17:13 -06:00
"print data.getRawData().shape\n",
2016-03-12 14:17:35 -07:00
"print data.getRawData()\n",
"print \"lat array =\", lat\n",
2016-03-12 22:17:13 -06:00
"print \"lon array =\", lon\n"
2016-03-12 14:17:35 -07:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2016-03-14 20:35:57 -05:00
"## Plotting a Grid with Basemap\n",
2016-03-12 14:17:35 -07:00
"\n",
2016-03-12 20:07:23 -06:00
"Using **matplotlib**, **numpy**, and **basemap**:"
2016-03-12 14:17:35 -07:00
]
},
{
"cell_type": "code",
2016-03-14 20:35:57 -05:00
"execution_count": 319,
2016-03-12 14:17:35 -07:00
"metadata": {
"collapsed": false
},
2016-03-12 20:07:23 -06:00
"outputs": [
{
"data": {
2016-03-12 22:17:13 -06:00
"image/png": "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\nYxkwOkfWY7oilEWujWC
2016-03-12 20:07:23 -06:00
"text/plain": [
2016-03-14 20:35:57 -05:00
"<matplotlib.figure.Figure at 0x7f942104d8d0>"
2016-03-12 20:07:23 -06:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
2016-03-12 14:17:35 -07:00
"source": [
"%matplotlib inline\n",
"import matplotlib.tri as mtri\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib.transforms import offset_copy\n",
"from mpl_toolkits.basemap import Basemap, cm\n",
"import numpy as np\n",
"from numpy import linspace, transpose\n",
"from numpy import meshgrid\n",
"\n",
2016-03-12 20:07:23 -06:00
"plt.figure(figsize=(12, 12), dpi=100)\n",
2016-03-12 14:17:35 -07:00
"lons,lats = data.getLatLonCoords()\n",
"\n",
"map = Basemap(projection='cyl',\n",
" resolution = 'c',\n",
" llcrnrlon = lons.min(), llcrnrlat = lats.min(),\n",
" urcrnrlon =lons.max(), urcrnrlat = lats.max()\n",
")\n",
"map.drawcoastlines()\n",
"map.drawstates()\n",
"map.drawcountries()\n",
2016-03-12 20:07:23 -06:00
"\n",
"# \n",
"# We have to reproject our grid, see https://stackoverflow.com/questions/31822553/m\n",
"#\n",
2016-03-12 14:17:35 -07:00
"x = linspace(0, map.urcrnrx, data.getRawData().shape[1])\n",
"y = linspace(0, map.urcrnry, data.getRawData().shape[0])\n",
"xx, yy = meshgrid(x, y)\n",
"ngrid = len(x)\n",
"rlons = np.repeat(np.linspace(np.min(lons), np.max(lons), ngrid),\n",
" ngrid).reshape(ngrid, ngrid)\n",
"rlats = np.repeat(np.linspace(np.min(lats), np.max(lats), ngrid),\n",
" ngrid).reshape(ngrid, ngrid).T\n",
"tli = mtri.LinearTriInterpolator(mtri.Triangulation(lons.flatten(),\n",
" lats.flatten()), data.getRawData().flatten())\n",
"rdata = tli(rlons, rlats)\n",
2016-03-12 22:17:13 -06:00
"cs = map.contourf(rlons, rlats, rdata, latlon=True, vmin=0, vmax=100, cmap='YlGn')\n",
2016-03-12 14:17:35 -07:00
"\n",
"# add colorbar.\n",
"cbar = map.colorbar(cs,location='bottom',pad=\"5%\")\n",
2016-03-12 20:07:23 -06:00
"cbar.set_label(data.getParameter() + data.getUnit() )\n",
"\n",
"# Show plot\n",
2016-03-12 14:17:35 -07:00
"plt.show()\n"
]
},
2016-03-12 22:17:13 -06:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
2016-03-14 20:35:57 -05:00
"### or use pcolormesh rather than contourf"
2016-03-12 22:17:13 -06:00
]
},
{
"cell_type": "code",
2016-03-14 20:35:57 -05:00
"execution_count": 320,
2016-03-12 22:17:13 -06:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nt5PefbIYNrKA4aMKuGT
"text/plain": [
2016-03-14 20:35:57 -05:00
"<matplotlib.figure.Figure at 0x7f9421306cd0>"
2016-03-12 22:17:13 -06:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(12, 12), dpi=100)\n",
"map = Basemap(projection='cyl',\n",
" resolution = 'c',\n",
" llcrnrlon = lons.min(), llcrnrlat = lats.min(),\n",
" urcrnrlon =lons.max(), urcrnrlat = lats.max()\n",
")\n",
"map.drawcoastlines()\n",
"map.drawstates()\n",
"map.drawcountries()\n",
"cs = map.pcolormesh(rlons, rlats, rdata, latlon=True, vmin=0, vmax=100, cmap='YlGn')"
]
},
2016-03-12 20:07:23 -06:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Plotting a Grid using Cartopy\n"
]
},
2016-03-12 14:17:35 -07:00
{
"cell_type": "code",
2016-03-14 20:35:57 -05:00
"execution_count": 321,
2016-03-12 14:17:35 -07:00
"metadata": {
2016-03-12 20:07:23 -06:00
"collapsed": false
2016-03-12 14:17:35 -07:00
},
2016-03-12 20:07:23 -06:00
"outputs": [
2016-03-12 22:17:13 -06:00
{
"data": {
2016-03-13 19:38:46 -05:00
"image/png": "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\nS7Unol5Cy8hsmDvBVBJ
2016-03-12 22:17:13 -06:00
"text/plain": [
2016-03-14 20:35:57 -05:00
"<matplotlib.figure.Figure at 0x7f94213dbad0>"
2016-03-12 22:17:13 -06:00
]
},
"metadata": {},
"output_type": "display_data"
2016-03-12 20:07:23 -06:00
}
],
"source": [
"import os\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
2016-03-12 22:17:13 -06:00
"import iris\n",
2016-03-12 20:07:23 -06:00
"import cartopy.crs as ccrs\n",
2016-03-12 22:17:13 -06:00
"from cartopy import config\n",
2016-03-12 20:07:23 -06:00
"\n",
2016-03-12 22:17:13 -06:00
"lon,lat = data.getLatLonCoords()\n",
"plt.figure(figsize=(12, 12), dpi=100)\n",
"ax = plt.axes(projection=ccrs.PlateCarree())\n",
"cs = plt.contourf(rlons, rlats, rdata, 60, transform=ccrs.PlateCarree(), vmin=0, vmax=100, cmap='YlGn')\n",
"ax.coastlines()\n",
"ax.gridlines()\n",
"\n",
"# add colorbar\n",
2016-03-13 19:38:46 -05:00
"cbar = plt.colorbar(orientation='horizontal')\n",
2016-03-12 22:17:13 -06:00
"cbar.set_label(data.getParameter() + data.getUnit() )\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"# Plotting a Sounding with MetPy"
]
},
{
"cell_type": "code",
2016-03-14 20:35:57 -05:00
"execution_count": 322,
2016-03-12 22:17:13 -06:00
"metadata": {
"collapsed": false
},
"outputs": [
{
2016-03-13 19:38:46 -05:00
"data": {
2016-03-14 20:35:57 -05:00
"image/png": "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\nVAdN/Krfztdut+L8+SO
2016-03-13 19:38:46 -05:00
"text/plain": [
2016-03-14 20:35:57 -05:00
"<matplotlib.figure.Figure at 0x7f9421944410>"
2016-03-13 19:38:46 -05:00
]
},
"metadata": {},
"output_type": "display_data"
2016-03-12 22:17:13 -06:00
}
],
"source": [
2016-03-13 19:38:46 -05:00
"from metpy.calc import get_wind_components, lcl, dry_lapse, parcel_profile\n",
"from metpy.calc import tools\n",
"from metpy.plots import SkewT, Hodograph\n",
"from metpy.units import units, concatenate\n",
"from mpl_toolkits.axes_grid1.inset_locator import inset_axes\n",
2016-03-12 22:17:13 -06:00
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
2016-03-12 20:07:23 -06:00
"\n",
2016-03-12 22:17:13 -06:00
"# Change default to be better for skew-T\n",
2016-03-13 19:40:41 -05:00
"plt.rcParams['figure.figsize'] = (9, 9)\n",
2016-03-13 19:38:46 -05:00
"\n",
"# Request BUFR UAIR\n",
"request.setDatatype(\"bufrua\")\n",
"request.setParameters(\"tpMan\",\"tdMan\",\"prMan\",\"htMan\",\"wdMan\",\"wsMan\")\n",
2016-03-14 20:35:57 -05:00
"# Lake Charles, LA\n",
"#request.setLocationNames(\"KLCH\") # this doesn't work\n",
2016-03-13 19:38:46 -05:00
"request.setLocationNames(\"72240\")\n",
2016-03-14 20:35:57 -05:00
"\n",
2016-03-13 19:38:46 -05:00
"datatimes = DataAccessLayer.getAvailableTimes(request)\n",
"response = DataAccessLayer.getGeometryData(request,times=datatimes[-1].validPeriod)\n",
"\n",
"# Initialize data arrays\n",
"tpMan,tdMan,prMan,htMan,wdMan,wsMan = [],[],[],[],[],[]\n",
"# Build ordered arrays\n",
"for ob in response:\n",
" tpMan.append(float(ob.getString(\"tpMan\")))\n",
" tdMan.append(float(ob.getString(\"tdMan\")))\n",
" prMan.append(float(ob.getString(\"prMan\")))\n",
" htMan.append(float(ob.getString(\"htMan\")))\n",
" wdMan.append(float(ob.getString(\"wdMan\")))\n",
" wsMan.append(float(ob.getString(\"wsMan\")))\n",
2016-03-12 20:07:23 -06:00
"\n",
2016-03-14 20:35:57 -05:00
"# Convert \n",
"# we can use units.* here?\n",
2016-03-13 19:38:46 -05:00
"T = np.array(tpMan)-273.15\n",
"Td = np.array(tdMan)-273.15\n",
"p = np.array(prMan)/100\n",
"height = np.array(htMan)\n",
"direc = np.array(wdMan)\n",
"spd = np.array(wsMan)\n",
"u, v = get_wind_components(spd, np.deg2rad(direc))\n",
2016-03-14 20:35:57 -05:00
"\n",
2016-03-13 19:38:46 -05:00
"p = p * units.mbar\n",
"T = T * units.degC\n",
"Td = Td * units.degC\n",
"spd = spd * units.knot\n",
"direc = direc * units.deg\n",
"\n",
"# Create a skewT plot\n",
2016-03-12 22:17:13 -06:00
"skew = SkewT()\n",
2016-03-12 20:07:23 -06:00
"\n",
2016-03-12 22:17:13 -06:00
"# Plot the data using normal plotting functions, in this case using\n",
"# log scaling in Y, as dictated by the typical meteorological plot\n",
"skew.plot(p, T, 'r')\n",
"skew.plot(p, Td, 'g')\n",
"skew.plot_barbs(p, u, v)\n",
"skew.ax.set_ylim(1000, 100)\n",
2016-03-13 19:38:46 -05:00
"skew.ax.set_xlim(-40, 60)\n",
"\n",
"# Calculate LCL height and plot as black dot\n",
"l = lcl(p[0], T[0], Td[0])\n",
"lcl_temp = dry_lapse(concatenate((p[0], l)), T[0])[-1].to('degC')\n",
"skew.plot(l, lcl_temp, 'ko', markerfacecolor='black')\n",
"\n",
"# Calculate full parcel profile and add to plot as black line\n",
"prof = parcel_profile(p, T[0], Td[0]).to('degC')\n",
"skew.plot(p, prof, 'k', linewidth=2)\n",
"\n",
"# Example of coloring area between profiles\n",
"skew.ax.fill_betweenx(p, T, prof, where=T>=prof, facecolor='blue', alpha=0.4)\n",
"skew.ax.fill_betweenx(p, T, prof, where=T<prof, facecolor='red', alpha=0.4)\n",
"\n",
2016-03-13 19:40:41 -05:00
"# An example of a slanted line at constant T -- in this case the 0 isotherm\n",
2016-03-13 19:38:46 -05:00
"l = skew.ax.axvline(0, color='c', linestyle='--', linewidth=2)\n",
"\n",
"# Draw hodograph\n",
2016-03-13 19:40:41 -05:00
"ax_hod = inset_axes(skew.ax, '30%', '30%', loc=3)\n",
2016-03-13 19:38:46 -05:00
"h = Hodograph(ax_hod, component_range=50.)\n",
"h.add_grid(increment=20)\n",
"h.plot_colormapped(u, v, spd)\n",
2016-03-12 20:07:23 -06:00
"\n",
2016-03-12 22:17:13 -06:00
"# Show the plot\n",
2016-03-12 20:07:23 -06:00
"plt.show()"
]
2016-03-12 14:17:35 -07:00
},
2016-03-13 19:38:46 -05:00
{
2016-03-14 13:46:38 -05:00
"cell_type": "markdown",
2016-03-13 19:38:46 -05:00
"metadata": {
"collapsed": true
},
2016-03-14 13:46:38 -05:00
"source": [
"# Surface Obs"
]
},
{
"cell_type": "code",
2016-03-14 20:35:57 -05:00
"execution_count": 323,
2016-03-14 13:46:38 -05:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"getParameters is ['precip1Hour', 'tempFromTenths', 'precip24Hour', 'seaLevelPress', 'pressChange3Hour', 'temperature', 'dpFromTenths', 'reportType', 'pressChangeChar', 'elevation', 'precip3Hour', 'dewpoint', 'visibility', 'timeObs', 'maxTemp24Hour', 'stationName', 'altimeter', 'autoStationType', 'wmoId', 'windDir', 'windSpeed', 'minTemp24Hour', 'windGust', 'precip6Hour']\n",
"24\n",
2016-03-14 20:35:57 -05:00
"KBJC from Mar 15 16 00:48:00 GMT\n",
2016-03-14 13:46:38 -05:00
"stationName is KBJC\n",
2016-03-14 20:35:57 -05:00
"timeObs is 1458002880000\n",
2016-03-14 13:46:38 -05:00
"wmoId is -9999\n",
"autoStationType is \n",
"elevation is 1729.0\n",
"reportType is METAR\n",
2016-03-14 20:35:57 -05:00
"temperature is 9.0\n",
2016-03-14 13:46:38 -05:00
"tempFromTenths is -9999.0\n",
2016-03-14 20:35:57 -05:00
"dewpoint is -3.0\n",
2016-03-14 13:46:38 -05:00
"dpFromTenths is -9999.0\n",
2016-03-14 20:35:57 -05:00
"windDir is 240.0\n",
"windSpeed is 22.0\n",
"windGust is 32.0\n",
2016-03-14 13:46:38 -05:00
"visibility is 70.0\n",
2016-03-14 20:35:57 -05:00
"altimeter is 29.75\n",
2016-03-14 13:46:38 -05:00
"seaLevelPress is -9999.0\n",
"pressChange3Hour is -9999.0\n",
"pressChangeChar is \n",
"maxTemp24Hour is -9999.0\n",
"minTemp24Hour is -9999.0\n",
"precip1Hour is -9999.0\n",
"precip3Hour is -9999.0\n",
"precip6Hour is -9999.0\n",
"precip24Hour is -9999.0\n"
]
}
],
"source": [
"request = DataAccessLayer.newDataRequest()\n",
"request.setDatatype(\"obs\")\n",
"request.setLocationNames(\"KBJC\")\n",
"datatimes = DataAccessLayer.getAvailableTimes(request)\n",
"time = datatimes[-1].validPeriod\n",
"\n",
"# \"presWeather\",\"skyCover\",\"skyLayerBase\"\n",
"# are multi-dimensional... deal with these later\n",
"request.setParameters(\n",
" \"stationName\",\n",
" \"timeObs\",\n",
" \"wmoId\",\n",
" \"autoStationType\",\n",
" \"elevation\",\n",
" \"reportType\",\n",
" \"temperature\",\n",
" \"tempFromTenths\",\n",
" \"dewpoint\",\n",
" \"dpFromTenths\",\n",
" \"windDir\",\n",
" \"windSpeed\",\n",
" \"windGust\",\n",
" \"visibility\",\n",
" \"altimeter\",\n",
" \"seaLevelPress\",\n",
" \"pressChange3Hour\",\n",
" \"pressChangeChar\",\n",
" \"maxTemp24Hour\",\n",
" \"minTemp24Hour\",\n",
" \"precip1Hour\",\n",
" \"precip3Hour\",\n",
" \"precip6Hour\",\n",
" \"precip24Hour\"\n",
")\n",
"\n",
"response = DataAccessLayer.getGeometryData(request,times=time)\n",
"for ob in response:\n",
" print \"getParameters is\",ob.getParameters()\n",
" print len(ob.getParameters())\n",
" #getParameters\n",
" print ob.getString(\"stationName\"), \"from\", ob.getDataTime().getRefTime()\n",
" print \"stationName is\",ob.getString(\"stationName\")\n",
" print \"timeObs is\",ob.getString(\"timeObs\")\n",
" print \"wmoId is\",ob.getString(\"wmoId\")\n",
" print \"autoStationType is\",ob.getString(\"autoStationType\")\n",
" print \"elevation is\",ob.getString(\"elevation\")\n",
" print \"reportType is\",ob.getString(\"reportType\")\n",
" print \"temperature is\",ob.getString(\"temperature\")\n",
" print \"tempFromTenths is\",ob.getString(\"tempFromTenths\")\n",
" print \"dewpoint is\",ob.getString(\"dewpoint\")\n",
" print \"dpFromTenths is\",ob.getString(\"dpFromTenths\")\n",
" print \"windDir is\",ob.getString(\"windDir\")\n",
" print \"windSpeed is\",ob.getString(\"windSpeed\")\n",
" print \"windGust is\",ob.getString(\"windGust\")\n",
" print \"visibility is\",ob.getString(\"visibility\")\n",
" print \"altimeter is\",ob.getString(\"altimeter\")\n",
" print \"seaLevelPress is\",ob.getString(\"seaLevelPress\")\n",
" print \"pressChange3Hour is\",ob.getString(\"pressChange3Hour\")\n",
" print \"pressChangeChar is\",ob.getString(\"pressChangeChar\")\n",
" print \"maxTemp24Hour is\",ob.getString(\"maxTemp24Hour\")\n",
" print \"minTemp24Hour is\",ob.getString(\"minTemp24Hour\")\n",
" print \"precip1Hour is\",ob.getString(\"precip1Hour\")\n",
" print \"precip3Hour is\",ob.getString(\"precip3Hour\")\n",
" print \"precip6Hour is\",ob.getString(\"precip6Hour\")\n",
" print \"precip24Hour is\",ob.getString(\"precip24Hour\")"
]
},
{
"cell_type": "code",
2016-03-14 20:35:57 -05:00
"execution_count": 324,
2016-03-14 13:46:38 -05:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"getParameters is ['presWeather']\n",
"\n",
"getParameters is ['presWeather']\n",
"\n",
"getParameters is ['presWeather']\n",
"\n",
"getParameters is ['presWeather']\n",
"\n",
"getParameters is ['presWeather']\n",
2016-03-14 20:35:57 -05:00
"\n",
"FEW\n",
"4000.0\n",
"SCT\n",
"10000.0\n",
"BKN\n",
"20000.0\n",
"\n",
"-9999.0\n",
"\n",
"-9999.0\n",
"\n",
"-9999.0\n"
2016-03-14 13:46:38 -05:00
]
}
],
"source": [
2016-03-14 20:35:57 -05:00
"# multi-dimensional present WX\n",
"request = DataAccessLayer.newDataRequest()\n",
"request.setDatatype(\"obs\")\n",
"request.setLocationNames(\"KBJC\")\n",
2016-03-14 13:46:38 -05:00
"request.setParameters(\"presWeather\")\n",
"response = DataAccessLayer.getGeometryData(request,times=time)\n",
"for ob in response:\n",
" print \"getParameters is\",ob.getParameters()\n",
" print ob.getString(\"presWeather\")\n",
2016-03-14 20:35:57 -05:00
"\n",
"\n",
"# multi-dimensional Sky Condition\n",
"request.setParameters(\"skyCover\", \"skyLayerBase\")\n",
"response = DataAccessLayer.getGeometryData(request,times=time)\n",
"for ob in response:\n",
" print ob.getString(\"skyCover\")\n",
" print ob.getString(\"skyLayerBase\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Plot Surface Obs with MetPy\n",
"\n",
"Based on the MetPy example [\"Station Plot with Layout\"](http://metpy.readthedocs.org/en/latest/examples/generated/Station_Plot_with_Layout.html)"
2016-03-14 13:46:38 -05:00
]
},
{
"cell_type": "code",
2016-03-14 20:42:13 -05:00
"execution_count": 342,
2016-03-14 13:46:38 -05:00
"metadata": {
"collapsed": false
},
"outputs": [
2016-03-14 20:42:13 -05:00
{
"name": "stdout",
"output_type": "stream",
"text": [
"(Mar 15 16 00:52:00 , Mar 15 16 00:52:00 )\n"
]
},
2016-03-14 13:46:38 -05:00
{
2016-03-14 20:35:57 -05:00
"data": {
2016-03-14 20:42:13 -05:00
"image/png": "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\nAICbSUxKUev2b/yjsaJ
2016-03-14 20:35:57 -05:00
"text/plain": [
2016-03-14 20:42:13 -05:00
"<matplotlib.figure.Figure at 0x7f94219c2a10>"
2016-03-14 20:35:57 -05:00
]
},
"metadata": {},
"output_type": "display_data"
2016-03-14 13:46:38 -05:00
}
],
"source": [
2016-03-14 20:35:57 -05:00
"%matplotlib inline\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"from metpy.calc import get_wind_components\n",
"from metpy.cbook import get_test_data\n",
"from metpy.plots import StationPlot, StationPlotLayout, simple_layout\n",
"from metpy.units import units\n",
"\n",
"# Initialize\n",
"data,latitude,longitude,stationName,temperature,dewpoint,seaLevelPress,windDir,windSpeed = [],[],[],[],[],[],[],[],[]\n",
"request = DataAccessLayer.newDataRequest()\n",
"request.setDatatype(\"obs\")\n",
"\n",
"#\n",
"# we need to set one station to query latest time. this is hack-y and should be fixed\n",
"# because when you DON'T set a location name, you tend to get a single observation\n",
"# that came in a second ago, so your entire \"latest available time for all stations\"\n",
"# data array consists of one village in Peru and time-matching is suspect right now.\n",
"#\n",
2016-03-14 20:42:13 -05:00
"# That's why we take a known US stastion (OKC) and hope/assume that a lot of \n",
2016-03-14 20:35:57 -05:00
"# other stations are also reporting (and that this is a 00/20/40 ob). \n",
"#\n",
2016-03-14 20:42:13 -05:00
"request.setLocationNames(\"KOKC\")\n",
2016-03-14 20:35:57 -05:00
"datatimes = DataAccessLayer.getAvailableTimes(request)\n",
"\n",
"# Get most recent time for location\n",
"time = datatimes[-1].validPeriod\n",
"\n",
"# \"presWeather\",\"skyCover\",\"skyLayerBase\"\n",
"# are multi-dimensional(??) and returned seperately (not sure why yet)... deal with those later\n",
"request.setParameters(\"stationName\",\"temperature\",\"dewpoint\",\"windDir\",\"windSpeed\",\"seaLevelPress\",\"longitude\",\"latitude\")\n",
"request.setLocationNames()\n",
2016-03-14 13:46:38 -05:00
"response = DataAccessLayer.getGeometryData(request,times=time)\n",
2016-03-14 20:42:13 -05:00
"print time\n",
2016-03-14 20:35:57 -05:00
"# Build ordered arrays\n",
2016-03-14 13:46:38 -05:00
"for ob in response:\n",
2016-03-14 20:35:57 -05:00
" latitude.append(float(ob.getString(\"latitude\")))\n",
" longitude.append(float(ob.getString(\"longitude\")))\n",
" #stationName.append(ob.getString(\"stationName\"))\n",
" temperature.append(float(ob.getString(\"temperature\")))\n",
" dewpoint.append(float(ob.getString(\"dewpoint\")))\n",
" seaLevelPress.append(float(ob.getString(\"seaLevelPress\")))\n",
" windDir.append(float(ob.getString(\"windDir\")))\n",
" windSpeed.append(float(ob.getString(\"windSpeed\")))\n",
"\n",
"# Convert\n",
"data = dict()\n",
"data['latitude'] = np.array(latitude)\n",
"data['longitude'] = np.array(longitude)\n",
"data['air_temperature'] = np.array(temperature)* units.degC\n",
"data['dew_point_temperature'] = np.array(dewpoint)* units.degC\n",
2016-03-14 20:42:13 -05:00
"#data['air_pressure_at_sea_level'] = np.array(seaLevelPress)* units('mbar')\n",
2016-03-14 20:35:57 -05:00
"u, v = get_wind_components(np.array(windSpeed) * units('knots'),\n",
" np.array(windDir) * units.degree)\n",
"data['eastward_wind'], data['northward_wind'] = u, v\n",
"\n",
"# Convert the fraction value into a code of 0-8, which can be used to pull out\n",
"# the appropriate symbol\n",
"#data['cloud_coverage'] = (8 * data_arr['cloud_fraction']).astype(int)\n",
"\n",
"# Map weather strings to WMO codes, which we can use to convert to symbols\n",
"# Only use the first symbol if there are multiple\n",
"#wx_text = make_string_list(data_arr['weather'])\n",
"#wx_codes = {'':0, 'HZ':5, 'BR':10, '-DZ':51, 'DZ':53, '+DZ':55,\n",
"# '-RA':61, 'RA':63, '+RA':65, '-SN':71, 'SN':73, '+SN':75}\n",
"#data['present_weather'] = [wx_codes[s.split()[0] if ' ' in s else s] for s in wx_text]\n",
"\n",
"# Set up the map projection\n",
"import cartopy.crs as ccrs\n",
"import cartopy.feature as feat\n",
"from matplotlib import rcParams\n",
"rcParams['savefig.dpi'] = 255\n",
"proj = ccrs.LambertConformal(central_longitude=-95, central_latitude=35,\n",
" standard_parallels=[35])\n",
"state_boundaries = feat.NaturalEarthFeature(category='cultural',\n",
" name='admin_1_states_provinces_lines',\n",
" scale='110m', facecolor='none')\n",
"# Create the figure\n",
"fig = plt.figure(figsize=(20, 10))\n",
"ax = fig.add_subplot(1, 1, 1, projection=proj)\n",
"\n",
"# Add map elements \n",
"ax.add_feature(feat.LAND, zorder=-1)\n",
"ax.add_feature(feat.OCEAN, zorder=-1)\n",
"ax.add_feature(feat.LAKES, zorder=-1)\n",
"ax.coastlines(resolution='110m', zorder=2, color='black')\n",
"ax.add_feature(state_boundaries)\n",
"ax.add_feature(feat.BORDERS, linewidth='2', edgecolor='black')\n",
"ax.set_extent((-118, -73, 23, 50))\n",
"\n",
"# Start the station plot by specifying the axes to draw on, as well as the\n",
"# lon/lat of the stations (with transform). We also the fontsize to 12 pt.\n",
"stationplot = StationPlot(ax, data['longitude'], data['latitude'],\n",
" transform=ccrs.PlateCarree(), fontsize=12)\n",
"\n",
"# The layout knows where everything should go, and things are standardized using\n",
"# the names of variables. So the layout pulls arrays out of `data` and plots them\n",
"# using `stationplot`.\n",
"simple_layout.plot(stationplot, data)"
2016-03-14 13:46:38 -05:00
]
2016-03-13 19:38:46 -05:00
},
2016-03-12 14:17:35 -07:00
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
2016-03-12 20:07:23 -06:00
"version": "2.7.9"
2016-03-12 14:17:35 -07:00
}
},
"nbformat": 4,
"nbformat_minor": 0
}