{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "BY_tsStPj7FY" }, "source": [ "### Openradar.io Historical Image Generator\n", "\n", "Please follow these steps to running this script\n", "\n", "1. Edit the configuration below. Stick to the basic options if you're unsure of the rest\n", "1. From the top menus select: 'Cell' -> 'Run All'\n", "1. A download link will print at the bottom of this notebook when the images are ready" ] }, { "cell_type": "code", "source": [ "#install required libs\n", "!pip install arm_pyart cartopy adjustText\n", "\n", "import os\n", "from glob import glob\n", "from datetime import datetime, timedelta\n", "import tempfile #used to create temporary folders to store data\n", "import zipfile #used to extract tar files\n", "\n", "import urllib\n", "import pandas\n", "from matplotlib import pyplot as plt\n", "import cartopy\n", "import cartopy.crs as ccrs # A toolkit for map projections\n", "import numpy as np\n", "from tqdm import tqdm\n", "from adjustText import adjust_text\n", "from IPython.display import display, FileLink\n", "from PIL import Image\n", "\n", "import pyart\n", "\n", "import warnings\n", "warnings.filterwarnings('ignore')\n", "warnings.simplefilter('ignore')" ], "metadata": { "id": "OzW4W3eC4fTD", "outputId": "5d83e128-c1ed-48cb-a553-efbaa03d5e5b", "colab": { "base_uri": "https://localhost:8080/" } }, "execution_count": 21, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Requirement already satisfied: arm_pyart in /usr/local/lib/python3.10/dist-packages (1.17.0)\n", "Requirement already satisfied: cartopy in /usr/local/lib/python3.10/dist-packages (0.22.0)\n", "Requirement already satisfied: adjustText in /usr/local/lib/python3.10/dist-packages (1.0.4)\n", "Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from arm_pyart) (1.25.2)\n", "Requirement already satisfied: scipy in /usr/local/lib/python3.10/dist-packages (from arm_pyart) (1.11.4)\n", "Requirement already satisfied: netCDF4 in /usr/local/lib/python3.10/dist-packages (from arm_pyart) (1.6.5)\n", "Requirement already satisfied: matplotlib in /usr/local/lib/python3.10/dist-packages (from arm_pyart) (3.7.1)\n", "Requirement already satisfied: pooch in /usr/local/lib/python3.10/dist-packages (from arm_pyart) (1.8.1)\n", "Requirement already satisfied: cftime in /usr/local/lib/python3.10/dist-packages (from arm_pyart) (1.6.3)\n", "Requirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from arm_pyart) (2024.2.0)\n", "Requirement already satisfied: s3fs in /usr/local/lib/python3.10/dist-packages (from arm_pyart) (2024.2.0)\n", "Requirement already satisfied: open-radar-data in /usr/local/lib/python3.10/dist-packages (from arm_pyart) (0.0.9)\n", "Requirement already satisfied: xradar in /usr/local/lib/python3.10/dist-packages (from arm_pyart) (0.4.3)\n", "Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from arm_pyart) (1.5.3)\n", "Requirement already satisfied: xarray!=0.21.0 in /usr/local/lib/python3.10/dist-packages (from arm_pyart) (2024.2.0)\n", "Requirement already satisfied: shapely>=1.7 in /usr/local/lib/python3.10/dist-packages (from cartopy) (2.0.3)\n", "Requirement already satisfied: packaging>=20 in /usr/local/lib/python3.10/dist-packages (from cartopy) (23.2)\n", "Requirement already satisfied: pyshp>=2.1 in /usr/local/lib/python3.10/dist-packages (from cartopy) (2.3.1)\n", "Requirement already satisfied: pyproj>=3.1.0 in /usr/local/lib/python3.10/dist-packages (from cartopy) (3.6.1)\n", "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->arm_pyart) (1.2.0)\n", "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib->arm_pyart) (0.12.1)\n", "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->arm_pyart) (4.49.0)\n", "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->arm_pyart) (1.4.5)\n", "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->arm_pyart) (9.4.0)\n", "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->arm_pyart) (3.1.1)\n", "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib->arm_pyart) (2.8.2)\n", "Requirement already satisfied: certifi in /usr/local/lib/python3.10/dist-packages (from pyproj>=3.1.0->cartopy) (2024.2.2)\n", "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->arm_pyart) (2023.4)\n", "Requirement already satisfied: platformdirs>=2.5.0 in /usr/local/lib/python3.10/dist-packages (from pooch->arm_pyart) (4.2.0)\n", "Requirement already satisfied: requests>=2.19.0 in /usr/local/lib/python3.10/dist-packages (from pooch->arm_pyart) (2.31.0)\n", "Requirement already satisfied: aiobotocore<3.0.0,>=2.5.4 in /usr/local/lib/python3.10/dist-packages (from s3fs->arm_pyart) (2.12.1)\n", "Requirement already satisfied: aiohttp!=4.0.0a0,!=4.0.0a1 in /usr/local/lib/python3.10/dist-packages (from s3fs->arm_pyart) (3.9.3)\n", "Requirement already satisfied: cmweather in /usr/local/lib/python3.10/dist-packages (from xradar->arm_pyart) (0.3.2)\n", "Requirement already satisfied: dask in /usr/local/lib/python3.10/dist-packages (from xradar->arm_pyart) (2023.8.1)\n", "Requirement already satisfied: h5netcdf in /usr/local/lib/python3.10/dist-packages (from xradar->arm_pyart) (1.3.0)\n", "Requirement already satisfied: h5py in /usr/local/lib/python3.10/dist-packages (from xradar->arm_pyart) (3.9.0)\n", "Requirement already satisfied: lat-lon-parser in /usr/local/lib/python3.10/dist-packages (from xradar->arm_pyart) (1.3.0)\n", "Requirement already satisfied: xarray-datatree>=0.0.10 in /usr/local/lib/python3.10/dist-packages (from xradar->arm_pyart) (0.0.14)\n", "Requirement already satisfied: xmltodict in /usr/local/lib/python3.10/dist-packages (from xradar->arm_pyart) (0.13.0)\n", "Requirement already satisfied: botocore<1.34.52,>=1.34.41 in /usr/local/lib/python3.10/dist-packages (from aiobotocore<3.0.0,>=2.5.4->s3fs->arm_pyart) (1.34.51)\n", "Requirement already satisfied: wrapt<2.0.0,>=1.10.10 in /usr/local/lib/python3.10/dist-packages (from aiobotocore<3.0.0,>=2.5.4->s3fs->arm_pyart) (1.14.1)\n", "Requirement already satisfied: aioitertools<1.0.0,>=0.5.1 in /usr/local/lib/python3.10/dist-packages (from aiobotocore<3.0.0,>=2.5.4->s3fs->arm_pyart) (0.11.0)\n", "Requirement already satisfied: aiosignal>=1.1.2 in /usr/local/lib/python3.10/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs->arm_pyart) (1.3.1)\n", "Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs->arm_pyart) (23.2.0)\n", "Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs->arm_pyart) (1.4.1)\n", "Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib/python3.10/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs->arm_pyart) (6.0.5)\n", "Requirement already satisfied: yarl<2.0,>=1.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs->arm_pyart) (1.9.4)\n", "Requirement already satisfied: async-timeout<5.0,>=4.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs->arm_pyart) (4.0.3)\n", "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib->arm_pyart) (1.16.0)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->pooch->arm_pyart) (3.3.2)\n", "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->pooch->arm_pyart) (3.6)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->pooch->arm_pyart) (2.0.7)\n", "Requirement already satisfied: click>=8.0 in /usr/local/lib/python3.10/dist-packages (from dask->xradar->arm_pyart) (8.1.7)\n", "Requirement already satisfied: cloudpickle>=1.5.0 in /usr/local/lib/python3.10/dist-packages (from dask->xradar->arm_pyart) (2.2.1)\n", "Requirement already satisfied: partd>=1.2.0 in /usr/local/lib/python3.10/dist-packages (from dask->xradar->arm_pyart) (1.4.1)\n", "Requirement already satisfied: pyyaml>=5.3.1 in /usr/local/lib/python3.10/dist-packages (from dask->xradar->arm_pyart) (6.0.1)\n", "Requirement already satisfied: toolz>=0.10.0 in /usr/local/lib/python3.10/dist-packages (from dask->xradar->arm_pyart) (0.12.1)\n", "Requirement already satisfied: importlib-metadata>=4.13.0 in /usr/local/lib/python3.10/dist-packages (from dask->xradar->arm_pyart) (7.0.1)\n", "Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from botocore<1.34.52,>=1.34.41->aiobotocore<3.0.0,>=2.5.4->s3fs->arm_pyart) (1.0.1)\n", "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.10/dist-packages (from importlib-metadata>=4.13.0->dask->xradar->arm_pyart) (3.17.0)\n", "Requirement already satisfied: locket in /usr/local/lib/python3.10/dist-packages (from partd>=1.2.0->dask->xradar->arm_pyart) (1.0.0)\n" ] } ] }, { "cell_type": "code", "source": [ "# @title\n", "# BASIC CONFIGURATION\n", "rid = 50 # radar identification number, integer\n", "rdate = '2014/11/27' # UTC date to start the image generation (format: YYYY/MM/DD), string\n", "rtime = '05:00' # UTC time to start the image generation (format: HH:MM), string\n", "rdur = 1 # number of hours from start date/time for image generation (MUST NOT EXTEND TO THE NEXT DAY), integer\n", "prng = 150 # number of kilometers from the radar site to plot, integer\n", "field = 'reflectivity_horizontal' # product to plot. Reflectivity = 'reflectivity_horizontal', Doppler Velocity = 'velocity_horizontal'\n", " # (Others/Polarimetric:differential_reflectivity, cross_correlation_ratio, specific_differential_phase, differential_phase, spectrum_width), string\n", "# MAP CONFIGURATION\n", "hide_place_names = [''] #list of placenames you wish to hide from the map (they are auto generated), list of string\n", "nice_radar_name = 'Marburg' #name of radar to use for title, string\n", "nice_colorbar_name = field #name to use for colorbar\n", "range_ring_list = [50, 100] #list of range ring disances from the radar site (km), list of numbers\n", "\n", "# ADVANCED CONFIGURATION\n", "tilt = 1 # PPI index in volume to plot, first/lowest PPI is number 0, integer\n", "# ADVANCED CONFIGURATION - Reflectivity\n", "vmin_ref = 20 # minimum of colourmap (values less than will be removed), integer\n", "vmax_ref = 65 # maximum of colormap (values greater than will be removed), integer\n", "cmap_ref = 'pyart_HomeyerRainbow' # colormap to use. Another option is 'pyart_NWSRef' for more see https://arm-doe.github.io/pyart/API/generated/pyart.graph.html, string\n", "# ADVANCED CONFIGURATION - Doppler Velocity\n", "vmin_vel =-26 # minimum of colormap, integer\n", "vmax_vel = 26 # maximum of colormap, integer\n", "cmap_vel = 'pyart_BuDRd18' # colormap to use, string\n", "# ADVANCED CONFIGURATION - Other/Polarimetric\n", "vmin_pol = -1 # minimum of colormap, integer\n", "vmax_pol = 5 # maximum of colormap, integer\n", "cmap_pol = 'pyart_HomeyerRainbow' # olormap to use, string\n", "\n", "# now run the last cell to create the animation" ], "metadata": { "id": "EstGP-n45X9N" }, "execution_count": 27, "outputs": [] }, { "cell_type": "code", "source": [ "# @title\n", "#########################################################################\n", "def get_date_from_filename(filename, delimiter='_', date_fmt='%Y%m%d_%H%M%S'):\n", " \"\"\"\n", " INPUT:\n", " filename (str):\n", " can contain path, has no impact on this function.\n", " filename must use the convention IDDDD_DATE. delimiter + everything else\n", " DATE must have same format as date\n", " OUTPUT:\n", " radar_id (int)\n", " \"\"\"\n", " if not isinstance(filename, str):\n", " raise ValueError(f\"get_id_from_filename: filename is not a string: {filename}\")\n", " return None\n", " if delimiter not in filename:\n", " raise ValueError(f\"get_id_from_filename: Delimiter not found in filename: {filename}\")\n", " return None\n", " fn = os.path.basename(filename)\n", " fn_parts = fn.split(delimiter)\n", " try:\n", " dtstr = fn_parts[1] + '_' + fn_parts[2].split('.')[0]\n", " dt = datetime.strptime(dtstr, date_fmt)\n", " return dt\n", " except:\n", " raise ValueError(f\"get_id_from_filename: Failed to extract radar if from: {filename}\")\n", " return None\n", "\n", "def get_id_from_filename(filename, delimiter='_'):\n", " \"\"\"\n", " INPUT:\n", " filename (str):\n", " can contain path, has no impact on this function.\n", " filename must use the convention IDDDD + delimiter + everything else\n", " OUTPUT:\n", " radar_id (int)\n", " \"\"\"\n", " if not isinstance(filename, str):\n", " raise ValueError(f\"get_id_from_filename: filename is not a string: {filename}\")\n", " return None\n", " if delimiter not in filename:\n", " raise ValueError(f\"get_id_from_filename: Delimiter not found in filename: {filename}\")\n", " return None\n", " fn = os.path.basename(filename)\n", " fn_parts = fn.split(delimiter)\n", " try:\n", " radar_id = int(fn_parts[0])\n", " return radar_id\n", " except:\n", " raise ValueError(f\"get_id_from_filename: Failed to extract radar if from: {filename}\")\n", " return None\n", "\n", "def make_gif(files, output, delay=100):\n", " frames = [Image.open(image) for image in files]\n", " frame_one = frames[0]\n", " frame_one.save(output, format=\"GIF\", append_images=frames,\n", " save_all=True, duration=delay, loop=0)\n", "\n", "def _read_csv(csv_ffn, header_line):\n", " \"\"\"\n", " CSV reader used for the radar locations file (comma delimited)\n", " \"\"\"\n", " df = pandas.read_csv(csv_ffn, header=header_line)\n", " as_dict = df.to_dict(orient='list')\n", " return as_dict\n", "\n", "# Function which generates a plot for each sweep\n", "def _fast_plot(odim_ffn, cdict, img_path):\n", "\n", " #open figure\n", " fig = plt.figure(figsize=(10, 8), facecolor='w')\n", "\n", " #load radar object\n", " my_radar = pyart.aux_io.read_odim_h5(odim_ffn)\n", "\n", " #find limits\n", " radar_lat = my_radar.latitude['data'][0]\n", " radar_lon = my_radar.longitude['data'][0]\n", "\n", " plot_range = cdict['prng'] * 1000 #convert to m\n", " min_lon, min_lat = pyart.core.cartesian_to_geographic_aeqd(-plot_range, -plot_range, radar_lon, radar_lat)\n", " max_lon, max_lat = pyart.core.cartesian_to_geographic_aeqd(plot_range, plot_range, radar_lon, radar_lat)\n", "\n", " # Set up the GIS projection\n", " projection = ccrs.Mercator(\n", " central_longitude=radar_lon,\n", " min_latitude=min_lat, max_latitude=max_lat)\n", "\n", " #load diplay class for radar using cartopy\n", " display = pyart.graph.RadarMapDisplay(my_radar)\n", "\n", " #set plotting options\n", " if cdict['field']=='reflectivity_horizontal':\n", " vmin = cdict['vmin_ref']\n", " vmax = cdict['vmax_ref']\n", " cmap = cdict['cmap_ref']\n", " elif cdict['field']=='velocity_horizontal':\n", " vmin = cdict['vmin_vel']\n", " vmax = cdict['vmax_vel']\n", " cmap = cdict['cmap_vel']\n", " else:\n", " vmin = cdict['vmin_pol']\n", " vmax = cdict['vmax_pol']\n", " cmap = cdict['cmap_pol']\n", "\n", " #create plot\n", " display.plot_ppi_map(cdict['field'], cdict['tilt'],\n", " projection=projection, colorbar_flag=True,\n", " min_lon=min_lon, max_lon=max_lon, min_lat=min_lat, max_lat=max_lat,\n", " vmin=vmin, vmax=vmax, cmap=cmap,\n", " resolution='10m', mask_outside=True)\n", " #add city markers\n", " ax = plt.gca()\n", " fname = cartopy.io.shapereader.natural_earth(resolution='10m', category='cultural', name='populated_places')\n", " reader = cartopy.io.shapereader.Reader(fname)\n", " city_list = list(reader.records())\n", " texts_list = []\n", " for city in city_list:\n", " if (((city.attributes['LATITUDE'] >= min_lat) and (city.attributes['LATITUDE'] <= max_lat))\n", " and ((city.attributes['LONGITUDE'] >= min_lon) and (city.attributes['LONGITUDE'] <= max_lon))\n", " and (city.attributes['NAME'] not in cdict['hide_place_names'])):\n", " ax.scatter(city.attributes['LONGITUDE'], city.attributes['LATITUDE'], s=6, color='black',\n", " transform=ccrs.PlateCarree(), zorder=5)\n", " texts_list.append(ax.text(city.attributes['LONGITUDE']+0.01, city.attributes['LATITUDE']+0.01,\n", " city.attributes['NAME'], fontsize=10, transform=ccrs.PlateCarree()))\n", " #optimise the location of text\n", " adjust_text(texts_list)\n", "\n", " #add range rings\n", " display.plot_range_rings(np.array(cdict['range_ring_list'],dtype=float),\n", " ax=ax, col='k', ls='-', lw=0.5)\n", "\n", " #Now we add lat lon lines\n", " gl = display.ax.gridlines(draw_labels=True,\n", " linewidth=1, color='gray', alpha=0.5,\n", " linestyle='--')\n", " gl.xlabel_style = {'size': 12}\n", " gl.ylabel_style = {'size': 12}\n", " gl.xlabels_top = False\n", " gl.ylabels_right = False\n", "\n", " #fix title\n", " current_title = ax.get_title()\n", " new_title = cdict['nice_radar_name'] + ' ' + current_title\n", " ax.set_title(new_title)\n", "\n", " out_ffn = f'{img_path}/{os.path.basename(odim_ffn)[:-3]}_{cdict[\"field\"]}.png'\n", "\n", " plt.savefig(out_ffn, dpi=100) # Saving figure.\n", " plt.close() # Release memory\n", " fig.clf() # Clear figure\n", "\n", " #todo\n", " #-fix title\n", "\n", "def build_animation(cdict):\n", "\n", " #config\n", " base_url = 'http://dapds00.nci.org.au/thredds/fileServer/rq0' #base url for NCI dataset\n", "\n", " #parse inputs\n", " radar_id = cdict['rid']\n", " start_dt = datetime.strptime(cdict['rdate'] + ' ' + cdict['rtime'], '%Y/%m/%d %H:%M')\n", " end_dt = start_dt + timedelta(hours = cdict['rdur'])\n", "\n", " #build request filename url\n", " zip_fn = str(radar_id) + '_' + start_dt.strftime('%Y%m%d') + '.pvol.zip'\n", " zip_ffn = '/tmp/' + zip_fn\n", " request_url = '/'.join([base_url, str(radar_id), start_dt.strftime('%Y'), 'vol', zip_fn])\n", "\n", " #download the zip file\n", " if not os.path.isfile(zip_ffn):\n", " print('Fetching:', request_url)\n", " urllib.request.urlretrieve(request_url, zip_ffn)\n", " else:\n", " print('File already downloaded:', request_url)\n", "\n", " #extract the zip file to a temporary directory\n", " temp_dir = tempfile.mkdtemp()\n", " zip_fh = zipfile.ZipFile(zip_ffn)\n", " zip_fh.extractall(path = temp_dir)\n", " zip_fh.close()\n", "\n", " #list all the volumes extracted from the zip file\n", " file_list = sorted(glob(temp_dir + '/*'))\n", "\n", " #now let's read the datetime numbers of all the volumes for comparision\n", " file_dt_list = []\n", " for i, fname in enumerate(file_list):\n", " file_dt_list.append(get_date_from_filename(fname))\n", "\n", " #find the index of volumes within our start and end times\n", " file_dt_array = np.array(file_dt_list)\n", " filter_file_list = []\n", " for i, file_dt in enumerate(file_dt_array):\n", " if file_dt >= start_dt and file_dt <= end_dt:\n", " filter_file_list.append(file_list[i])\n", "\n", " #generate images\n", " print('Generating Images')\n", " img_path = tempfile.mkdtemp()\n", " n_img = len(filter_file_list)\n", " for odim_ffn in tqdm(filter_file_list, total=n_img):\n", " _fast_plot(odim_ffn, cdict, img_path)\n", "\n", " #create image folder if requires\n", " if not os.path.exists('images'):\n", " os.mkdir('images')\n", "\n", " #create animation\n", " now = datetime.now()\n", " gif_ffn = './images/' + f'{radar_id}_{start_dt.strftime(\"%Y-%m-%d\")}_{cdict[\"field\"]}.animation.{now.strftime(\"%d-%m-%Y_%H:%M:%S\")}.gif'\n", " files_to_animate = sorted(glob(img_path + '/*'))\n", " make_gif(files_to_animate, gif_ffn, delay=100)\n", "\n", " #zip files and move to local directory\n", " now = datetime.now()\n", " img_zip_fn = f'{radar_id}_{start_dt.strftime(\"%Y-%m-%d\")}_{cdict[\"field\"]}.image_request.{now.strftime(\"%d-%m-%Y_%H:%M:%S\")}.zip'\n", " img_zip_ffn = './images/' + img_zip_fn\n", " #zip up\n", " zipf = zipfile.ZipFile(img_zip_ffn, 'w', zipfile.ZIP_DEFLATED)\n", " files_to_zip = glob(img_path + '/*')\n", " for item in files_to_zip:\n", " zipf.write(item)\n", " zipf.close()\n", "\n", " #remove temp images\n", " os.system('rm -rf ' + img_path)\n", "\n", " local_file = FileLink(img_zip_ffn, result_html_prefix=\"Click here to download zip of images: \")\n", " display(local_file)\n", "\n", " local_file = FileLink(gif_ffn, result_html_prefix=\"Click here to download animation: \")\n", " display(local_file)" ], "metadata": { "id": "-XothS2U5A4A" }, "execution_count": 28, "outputs": [] }, { "cell_type": "code", "execution_count": 29, "metadata": { "id": "Nwi0GVNAj7Fb", "outputId": "9882b643-8e50-47b3-c8bb-40f4f2834e40", "colab": { "base_uri": "https://localhost:8080/", "height": 159 } }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Fetching: http://dapds00.nci.org.au/thredds/fileServer/rq0/50/2014/vol/50_20141127.pvol.zip\n", "Generating Images\n" ] }, { "output_type": "stream", "name": "stderr", "text": [ "100%|██████████| 6/6 [02:31<00:00, 25.28s/it]\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "/content/images/50_2014-11-27_reflectivity_horizontal.image_request.07-03-2024_04:02:16.zip" ], "text/html": [ "Click here to download zip of images: ./images/50_2014-11-27_reflectivity_horizontal.image_request.07-03-2024_04:02:16.zip
" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "/content/images/50_2014-11-27_reflectivity_horizontal.animation.07-03-2024_04:02:16.gif" ], "text/html": [ "Click here to download animation: ./images/50_2014-11-27_reflectivity_horizontal.animation.07-03-2024_04:02:16.gif
" ] }, "metadata": {} } ], "source": [ "cdict = {\n", " 'rid':rid, 'rdate':rdate, 'rtime':rtime, 'rdur':rdur, 'prng':prng, 'field':field,\n", " 'hide_place_names':hide_place_names,'nice_radar_name':nice_radar_name, 'range_ring_list':range_ring_list,\n", " 'tilt':tilt,\n", " 'vmin_ref':vmin_ref, 'vmax_ref':vmax_ref, 'cmap_ref':cmap_ref,\n", " 'vmin_vel':vmin_vel, 'vmax_vel':vmax_vel, 'cmap_vel':cmap_vel,\n", " 'vmin_pol':vmin_pol, 'vmax_pol':vmax_pol, 'cmap_pol':cmap_pol\n", " }\n", "\n", "build_animation(cdict)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Qlr2jJjej7Fc" }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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", "version": "3.9.7" }, "colab": { "provenance": [], "include_colab_link": true } }, "nbformat": 4, "nbformat_minor": 0 }