{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "# Station Plot\n", "\n", "This notebook is adapted from https://unidata.github.io/MetPy/latest/examples/plots/Station_Plot.html\n", "\n", "Make a station plot, complete with sky cover and weather symbols.\n", "\n", "The station plot itself is pretty straightforward, but there is a bit of code to perform the\n", "data-wrangling (hopefully that situation will improve in the future). Certainly, if you have\n", "existing point data in a format you can work with trivially, the station plot will be simple.\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "import cartopy.crs as ccrs\n", "import cartopy.feature as cfeature\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "from metpy.calc import reduce_point_density\n", "from metpy.cbook import get_test_data\n", "from metpy.io import metar\n", "from metpy.plots import add_metpy_logo, current_weather, sky_cover, StationPlot" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Get real-time metar data\n", "# Author: Yongjie Huang\n", "# Date: 2022-02-24\n", "from os.path import exists\n", "from urllib.request import urlretrieve\n", "\n", "def get_real_time_metar_data(fname):\n", " base_url = 'https://thredds-test.unidata.ucar.edu/thredds/fileServer/noaaport/text/metar/'\n", " data_dir = '/tmp/'\n", " path_to_file = data_dir + fname\n", " \n", " if exists(path_to_file):\n", " print(f'File exists: {path_to_file}')\n", " else:\n", " print(f\"Downloading file '{fname}' from '{base_url+fname}' to '{path_to_file}'.\")\n", " urlretrieve(base_url+fname, path_to_file)\n", "\n", " return path_to_file" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The setup\n", "\n", "First download and read in the station data. \n", "\n", "We use the get_real_time_metar_data function defined above to download 'realtime' data from Unidata THREDDS server.\n", "the metar reader because it simplifies a lot of tasks,\n", "like dealing with separating text and assembling a pandas dataframe.\n", "\n", "https://thredds-test.unidata.ucar.edu/thredds/catalog/noaaport/text/metar/catalog.html" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "File exists: /tmp/metar_20220308_0000.txt\n" ] }, { "data": { "text/plain": [ "'/tmp/metar_20220308_0000.txt'" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Download metar data in text format.\n", "\n", "metar_data = get_real_time_metar_data('metar_20220308_0000.txt')\n", "\n", "metar_data" ] }, { "cell_type": "markdown", "metadata": { "jupyter": { "outputs_hidden": false }, "scrolled": true }, "source": [ "Parse a downloaded text file containing multiple METAR reports and/or text products, by calling metar.parse_metar_file which is part of the metpy.io package. The parser returns the data as pandas dataframe. See\n", "https://unidata.github.io/MetPy/latest/api/generated/metpy.io.parse_metar_file.html" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "jupyter": { "outputs_hidden": false }, "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", " | station_id | \n", "latitude | \n", "longitude | \n", "elevation | \n", "date_time | \n", "wind_direction | \n", "wind_speed | \n", "wind_gust | \n", "visibility | \n", "current_wx1 | \n", "... | \n", "air_temperature | \n", "dew_point_temperature | \n", "altimeter | \n", "current_wx1_symbol | \n", "current_wx2_symbol | \n", "current_wx3_symbol | \n", "remarks | \n", "air_pressure_at_sea_level | \n", "eastward_wind | \n", "northward_wind | \n", "
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
station_id | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
KPLD | \n", "KPLD | \n", "40.450000 | \n", "-84.983333 | \n", "282.0 | \n", "2022-03-07 23:55:00 | \n", "290.0 | \n", "10.0 | \n", "19.0 | \n", "16093.44 | \n", "NaN | \n", "... | \n", "2.0 | \n", "-2.0 | \n", "30.05 | \n", "0 | \n", "0 | \n", "0 | \n", "AO2 | \n", "1019.43 | \n", "9.396926e+00 | \n", "-3.420201 | \n", "
KFFA | \n", "KFFA | \n", "36.020000 | \n", "-75.670000 | \n", "4.0 | \n", "2022-03-07 23:55:00 | \n", "190.0 | \n", "8.0 | \n", "NaN | \n", "16093.44 | \n", "NaN | \n", "... | \n", "20.0 | \n", "14.0 | \n", "29.88 | \n", "0 | \n", "0 | \n", "0 | \n", "AO2 T01990143 10245 21053 | \n", "1012.14 | \n", "1.389185e+00 | \n", "7.878462 | \n", "
KMFV | \n", "KMFV | \n", "37.630000 | \n", "-75.770000 | \n", "15.0 | \n", "2022-03-07 23:55:00 | \n", "210.0 | \n", "10.0 | \n", "18.0 | \n", "16093.44 | \n", "NaN | \n", "... | \n", "22.0 | \n", "20.0 | \n", "29.76 | \n", "0 | \n", "0 | \n", "0 | \n", "AO2 T02210196 10243 20221 | \n", "1008.04 | \n", "5.000000e+00 | \n", "8.660254 | \n", "
K2J9 | \n", "K2J9 | \n", "30.600000 | \n", "-84.550000 | \n", "69.0 | \n", "2022-03-07 23:55:00 | \n", "200.0 | \n", "5.0 | \n", "NaN | \n", "16093.44 | \n", "NaN | \n", "... | \n", "23.0 | \n", "20.0 | \n", "30.07 | \n", "0 | \n", "0 | \n", "0 | \n", "AO2 | \n", "1018.36 | \n", "1.710101e+00 | \n", "4.698463 | \n", "
KTGI | \n", "KTGI | \n", "37.833333 | \n", "-76.000000 | \n", "2.0 | \n", "2022-03-07 23:55:00 | \n", "190.0 | \n", "13.0 | \n", "NaN | \n", "16093.44 | \n", "NaN | \n", "... | \n", "15.0 | \n", "11.0 | \n", "29.75 | \n", "0 | \n", "0 | \n", "0 | \n", "AO1 T01500105 10267 21047 | \n", "1007.75 | \n", "2.257426e+00 | \n", "12.802501 | \n", "
... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
HTMU | \n", "HTMU | \n", "-1.500000 | \n", "33.780000 | \n", "1147.0 | \n", "2022-03-08 00:00:00 | \n", "0.0 | \n", "0.0 | \n", "NaN | \n", "9999.00 | \n", "NaN | \n", "... | \n", "23.0 | \n", "21.0 | \n", "29.91 | \n", "0 | \n", "0 | \n", "0 | \n", "\n", " | 1007.74 | \n", "-0.000000e+00 | \n", "-0.000000 | \n", "
HTSO | \n", "HTSO | \n", "-10.670000 | \n", "35.570000 | \n", "1067.0 | \n", "2022-03-08 00:00:00 | \n", "180.0 | \n", "6.0 | \n", "NaN | \n", "9999.00 | \n", "NaN | \n", "... | \n", "20.0 | \n", "19.0 | \n", "30.00 | \n", "0 | \n", "0 | \n", "0 | \n", "\n", " | 1012.58 | \n", "-7.347881e-16 | \n", "6.000000 | \n", "
HTTB | \n", "HTTB | \n", "-5.070000 | \n", "32.820000 | \n", "1190.0 | \n", "2022-03-08 00:00:00 | \n", "0.0 | \n", "0.0 | \n", "NaN | \n", "9999.00 | \n", "NaN | \n", "... | \n", "21.0 | \n", "19.0 | \n", "29.97 | \n", "0 | \n", "0 | \n", "0 | \n", "NOSIG | \n", "1010.45 | \n", "-0.000000e+00 | \n", "-0.000000 | \n", "
HTDA | \n", "HTDA | \n", "-6.880000 | \n", "39.200000 | \n", "55.0 | \n", "2022-03-08 00:00:00 | \n", "20.0 | \n", "6.0 | \n", "NaN | \n", "9999.00 | \n", "NaN | \n", "... | \n", "22.0 | \n", "24.0 | \n", "29.80 | \n", "0 | \n", "0 | \n", "0 | \n", "NOSIG | \n", "1009.13 | \n", "-2.052121e+00 | \n", "-5.638156 | \n", "
HTZA | \n", "HTZA | \n", "-6.220000 | \n", "39.220000 | \n", "15.0 | \n", "2022-03-08 00:00:00 | \n", "0.0 | \n", "0.0 | \n", "NaN | \n", "9999.00 | \n", "NaN | \n", "... | \n", "26.0 | \n", "23.0 | \n", "29.77 | \n", "0 | \n", "0 | \n", "0 | \n", "NOSIG | \n", "1008.23 | \n", "-0.000000e+00 | \n", "-0.000000 | \n", "
9061 rows × 31 columns
\n", "\n", " | station_id | \n", "latitude | \n", "longitude | \n", "elevation | \n", "date_time | \n", "wind_direction | \n", "wind_speed | \n", "wind_gust | \n", "visibility | \n", "current_wx1 | \n", "... | \n", "air_temperature | \n", "dew_point_temperature | \n", "altimeter | \n", "current_wx1_symbol | \n", "current_wx2_symbol | \n", "current_wx3_symbol | \n", "remarks | \n", "air_pressure_at_sea_level | \n", "eastward_wind | \n", "northward_wind | \n", "
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
station_id | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
KPLD | \n", "KPLD | \n", "40.450000 | \n", "-84.983333 | \n", "282.0 | \n", "2022-03-07 23:55:00 | \n", "290.0 | \n", "10.0 | \n", "19.0 | \n", "16093.44 | \n", "NaN | \n", "... | \n", "2.0 | \n", "-2.0 | \n", "30.05 | \n", "0 | \n", "0 | \n", "0 | \n", "AO2 | \n", "1019.43 | \n", "9.396926e+00 | \n", "-3.420201 | \n", "
KFFA | \n", "KFFA | \n", "36.020000 | \n", "-75.670000 | \n", "4.0 | \n", "2022-03-07 23:55:00 | \n", "190.0 | \n", "8.0 | \n", "NaN | \n", "16093.44 | \n", "NaN | \n", "... | \n", "20.0 | \n", "14.0 | \n", "29.88 | \n", "0 | \n", "0 | \n", "0 | \n", "AO2 T01990143 10245 21053 | \n", "1012.14 | \n", "1.389185e+00 | \n", "7.878462 | \n", "
KMFV | \n", "KMFV | \n", "37.630000 | \n", "-75.770000 | \n", "15.0 | \n", "2022-03-07 23:55:00 | \n", "210.0 | \n", "10.0 | \n", "18.0 | \n", "16093.44 | \n", "NaN | \n", "... | \n", "22.0 | \n", "20.0 | \n", "29.76 | \n", "0 | \n", "0 | \n", "0 | \n", "AO2 T02210196 10243 20221 | \n", "1008.04 | \n", "5.000000e+00 | \n", "8.660254 | \n", "
K2J9 | \n", "K2J9 | \n", "30.600000 | \n", "-84.550000 | \n", "69.0 | \n", "2022-03-07 23:55:00 | \n", "200.0 | \n", "5.0 | \n", "NaN | \n", "16093.44 | \n", "NaN | \n", "... | \n", "23.0 | \n", "20.0 | \n", "30.07 | \n", "0 | \n", "0 | \n", "0 | \n", "AO2 | \n", "1018.36 | \n", "1.710101e+00 | \n", "4.698463 | \n", "
KTGI | \n", "KTGI | \n", "37.833333 | \n", "-76.000000 | \n", "2.0 | \n", "2022-03-07 23:55:00 | \n", "190.0 | \n", "13.0 | \n", "NaN | \n", "16093.44 | \n", "NaN | \n", "... | \n", "15.0 | \n", "11.0 | \n", "29.75 | \n", "0 | \n", "0 | \n", "0 | \n", "AO1 T01500105 10267 21047 | \n", "1007.75 | \n", "2.257426e+00 | \n", "12.802501 | \n", "
... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
HTMU | \n", "HTMU | \n", "-1.500000 | \n", "33.780000 | \n", "1147.0 | \n", "2022-03-08 00:00:00 | \n", "0.0 | \n", "0.0 | \n", "NaN | \n", "9999.00 | \n", "NaN | \n", "... | \n", "23.0 | \n", "21.0 | \n", "29.91 | \n", "0 | \n", "0 | \n", "0 | \n", "\n", " | 1007.74 | \n", "-0.000000e+00 | \n", "-0.000000 | \n", "
HTSO | \n", "HTSO | \n", "-10.670000 | \n", "35.570000 | \n", "1067.0 | \n", "2022-03-08 00:00:00 | \n", "180.0 | \n", "6.0 | \n", "NaN | \n", "9999.00 | \n", "NaN | \n", "... | \n", "20.0 | \n", "19.0 | \n", "30.00 | \n", "0 | \n", "0 | \n", "0 | \n", "\n", " | 1012.58 | \n", "-7.347881e-16 | \n", "6.000000 | \n", "
HTTB | \n", "HTTB | \n", "-5.070000 | \n", "32.820000 | \n", "1190.0 | \n", "2022-03-08 00:00:00 | \n", "0.0 | \n", "0.0 | \n", "NaN | \n", "9999.00 | \n", "NaN | \n", "... | \n", "21.0 | \n", "19.0 | \n", "29.97 | \n", "0 | \n", "0 | \n", "0 | \n", "NOSIG | \n", "1010.45 | \n", "-0.000000e+00 | \n", "-0.000000 | \n", "
HTDA | \n", "HTDA | \n", "-6.880000 | \n", "39.200000 | \n", "55.0 | \n", "2022-03-08 00:00:00 | \n", "20.0 | \n", "6.0 | \n", "NaN | \n", "9999.00 | \n", "NaN | \n", "... | \n", "22.0 | \n", "24.0 | \n", "29.80 | \n", "0 | \n", "0 | \n", "0 | \n", "NOSIG | \n", "1009.13 | \n", "-2.052121e+00 | \n", "-5.638156 | \n", "
HTZA | \n", "HTZA | \n", "-6.220000 | \n", "39.220000 | \n", "15.0 | \n", "2022-03-08 00:00:00 | \n", "0.0 | \n", "0.0 | \n", "NaN | \n", "9999.00 | \n", "NaN | \n", "... | \n", "26.0 | \n", "23.0 | \n", "29.77 | \n", "0 | \n", "0 | \n", "0 | \n", "NOSIG | \n", "1008.23 | \n", "-0.000000e+00 | \n", "-0.000000 | \n", "
8090 rows × 31 columns
\n", "