2018-10-04 17:25:20 -06:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
2022-06-01 10:50:26 -06:00
"<a name=\"top\"></a>\n",
"<div style=\"width:1000 px\">\n",
"\n",
"<div style=\"float:right; width:98 px; height:98px;\">\n",
"<img src=\"https://docs.unidata.ucar.edu/images/logos/unidata_logo_vertical_150x150.png\" alt=\"Unidata Logo\" style=\"height: 98px;\">\n",
"</div>\n",
"\n",
"# METAR Staion Plot with MetPy\n",
"**Python-AWIPS Tutorial Notebook**\n",
"\n",
"<div style=\"clear:both\"></div>\n",
"</div>\n",
"\n",
"---\n",
"\n",
"<div style=\"float:right; width:250 px\"><img src=\"../images/metars_preview.png\" alt=\"Sample image of the METARS station plot map produced with this notebook\" style=\"height: 300px;\"></div>\n",
"\n",
"\n",
"# Objectives\n",
"\n",
"* Use python-awips to connect to an edex server\n",
"* Define and filter data request for METAR surface obs\n",
"* Extract necessary data and reformat it for plotting\n",
"* Stylize and plot METAR station data using Cartopy, Matplotlib, and MetPy\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {
"toc": true
},
"source": [
"<h1>Table of Contents<span class=\"tocSkip\"></span></h1>\n",
2022-06-02 09:58:14 -06:00
"<div class=\"toc\"><ul class=\"toc-item\"><li><span><a href=\"#Imports\" data-toc-modified-id=\"Imports-1\"><span class=\"toc-item-num\">1 </span>Imports</a></span></li><li><span><a href=\"#Function:-get_cloud_cover()\" data-toc-modified-id=\"Function:-get_cloud_cover()-2\"><span class=\"toc-item-num\">2 </span>Function: get_cloud_cover()</a></span></li><li><span><a href=\"#Initial-Setup\" data-toc-modified-id=\"Initial-Setup-3\"><span class=\"toc-item-num\">3 </span>Initial Setup</a></span><ul class=\"toc-item\"><li><span><a href=\"#Initial-EDEX-Connection\" data-toc-modified-id=\"Initial-EDEX-Connection-3.1\"><span class=\"toc-item-num\">3.1 </span>Initial EDEX Connection</a></span></li><li><span><a href=\"#Setting-Connection-Location-Names\" data-toc-modified-id=\"Setting-Connection-Location-Names-3.2\"><span class=\"toc-item-num\">3.2 </span>Setting Connection Location Names</a></span></li></ul></li><li><span><a href=\"#Filter-by-Time\" data-toc-modified-id=\"Filter-by-Time-4\"><span class=\"toc-item-num\">4 </span>Filter by Time</a></span></li><li><span><a href=\"#Use-the-Data!\" data-toc-modified-id=\"Use-the-Data!-5\"><span class=\"toc-item-num\">5 </span>Use the Data!</a></span><ul class=\"toc-item\"><li><span><a href=\"#Get-the-Data!\" data-toc-modified-id=\"Get-the-Data!-5.1\"><span class=\"toc-item-num\">5.1 </span>Get the Data!</a></span></li><li><span><a href=\"#Extract-all-Parameters\" data-toc-modified-id=\"Extract-all-Parameters-5.2\"><span class=\"toc-item-num\">5.2 </span>Extract all Parameters</a></span></li><li><span><a href=\"#Populate-the-Data-Dictionary\" data-toc-modified-id=\"Populate-the-Data-Dictionary-5.3\"><span class=\"toc-item-num\">5.3 </span>Populate the Data Dictionary</a></span></li></ul></li><li><span><a href=\"#Plot-the-Data!\" data-toc-modified-id=\"Plot-the-Data!-6\"><span class=\"toc-item-num\">6 </span>Plot the Data!</a></span></li><li><span><a href=\"#See-Also\" data-toc-modified-id=\"See-Also-7\"><span class=\"toc-item-num\">7 </span>See Also</a></span><ul class=\"toc-item\"><li><span><a href=\"#Related-Notebooks\" data-toc-modified-id=\"Related-Notebooks-7.1\"><span class=\"toc-item-num\">7.1 </span>Related Notebooks</a></span></li><li><span><a href=\"#Additional-Documentation\" data-toc-modified-id=\"Additional-Documentation-7.2\"><span class=\"toc-item-num\">7.2 </span>Additional Documentation</a></span></li></ul></li></ul></div>"
2022-06-01 10:50:26 -06:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Imports\n",
"\n",
"The imports below are used throughout the notebook. Note the first two imports are coming directly from python-awips and allow us to connect to an EDEX server, and define a timrange used for filtering the data. The subsequent imports are for data manipulation and visualization. "
2018-10-04 17:25:20 -06:00
]
},
{
"cell_type": "code",
2022-06-02 09:58:14 -06:00
"execution_count": 1,
2018-10-04 17:25:20 -06:00
"metadata": {},
"outputs": [],
"source": [
"from awips.dataaccess import DataAccessLayer\n",
"from dynamicserialize.dstypes.com.raytheon.uf.common.time import TimeRange\n",
"from datetime import datetime, timedelta\n",
"import numpy as np\n",
"import cartopy.crs as ccrs\n",
"import cartopy.feature as cfeature\n",
"import matplotlib.pyplot as plt\n",
"from metpy.calc import wind_components\n",
2022-06-01 10:50:26 -06:00
"from metpy.plots import StationPlot, StationPlotLayout, sky_cover\n",
"from metpy.units import units"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Function: get_cloud_cover()\n",
2018-10-04 17:25:20 -06:00
"\n",
2022-06-01 10:50:26 -06:00
"Returns the cloud fraction values as integer codes (0 through 8)."
]
},
{
"cell_type": "code",
2022-06-02 09:58:14 -06:00
"execution_count": 2,
2022-06-01 10:50:26 -06:00
"metadata": {},
"outputs": [],
"source": [
2018-10-04 17:25:20 -06:00
"def get_cloud_cover(code):\n",
" if 'OVC' in code:\n",
2022-06-01 10:50:26 -06:00
" return 8\n",
2018-10-04 17:25:20 -06:00
" elif 'BKN' in code:\n",
2022-06-01 10:50:26 -06:00
" return 6\n",
2018-10-04 17:25:20 -06:00
" elif 'SCT' in code:\n",
2022-06-01 10:50:26 -06:00
" return 4\n",
2018-10-04 17:25:20 -06:00
" elif 'FEW' in code:\n",
2022-06-01 10:50:26 -06:00
" return 2\n",
2018-10-04 17:25:20 -06:00
" else:\n",
2022-06-01 10:50:26 -06:00
" return 0"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
2018-10-04 17:25:20 -06:00
"\n",
2022-06-01 10:50:26 -06:00
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Initial Setup"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Initial EDEX Connection\n",
"\n",
"First we establish a connection to Unidata's public EDEX server. With that connection made, we can create a [new data request object](http://unidata.github.io/python-awips/api/IDataRequest.html) and set the data type to ***obs***.\n",
"\n",
"Then, because we're going to uses MetPy's [StationPlot](https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.StationPlot.html) and [StationPlotLayout](https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.StationPlotLayout.html) we need to define several parameters, and then set them on the data request object."
2018-10-04 17:25:20 -06:00
]
},
{
"cell_type": "code",
2022-06-02 09:58:14 -06:00
"execution_count": 3,
2018-10-04 17:25:20 -06:00
"metadata": {},
"outputs": [],
"source": [
"# EDEX Request\n",
"edexServer = \"edex-cloud.unidata.ucar.edu\"\n",
"DataAccessLayer.changeEDEXHost(edexServer)\n",
"request = DataAccessLayer.newDataRequest(\"obs\")\n",
"\n",
2022-06-01 10:50:26 -06:00
"# define desired parameters\n",
2018-10-04 17:25:20 -06:00
"single_value_params = [\"timeObs\", \"stationName\", \"longitude\", \"latitude\", \n",
" \"temperature\", \"dewpoint\", \"windDir\",\n",
2022-06-01 10:50:26 -06:00
" \"windSpeed\"]\n",
"multi_value_params = [\"skyCover\"]\n",
"\n",
2018-10-04 17:25:20 -06:00
"params = single_value_params + multi_value_params\n",
"\n",
2022-06-01 10:50:26 -06:00
"# set all parameters on the request\n",
"request.setParameters(*(params))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Setting Connection Location Names\n",
"\n",
"We are also going to define specific station IDs so that our plot is not too cluttered. "
]
},
{
"cell_type": "code",
2022-06-02 09:58:14 -06:00
"execution_count": 4,
2022-06-01 10:50:26 -06:00
"metadata": {},
"outputs": [],
"source": [
"# Define a list of station IDs to plot\n",
2022-06-02 09:49:54 -06:00
"selected = ['KPDX', 'KOKC', 'KICT', 'KGLD', 'KMEM', 'KBOS', 'KMIA', 'KMOB', 'KABQ', 'KPHX', 'KTTF',\n",
" 'KORD', 'KBIL', 'KBIS', 'KCPR', 'KLAX', 'KATL', 'KMSP', 'KSLC', 'KDFW', 'KNYC', 'KPHL',\n",
" 'KPIT', 'KIND', 'KOLY', 'KSYR', 'KLEX', 'KCHS', 'KTLH', 'KHOU', 'KGJT', 'KLBB', 'KLSV',\n",
" 'KGRB', 'KCLT', 'KLNK', 'KDSM', 'KBOI', 'KFSD', 'KRAP', 'KRIC', 'KJAN', 'KHSV', 'KCRW',\n",
" 'KSAT', 'KBUY', 'K0CO', 'KZPC', 'KVIH', 'KBDG', 'KMLF', 'KELY', 'KWMC', 'KOTH', 'KCAR',\n",
" 'KLMT', 'KRDM', 'KPDT', 'KSEA', 'KUIL', 'KEPH', 'KPUW', 'KCOE', 'KMLP', 'KPIH', 'KIDA', \n",
" 'KMSO', 'KACV', 'KHLN', 'KBIL', 'KOLF', 'KRUT', 'KPSM', 'KJAX', 'KTPA', 'KSHV', 'KMSY',\n",
" 'KELP', 'KRNO', 'KFAT', 'KSFO', 'KNYL', 'KBRO', 'KMRF', 'KDRT', 'KFAR', 'KBDE', 'KDLH',\n",
" 'KHOT', 'KLBF', 'KFLG', 'KCLE', 'KUNV']\n",
"\n",
2022-06-01 10:50:26 -06:00
"# set the location names to the desired station IDs \n",
2018-10-04 17:25:20 -06:00
"request.setLocationNames(*(selected))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2022-06-01 10:50:26 -06:00
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Filter by Time\n",
"\n",
"Here we decide how much data we want to pull from EDEX. By default we'll request 1 hour, but that value can easily be modified by [adjusting the `timedelta(hours = 1)`](https://docs.python.org/3/library/datetime.html#timedelta-objects) in line `2`. The more data we request, the longer this section will take to run."
2018-10-04 17:25:20 -06:00
]
},
{
"cell_type": "code",
2022-06-02 09:58:14 -06:00
"execution_count": 5,
2018-10-04 17:25:20 -06:00
"metadata": {},
"outputs": [],
"source": [
"# Time range\n",
"lastHourDateTime = datetime.utcnow() - timedelta(hours = 1)\n",
"start = lastHourDateTime.strftime('%Y-%m-%d %H')\n",
"beginRange = datetime.strptime( start + \":00:00\", \"%Y-%m-%d %H:%M:%S\")\n",
"endRange = datetime.strptime( start + \":59:59\", \"%Y-%m-%d %H:%M:%S\")\n",
2022-06-01 10:50:26 -06:00
"timerange = TimeRange(beginRange, endRange)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Use the Data!\n",
"### Get the Data!\n",
2018-10-04 17:25:20 -06:00
"\n",
2022-06-01 10:50:26 -06:00
"Now that we have our `request` and TimeRange `timerange` objects ready, we're ready to get the data array from EDEX."
]
},
{
"cell_type": "code",
2022-06-02 09:58:14 -06:00
"execution_count": 6,
2022-06-01 10:50:26 -06:00
"metadata": {},
"outputs": [],
"source": [
"# Get response\n",
2018-10-04 17:25:20 -06:00
"response = DataAccessLayer.getGeometryData(request,timerange)"
]
},
2022-06-01 10:50:26 -06:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Extract all Parameters\n",
"\n",
"In this section we start gathering all the information we'll need to properly display our data. First we create an empty dictionary and array to keep track of all data and unique station IDs. We also create a boolean to help us only grab the first entry for `skyCover` related to a station id.\n",
"\n",
"<br>\n",
"<div class=\"alert-info\">\n",
" <b>Note:</b> The way the data responses are returned, we recieve many <code>skyCover</code> entries for each station ID, but we only want to keep track of the most recent one (first one returned).\n",
"</div>\n",
"\n",
"After defining these variables, we are ready to start looping through our response data. If the response is an entry of `skyCover`, and this is a new station id, then set the skyCover value in the obs dictionary. If this is not a skyCover entry, then explicitly set the `timeObs` variable (because we have to manipulate it slightly), and dynamically set all the remaining parameters."
]
},
2018-10-04 17:25:20 -06:00
{
"cell_type": "code",
2022-06-02 09:58:14 -06:00
"execution_count": 7,
2022-06-13 16:07:21 -04:00
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['temperature', 'stationName', 'dewpoint', 'windDir', 'windSpeed', 'timeObs', 'latitude', 'longitude']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n",
"['skyCover']\n"
]
}
],
2018-10-04 17:25:20 -06:00
"source": [
2022-06-01 10:50:26 -06:00
"# define a dictionary and array that will be populated from our for loop below\n",
"obs = dict({params: [] for params in params})\n",
2018-10-04 17:25:20 -06:00
"station_names = []\n",
2022-06-13 16:07:21 -04:00
"time_title = \"\"\n",
2022-06-01 10:50:26 -06:00
"\n",
2022-06-13 16:07:21 -04:00
"# cycle through all the data in the response, in reverse order to get the most recent data first\n",
"for ob in reversed(response):\n",
2018-10-09 13:39:16 -06:00
" avail_params = ob.getParameters()\n",
2022-06-13 16:07:21 -04:00
" print(avail_params)\n",
" # if it has cloud information, we want the last of the 6 entries (most recent)\n",
" if \"skyCover\" in avail_params:\n",
" if i == 5:\n",
" # store the associated cloud cover int for the skyCover string\n",
" obs['skyCover'].append(get_cloud_cover(ob.getString(\"skyCover\")))\n",
" i = i + 1\n",
2022-06-01 10:50:26 -06:00
" elif \"stationName\" in avail_params:\n",
2018-10-04 17:25:20 -06:00
" # If we already have a record for this stationName, skip\n",
" if ob.getString('stationName') not in station_names:\n",
" station_names.append(ob.getString('stationName'))\n",
2022-06-13 16:07:21 -04:00
" i = 0\n",
2018-10-04 17:25:20 -06:00
" for param in single_value_params: \n",
" if param in avail_params:\n",
" if param == 'timeObs':\n",
" obs[param].append(datetime.fromtimestamp(ob.getNumber(param)/1000.0))\n",
2022-06-13 16:07:21 -04:00
" if time_title == \"\":\n",
" time_title = str(ob.getDataTime())\n",
2018-10-04 17:25:20 -06:00
" else:\n",
" try:\n",
" obs[param].append(ob.getNumber(param))\n",
" except TypeError:\n",
" obs[param].append(ob.getString(param))\n",
" else:\n",
2022-06-01 10:50:26 -06:00
" obs[param].append(None)"
2018-10-04 17:25:20 -06:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2022-06-01 10:50:26 -06:00
"### Populate the Data Dictionary\n",
2018-10-04 17:25:20 -06:00
"\n",
2022-06-01 10:50:26 -06:00
"Next grab the variables out of the obs dictionary we just populated, attach correct units, (calculate their components, in the instance of wind) and put them into a new dictionary that we will hand the plotting function later."
2018-10-04 17:25:20 -06:00
]
},
{
"cell_type": "code",
2022-06-02 09:58:14 -06:00
"execution_count": 8,
2018-10-04 17:25:20 -06:00
"metadata": {},
"outputs": [],
"source": [
"data = dict()\n",
"data['stid'] = np.array(obs['stationName'])\n",
"data['latitude'] = np.array(obs['latitude'])\n",
"data['longitude'] = np.array(obs['longitude'])\n",
"data['air_temperature'] = np.array(obs['temperature'], dtype=float)* units.degC\n",
"data['dew_point_temperature'] = np.array(obs['dewpoint'], dtype=float)* units.degC\n",
"\n",
"direction = np.array(obs['windDir'])\n",
"direction[direction == -9999.0] = 'nan'\n",
"\n",
"u, v = wind_components(np.array(obs['windSpeed']) * units('knots'),\n",
" direction * units.degree)\n",
"data['eastward_wind'], data['northward_wind'] = u, v\n",
2022-06-01 10:50:26 -06:00
"data['cloud_coverage'] = np.array(obs['skyCover'])"
2018-10-04 17:25:20 -06:00
]
},
2018-10-05 17:09:43 -06:00
{
2022-06-01 10:50:26 -06:00
"cell_type": "markdown",
2018-10-05 17:09:43 -06:00
"metadata": {},
"source": [
2022-06-01 10:50:26 -06:00
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
2018-10-05 17:09:43 -06:00
]
},
2018-10-04 17:25:20 -06:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
2022-06-01 10:50:26 -06:00
"## Plot the Data!\n",
"\n",
"Now we have all the data we need to create our plot! First we'll assign a projection and create our figure and axes.\n",
"\n",
"Next, we use Cartopy to add common features (land, ocean, lakes, borders, etc) to help give us a more contextual map of the United States to plot the METAR stations on. We create and add a title for our figure as well.\n",
"\n",
"Additionally, we use [MetPy's StationPlotLayout](https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.StationPlotLayout.html) to instantiate a custom layout and define all the attributes we want displayed. We need to then set the data dictionary (containing all of our data values) on the custom layout so it knows what to draw.\n",
"\n",
"Finally, we display the plot!"
2018-10-04 17:25:20 -06:00
]
},
{
"cell_type": "code",
2022-06-02 09:58:14 -06:00
"execution_count": 9,
2018-10-04 17:25:20 -06:00
"metadata": {},
"outputs": [
{
"data": {
2022-06-13 16:07:21 -04:00
"image/png": "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
2018-10-04 17:25:20 -06:00
"text/plain": [
"<Figure size 1440x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"proj = ccrs.LambertConformal(central_longitude=-95, central_latitude=35,\n",
" standard_parallels=[35])\n",
2018-10-05 17:09:43 -06:00
"# Create the figure\n",
2018-10-04 17:25:20 -06:00
"fig = plt.figure(figsize=(20, 10))\n",
"ax = fig.add_subplot(1, 1, 1, projection=proj)\n",
2018-10-05 17:09:43 -06:00
"\n",
"# Add various map elements\n",
2018-10-04 17:25:20 -06:00
"ax.add_feature(cfeature.LAND)\n",
"ax.add_feature(cfeature.OCEAN)\n",
"ax.add_feature(cfeature.LAKES)\n",
"ax.add_feature(cfeature.COASTLINE)\n",
"ax.add_feature(cfeature.STATES)\n",
"ax.add_feature(cfeature.BORDERS, linewidth=2)\n",
2018-10-05 17:09:43 -06:00
"\n",
2018-10-04 17:25:20 -06:00
"# Set plot bounds\n",
"ax.set_extent((-118, -73, 23, 50))\n",
2022-06-13 16:07:21 -04:00
"ax.set_title(time_title + \" | METAR | \" + edexServer)\n",
2018-10-04 17:25:20 -06:00
"\n",
2022-06-01 10:50:26 -06:00
"# Winds, temps, dewpoint, station id\n",
"custom_layout = StationPlotLayout()\n",
"custom_layout.add_barb('eastward_wind', 'northward_wind', units='knots')\n",
"custom_layout.add_value('NW', 'air_temperature', fmt='.0f', units='degF', color='darkred')\n",
"custom_layout.add_value('SW', 'dew_point_temperature', fmt='.0f', units='degF', color='darkgreen')\n",
"custom_layout.add_symbol('C', 'cloud_coverage', sky_cover)\n",
"\n",
2018-10-04 17:25:20 -06:00
"stationplot = StationPlot(ax, data['longitude'], data['latitude'], clip_on=True,\n",
" transform=ccrs.PlateCarree(), fontsize=10)\n",
"stationplot.plot_text((2, 0), data['stid'])\n",
2018-10-05 17:09:43 -06:00
"custom_layout.plot(stationplot, data)\n",
2022-06-01 10:50:26 -06:00
"\n",
2018-10-05 17:09:43 -06:00
"plt.show()"
2018-10-04 17:25:20 -06:00
]
2022-06-01 10:50:26 -06:00
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2022-06-02 11:40:30 -04:00
"## See Also\n",
"\n",
"- [Aviation Weather Center Static METAR Plots Information](https://www.aviationweather.gov/metar/help?page=plot)\n",
"\n",
"### Related Notebooks\n",
"\n",
"- [Grid Levels and Parameters](http://unidata.github.io/python-awips/examples/generated/Grid_Levels_and_Parameters.html)\n",
"- [Colored Surface Temperature Plot](http://unidata.github.io/python-awips/examples/generated/Colored_Surface_Temperature_Plot.html)\n",
"\n",
"### Additional Documentation\n",
"\n",
"**python-awips:**\n",
"\n",
"- [DataAccessLayer.changeEDEXHost()](http://unidata.github.io/python-awips/api/DataAccessLayer.html#awips.dataaccess.DataAccessLayer.changeEDEXHost)\n",
"- [DataAccessLayer.newDataRequest()](http://unidata.github.io/python-awips/api/DataAccessLayer.html#awips.dataaccess.DataAccessLayer.newDataRequest)\n",
"- [IDataRequest](http://unidata.github.io/python-awips/api/IDataRequest.html)\n",
"- [DataAccessLayer.getGeometryData](http://unidata.github.io/python-awips/api/PyGeometryData.html)\n",
"\n",
"**datetime:**\n",
"\n",
"- [datetime.datetime](https://docs.python.org/3/library/datetime.html#datetime-objects)\n",
"- [datetime.utcnow()](https://docs.python.org/3/library/datetime.html?#datetime.datetime.utcnow)\n",
"- [datetime.timedelta](https://docs.python.org/3/library/datetime.html#timedelta-objects)\n",
"- [datetime.strftime() and datetime.strptime()](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior)\n",
"\n",
"**numpy:**\n",
"\n",
"- [np.array](https://numpy.org/doc/stable/reference/generated/numpy.array.html)\n",
"\n",
"**cartopy:**\n",
"\n",
"- [cartopy projection list](https://scitools.org.uk/cartopy/docs/v0.14/crs/projections.html?#cartopy-projection-list)\n",
"- [cartopy feature interface](https://scitools.org.uk/cartopy/docs/v0.14/matplotlib/feature_interface.html)\n",
"\n",
"**matplotlib:**\n",
"\n",
"- [matplotlib.pyplot()](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.html)\n",
"- [matplotlib.pyplot.figure()](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.figure.html)\n",
"- [matplotlib.pyplot.figure.add_subplot](https://matplotlib.org/stable/api/figure_api.html#matplotlib.figure.Figure.add_subplot)\n",
"- [ax.set_extent](https://matplotlib.org/stable/api/image_api.html?highlight=set_extent#matplotlib.image.AxesImage.set_extent)\n",
"- [ax.set_title](https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_title.html)\n",
"\n",
"\n",
"**metpy:**\n",
"\n",
"- [metpy.calc.wind_components](https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.wind_components.html)\n",
"- [metpy.plots.StationPlot()](https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.StationPlot.html)\n",
"- [metpy.plots.StationPlotLayout()](https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.StationPlotLayout.html)\n",
"- [metpy.units](https://unidata.github.io/MetPy/latest/api/generated/metpy.units.html)\n"
2022-06-01 10:50:26 -06:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
2018-10-04 17:25:20 -06:00
}
],
"metadata": {
"kernelspec": {
2022-06-13 16:07:21 -04:00
"display_name": "Python 3 (ipykernel)",
2018-10-04 17:25:20 -06:00
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
2022-06-13 16:07:21 -04:00
"version": "3.9.6"
2022-06-01 10:50:26 -06:00
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": true,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": true,
"toc_position": {
"height": "calc(100% - 180px)",
"left": "10px",
"top": "150px",
"width": "287.9779357910156px"
},
"toc_section_display": true,
"toc_window_display": true
2018-10-04 17:25:20 -06:00
}
},
"nbformat": 4,
"nbformat_minor": 1
}