{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Gridded Data Renderer\n", "\n", "PAVICS uses THREDDS WMS service to render netCDF data on a map canvas. The WMS `GetMap` operation passers the layer identification (``), styles, figure size and format, projection and color range and the server returns an image that can be displayed in a figure or a map canvas. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import Image\n", "from owslib.wms import WebMapService\n", "\n", "server = \"https://pavics.ouranos.ca/twitcher/ows/proxy/thredds/\"\n", "path = \"/birdhouse/testdata/flyingpigeon/cmip5/tasmax_Amon_MPI-ESM-MR_rcp45_r2i1p1_200601-200612.nc\"\n", "wms = WebMapService(server + \"wms\" + path, version=\"1.3.0\")\n", "resp = wms.getmap(\n", " layers=[\"tasmax\"],\n", " format=\"image/png\",\n", " colorscalerange=f\"{250},{350}\",\n", " size=[256, 256],\n", " srs=\"CRS:84\",\n", " bbox=(150, 30, 250, 80),\n", " time=\"2006-02-15\",\n", " transparent=True,\n", ")\n", "Image(resp.read())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One issue with the figure above is the colorscale range and the colormap, which do not provide a lot of contrast. So lets get a copy of the data using the OPeNDAP protocol to find the actual minimum and maximum values. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(235.5495147705078, 306.79168701171875)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import xarray as xr\n", "\n", "ds = xr.open_dataset(server + \"dodsC\" + path)\n", "subtas = ds.tasmax.sel(\n", " time=slice(\"2006-02-01\", \"2006-03-01\"), lon=slice(188, 330), lat=slice(6, 70)\n", ")\n", "mn, mx = subtas.min().values.tolist(), subtas.max().values.tolist()\n", "mn, mx" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we'll simply pass those min/max to `getmap` with the colorscalerange parameter, and change the palette in the same go using the `styles` parameter. The supported styles are stored in the layer's metadata." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['boxfill/alg',\n", " 'boxfill/alg2',\n", " 'boxfill/ferret',\n", " 'boxfill/greyscale',\n", " 'boxfill/ncview',\n", " 'boxfill/occam',\n", " 'boxfill/occam_pastel-30',\n", " 'boxfill/rainbow',\n", " 'boxfill/redblue',\n", " 'boxfill/sst_36']" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sorted(wms.contents[\"tasmax\"].styles.keys())" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "resp = wms.getmap(\n", " layers=[\"tasmax\"],\n", " styles=[\"boxfill/occam\"],\n", " format=\"image/png\",\n", " colorscalerange=f\"{mn},{mx}\",\n", " size=[256, 256],\n", " srs=\"CRS:84\",\n", " bbox=(150, 30, 250, 80),\n", " time=\"2006-02-15\",\n", " transparent=True,\n", ")\n", "Image(resp.read())" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.7.9" } }, "nbformat": 4, "nbformat_minor": 2 }