{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# `xarray-leaflet`\n", "\n", "`xarray-leaflet` ist eine xarray-Erweiterung für das Plotten von gekachelten Karten. Sowohl [xarray](https://docs.xarray.dev/en/stable/) als auch [Leaflet](ipyleaflet.ipynb) können mit Datenfragmenten arbeiten, `xarray` durch [Dask Chunks](https://docs.dask.org/en/latest/array-chunks.html) und Leaflet durch *map tiles*. Mit `xarray-leaflet` arbeiten beide zusammen." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Installation\n", "\n", "Ihr könnt `xarray-leaflet` in eurem Jupyter-Kernel installieren mit:\n", "\n", "``` bash\n", "$ pipenv install xarray-leaflet\n", "Installing xarray-leaflet…\n", "…\n", "``` \n", "\n", "Standardmäßig generiert `xarray-leaflet` Kacheln in temporären Verzeichnissen. Bei dynamischen Karten wird bei jeder Interaktion mit der Karte ein neues Verzeichnis erstellt, entweder durch Ziehen oder Zoomen. Dies liegt daran, dass eine direkte Zuordnung zwischen dem Kachelverzeichnis und der URL besteht, unter der die Kacheln bereitgestellt werden. Da bei dynamischen Karten Kacheln nicht vom Browser zwischengespeichert werden sollten, muss sich die URL ständig ändern. Diese temporären Verzeichnisse werden derzeit nicht automatisch bereinigt. Ihr solltet dies daher regelmäßig selbst tun. In ix-Systemen sind sie unter `/tmp/xarray_leaflet_*`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Beispiel\n", "\n", "Um das Beispiel ausführen zu können, müsst Ihr zusätzlich die folgenden Pakete in eurem Kernel installieren:\n", "\n", "* requests\n", "* tqdm\n", "* xarray-leaflet\n", "* dask" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import os\n", "import warnings\n", "import zipfile\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import requests\n", "import rioxarray\n", "import xarray_leaflet\n", "\n", "from ipyleaflet import LayersControl, Map, WidgetControl, basemaps\n", "from ipywidgets import FloatSlider\n", "from tqdm import tqdm" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wir werden das DEM (Digital Elevation Model) für Europa aus dem [HydroSHEDS](https://www.hydrosheds.org)-Datensatz anzeigen, das das Terrain darstellt. Laden wir zunächst die Daten herunter:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "url = 'https://edcintl.cr.usgs.gov/downloads/sciweb1/shared/hydrosheds/sa_30s_zip_grid/eu_dem_30s_grid.zip'\n", "filename = os.path.basename(url)\n", "name = filename[:filename.find('_grid')]\n", "adffile = os.path.join(name, name, 'w001001.adf')\n", "\n", "if not os.path.exists(adffile):\n", " r = requests.get(url, stream=True)\n", " with open(filename, 'wb') as f:\n", " total_length = int(r.headers.get('content-length'))\n", " for chunk in tqdm(r.iter_content(chunk_size=1024), total=(total_length/1024) + 1):\n", " if chunk:\n", " f.write(chunk)\n", " f.flush()\n", " zip = zipfile.ZipFile(filename)\n", " zip.extractall('.')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Es ist ein Datensatz, den [Rasterio](https://rasterio.readthedocs.io/en/stable/) öffnen kann, aber um ein schönes `DataArray` mit allen Metadaten zu erhalten, öffnen wir es mit [rioxarray](https://corteva.github.io/rioxarray/stable/):" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
<xarray.DataArray (band: 1, y: 5760, x: 9480)>\n", "[54604800 values with dtype=float32]\n", "Coordinates:\n", " * band (band) int64 1\n", " * x (x) float64 -14.0 -13.99 -13.98 -13.97 ... 64.98 64.99 65.0\n", " * y (y) float64 60.0 59.99 59.98 59.97 ... 12.03 12.02 12.01 12.0\n", " spatial_ref int64 0\n", "Attributes:\n", " scale_factor: 1.0\n", " add_offset: 0.0