From 71ec788083e4405a98bfa409b7304ccd24344a44 Mon Sep 17 00:00:00 2001 From: Martin Schobben Date: Wed, 18 Sep 2024 15:03:31 +0200 Subject: [PATCH] Built site for gh-pages --- .nojekyll | 2 +- index.html | 12 +- notebooks/01_local_dask.ipynb | 6092 +++++++++++++++++++++++++++++++++ search.json | 130 - 4 files changed, 6096 insertions(+), 140 deletions(-) create mode 100644 notebooks/01_local_dask.ipynb diff --git a/.nojekyll b/.nojekyll index 2c24a17..e4b1dee 100644 --- a/.nojekyll +++ b/.nojekyll @@ -1 +1 @@ -f3529c3f \ No newline at end of file +81c96247 \ No newline at end of file diff --git a/index.html b/index.html index 4f9e3cf..43c0e32 100644 --- a/index.html +++ b/index.html @@ -31,7 +31,7 @@ - + @@ -157,12 +157,6 @@

Dask Flood Mapper

Preface - - @@ -606,8 +600,8 @@

Preface

diff --git a/notebooks/01_local_dask.ipynb b/notebooks/01_local_dask.ipynb new file mode 100644 index 0000000..43242a3 --- /dev/null +++ b/notebooks/01_local_dask.ipynb @@ -0,0 +1,6092 @@ +{ + "cells": [ + { + "cell_type": "raw", + "id": "cecb10d5", + "metadata": {}, + "source": [ + "---\n", + "title: Dask Client\n", + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "af3e35b9", + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": "(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n var py_version = '3.4.3'.replace('rc', '-rc.').replace('.dev', '-dev.');\n var reloading = false;\n var Bokeh = root.Bokeh;\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks;\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, js_modules, js_exports, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n if (js_modules == null) js_modules = [];\n if (js_exports == null) js_exports = {};\n\n root._bokeh_onload_callbacks.push(callback);\n\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n run_callbacks();\n return null;\n }\n if (!reloading) {\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n }\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n window._bokeh_on_load = on_load\n\n function on_error() {\n console.error(\"failed to load \" + url);\n }\n\n var skip = [];\n if (window.requirejs) {\n window.requirejs.config({'packages': {}, 'paths': {}, 'shim': {}});\n root._bokeh_is_loading = css_urls.length + 0;\n } else {\n root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n }\n\n var existing_stylesheets = []\n var links = document.getElementsByTagName('link')\n for (var i = 0; i < links.length; i++) {\n var link = links[i]\n if (link.href != null) {\n\texisting_stylesheets.push(link.href)\n }\n }\n for (var i = 0; i < css_urls.length; i++) {\n var url = css_urls[i];\n if (existing_stylesheets.indexOf(url) !== -1) {\n\ton_load()\n\tcontinue;\n }\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n } var existing_scripts = []\n var scripts = document.getElementsByTagName('script')\n for (var i = 0; i < scripts.length; i++) {\n var script = scripts[i]\n if (script.src != null) {\n\texisting_scripts.push(script.src)\n }\n }\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (var i = 0; i < js_modules.length; i++) {\n var url = js_modules[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (const name in js_exports) {\n var url = js_exports[name];\n if (skip.indexOf(url) >= 0 || root[name] != null) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onerror = on_error;\n element.async = false;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n element.textContent = `\n import ${name} from \"${url}\"\n window.${name} = ${name}\n window._bokeh_on_load()\n `\n document.head.appendChild(element);\n }\n if (!js_urls.length && !js_modules.length) {\n on_load()\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.4.3.min.js\", \"https://cdn.holoviz.org/panel/1.4.5/dist/panel.min.js\"];\n var js_modules = [];\n var js_exports = {};\n var css_urls = [];\n var inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n\ttry {\n inline_js[i].call(root, root.Bokeh);\n\t} catch(e) {\n\t if (!reloading) {\n\t throw e;\n\t }\n\t}\n }\n // Cache old bokeh versions\n if (Bokeh != undefined && !reloading) {\n\tvar NewBokeh = root.Bokeh;\n\tif (Bokeh.versions === undefined) {\n\t Bokeh.versions = new Map();\n\t}\n\tif (NewBokeh.version !== Bokeh.version) {\n\t Bokeh.versions.set(NewBokeh.version, NewBokeh)\n\t}\n\troot.Bokeh = Bokeh;\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n }\n root._bokeh_is_initializing = false\n }\n\n function load_or_wait() {\n // Implement a backoff loop that tries to ensure we do not load multiple\n // versions of Bokeh and its dependencies at the same time.\n // In recent versions we use the root._bokeh_is_initializing flag\n // to determine whether there is an ongoing attempt to initialize\n // bokeh, however for backward compatibility we also try to ensure\n // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n // before older versions are fully initialized.\n if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n root._bokeh_is_initializing = false;\n root._bokeh_onload_callbacks = undefined;\n console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n load_or_wait();\n } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n setTimeout(load_or_wait, 100);\n } else {\n root._bokeh_is_initializing = true\n root._bokeh_onload_callbacks = []\n var bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n if (!reloading && !bokeh_loaded) {\n\troot.Bokeh = undefined;\n }\n load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n\tconsole.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n\trun_inline_js();\n });\n }\n }\n // Give older versions of the autoload script a head-start to ensure\n // they initialize before we start loading newer version.\n setTimeout(load_or_wait, 100)\n}(window));", + "application/vnd.holoviews_load.v0+json": "" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": "\nif ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n}\n\n\n function JupyterCommManager() {\n }\n\n JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n comm_manager.register_target(comm_id, function(comm) {\n comm.on_msg(msg_handler);\n });\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n comm.onMsg = msg_handler;\n });\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n console.log(message)\n var content = {data: message.data, comm_id};\n var buffers = []\n for (var buffer of message.buffers || []) {\n buffers.push(new DataView(buffer))\n }\n var metadata = message.metadata || {};\n var msg = {content, buffers, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n })\n }\n }\n\n JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n if (comm_id in window.PyViz.comms) {\n return window.PyViz.comms[comm_id];\n } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n if (msg_handler) {\n comm.on_msg(msg_handler);\n }\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n comm.open();\n if (msg_handler) {\n comm.onMsg = msg_handler;\n }\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n var comm_promise = google.colab.kernel.comms.open(comm_id)\n comm_promise.then((comm) => {\n window.PyViz.comms[comm_id] = comm;\n if (msg_handler) {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data};\n var metadata = message.metadata || {comm_id};\n var msg = {content, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n }\n }) \n var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n return comm_promise.then((comm) => {\n comm.send(data, metadata, buffers, disposeOnDone);\n });\n };\n var comm = {\n send: sendClosure\n };\n }\n window.PyViz.comms[comm_id] = comm;\n return comm;\n }\n window.PyViz.comm_manager = new JupyterCommManager();\n \n\n\nvar JS_MIME_TYPE = 'application/javascript';\nvar HTML_MIME_TYPE = 'text/html';\nvar EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\nvar CLASS_NAME = 'output';\n\n/**\n * Render data to the DOM node\n */\nfunction render(props, node) {\n var div = document.createElement(\"div\");\n var script = document.createElement(\"script\");\n node.appendChild(div);\n node.appendChild(script);\n}\n\n/**\n * Handle when a new output is added\n */\nfunction handle_add_output(event, handle) {\n var output_area = handle.output_area;\n var output = handle.output;\n if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n return\n }\n var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n if (id !== undefined) {\n var nchildren = toinsert.length;\n var html_node = toinsert[nchildren-1].children[0];\n html_node.innerHTML = output.data[HTML_MIME_TYPE];\n var scripts = [];\n var nodelist = html_node.querySelectorAll(\"script\");\n for (var i in nodelist) {\n if (nodelist.hasOwnProperty(i)) {\n scripts.push(nodelist[i])\n }\n }\n\n scripts.forEach( function (oldScript) {\n var newScript = document.createElement(\"script\");\n var attrs = [];\n var nodemap = oldScript.attributes;\n for (var j in nodemap) {\n if (nodemap.hasOwnProperty(j)) {\n attrs.push(nodemap[j])\n }\n }\n attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n if (JS_MIME_TYPE in output.data) {\n toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n }\n output_area._hv_plot_id = id;\n if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n window.PyViz.plot_index[id] = Bokeh.index[id];\n } else {\n window.PyViz.plot_index[id] = null;\n }\n } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n var bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n var script_attrs = bk_div.children[0].attributes;\n for (var i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n}\n\n/**\n * Handle when an output is cleared or removed\n */\nfunction handle_clear_output(event, handle) {\n var id = handle.cell.output_area._hv_plot_id;\n var server_id = handle.cell.output_area._bokeh_server_id;\n if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n if (server_id !== null) {\n comm.send({event_type: 'server_delete', 'id': server_id});\n return;\n } else if (comm !== null) {\n comm.send({event_type: 'delete', 'id': id});\n }\n delete PyViz.plot_index[id];\n if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n var doc = window.Bokeh.index[id].model.document\n doc.clear();\n const i = window.Bokeh.documents.indexOf(doc);\n if (i > -1) {\n window.Bokeh.documents.splice(i, 1);\n }\n }\n}\n\n/**\n * Handle kernel restart event\n */\nfunction handle_kernel_cleanup(event, handle) {\n delete PyViz.comms[\"hv-extension-comm\"];\n window.PyViz.plot_index = {}\n}\n\n/**\n * Handle update_display_data messages\n */\nfunction handle_update_output(event, handle) {\n handle_clear_output(event, {cell: {output_area: handle.output_area}})\n handle_add_output(event, handle)\n}\n\nfunction register_renderer(events, OutputArea) {\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n var toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[0]);\n element.append(toinsert);\n return toinsert\n }\n\n events.on('output_added.OutputArea', handle_add_output);\n events.on('output_updated.OutputArea', handle_update_output);\n events.on('clear_output.CodeCell', handle_clear_output);\n events.on('delete.Cell', handle_clear_output);\n events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n safe: true,\n index: 0\n });\n}\n\nif (window.Jupyter !== undefined) {\n try {\n var events = require('base/js/events');\n var OutputArea = require('notebook/js/outputarea').OutputArea;\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n } catch(err) {\n }\n}\n", + "application/vnd.holoviews_load.v0+json": "" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.holoviews_exec.v0+json": "", + "text/html": [ + "
\n", + "
\n", + "
\n", + "" + ] + }, + "metadata": { + "application/vnd.holoviews_exec.v0+json": { + "id": "p1002" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "import pystac_client\n", + "from odc import stac as odc_stac\n", + "import xarray as xr\n", + "import rioxarray\n", + "import numpy as np\n", + "import hvplot.xarray" + ] + }, + { + "cell_type": "markdown", + "id": "423e3041", + "metadata": {}, + "source": [ + "Dask makes parallel computing easy by providing a familiar API common libraries, such as Pandas and Numpy. This allow efficient scaling of the here presented workflow for this adaptation of the TU Wien Bayesian flood mapping algorithm. The data size will be a main limiting factor as the data grows larger than RAM. For this reason we will partition our data in chunks which will presented to the machine workers by Dasks task scheduler in a most efficient manner. Although many of Dask' settings can be handled automatically, we can also modify some parameters for optimal performance of the workflow for the desired processing environment. So, note, that this highly depends on your own machine's specifications.\n", + "\n", + "I will, furthermore, set the temporary directory for when Dask spills data from the workers memory to disk.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "302bc97a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import dask\n", + "dask.config.set(temporary_directory='/tmp')" + ] + }, + { + "cell_type": "markdown", + "id": "9c97e0c6", + "metadata": {}, + "source": [ + "We can then set the Dask Client, where we avoid inter-worker communication which is common for working with `numpy` and `xarray` in this case.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "3639900a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + "
\n", + "

Client

\n", + "

Client-786bb6a7-75bd-11ef-8f9a-f780c6f503ec

\n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "
Connection method: Cluster objectCluster type: distributed.LocalCluster
\n", + " Dashboard: http://128.131.72.130:8787/status\n", + "
\n", + "\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "

Cluster Info

\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

LocalCluster

\n", + "

97114163

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + "
\n", + " Dashboard: http://128.131.72.130:8787/status\n", + " \n", + " Workers: 3\n", + "
\n", + " Total threads: 6\n", + " \n", + " Total memory: 78.23 GiB\n", + "
Status: runningUsing processes: False
\n", + "\n", + "
\n", + " \n", + "

Scheduler Info

\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

Scheduler

\n", + "

Scheduler-8da346fa-b314-4b95-bd47-69dfcc188db6

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " Comm: inproc://128.131.72.130/298906/1\n", + " \n", + " Workers: 3\n", + "
\n", + " Dashboard: http://128.131.72.130:8787/status\n", + " \n", + " Total threads: 6\n", + "
\n", + " Started: Just now\n", + " \n", + " Total memory: 78.23 GiB\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "

Workers

\n", + "
\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 0

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: inproc://128.131.72.130/298906/4\n", + " \n", + " Total threads: 2\n", + "
\n", + " Dashboard: http://128.131.72.130:34691/status\n", + " \n", + " Memory: 26.08 GiB\n", + "
\n", + " Nanny: None\n", + "
\n", + " Local directory: /tmp/dask-scratch-space/worker-l9ekzuzd\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 1

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: inproc://128.131.72.130/298906/5\n", + " \n", + " Total threads: 2\n", + "
\n", + " Dashboard: http://128.131.72.130:40963/status\n", + " \n", + " Memory: 26.08 GiB\n", + "
\n", + " Nanny: None\n", + "
\n", + " Local directory: /tmp/dask-scratch-space/worker-quur8k_l\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 2

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: inproc://128.131.72.130/298906/6\n", + " \n", + " Total threads: 2\n", + "
\n", + " Dashboard: http://128.131.72.130:46733/status\n", + " \n", + " Memory: 26.08 GiB\n", + "
\n", + " Nanny: None\n", + "
\n", + " Local directory: /tmp/dask-scratch-space/worker-__h445_o\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "\n", + "
\n", + "
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from dask.distributed import Client, wait\n", + "client = Client(processes=False, threads_per_worker=2,\n", + " n_workers=3, memory_limit='28GB')\n", + "client" + ] + }, + { + "cell_type": "markdown", + "id": "037a5c30", + "metadata": {}, + "source": [ + "In conjunction with setting up the Dask client I will chunk my arrays along three dimensions according to the following specifications for maximum performance on my setup. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "f8bd5ca6", + "metadata": {}, + "outputs": [], + "source": [ + "chunks = {'time':1, \"latitude\": 1300, \"longitude\": 1300}" + ] + }, + { + "cell_type": "markdown", + "id": "88405395", + "metadata": {}, + "source": [ + "## Cube Definitions\n", + "\n", + "The following generic specifications are used for presenting the data.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "27eeb6f2", + "metadata": {}, + "outputs": [], + "source": [ + "crs = \"EPSG:4326\" # Coordinate Reference System - World Geodetic System 1984 (WGS84) in this case \n", + "res = 0.00018 # 20 meter in degree" + ] + }, + { + "cell_type": "markdown", + "id": "96382e50", + "metadata": {}, + "source": [ + "## Northern Germany Flood\n", + "\n", + "Storm Babet hit the Denmark and Northern coast at the 20th of October 2023 [Wikipedia](https://en.wikipedia.org/wiki/Storm_Babet). Here an area around Zingst at the Baltic coast of Northern Germany is selected as the study area.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "f5a7d8b4", + "metadata": {}, + "outputs": [], + "source": [ + "time_range = \"2022-10-11/2022-10-25\"\n", + "minlon, maxlon = 12.3, 13.1\n", + "minlat, maxlat = 54.3, 54.6\n", + "bounding_box = [minlon, minlat, maxlon, maxlat]" + ] + }, + { + "cell_type": "markdown", + "id": "fee36982", + "metadata": {}, + "source": [ + "## EODC STAC Catalog\n", + "\n", + "The `pystac_client` establishes a connection to the EODC STAC Catalog. This results in a catalog object that can be used to discover collections and items hosted at EODC.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cb7eed4c", + "metadata": {}, + "outputs": [], + "source": [ + "eodc_catalog = pystac_client.Client.open(\"https://stac.eodc.eu/api/v1\")" + ] + }, + { + "cell_type": "markdown", + "id": "b9c44ade", + "metadata": {}, + "source": [ + "## Microwave Backscatter Measurements\n", + "\n", + "The basic premise of microwave-based backscattering can be seen in the sketch below, the characteristics of backscattering over land and water differ considerably. With this knowledge we can detect whenever a pixel with a predominant land like signature changes to a water like signature in the event of flooding.\n", + "\n", + "![](https://www.gsi.ie/images/images/SAR_mapping_land_water.jpg)\n", + "\n", + "*Schematic backscattering over land and water. Image from [Geological Survey Ireland](https://www.gsi.ie/images/images/SAR_mapping_land_water.jpg)*\n", + "\n", + "We discover Sentinel-1 microwave backscatter ($\\sigma_0$ [1]) at a 20 meter resolution, like so:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "d24f790f", + "metadata": {}, + "outputs": [], + "source": [ + "search = eodc_catalog.search(\n", + " collections=\"SENTINEL1_SIG0_20M\",\n", + " bbox=bounding_box,\n", + " datetime=time_range,\n", + ")\n", + "\n", + "items_sig0 = search.item_collection()" + ] + }, + { + "cell_type": "markdown", + "id": "a26558e4", + "metadata": {}, + "source": [ + "The state of the orbit and relative orbit number is also saved, as the water and land likelihoods (which are calculated later on) dependent on the orbital configuration. These variables will be added as additional coordinates to the data cube. For this purpose a small helper function is defined, like so:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "0bb76591", + "metadata": {}, + "outputs": [], + "source": [ + "def extract_orbit_names(items):\n", + " return np.array([items[i].properties[\"sat:orbit_state\"][0].upper() + \\\n", + " str(items[i].properties[\"sat:relative_orbit\"]) \\\n", + " for i in range(len(items))])" + ] + }, + { + "cell_type": "markdown", + "id": "2f87d1f4", + "metadata": {}, + "source": [ + "We will also save the scaling factor and nodata values of STAC items to correct the loaded data accordingly. Again a helper function will be used to correctly scale and fill no data values of the cube.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "f2de75e2", + "metadata": {}, + "outputs": [], + "source": [ + "def post_process_eodc_cube(dc: xr.Dataset, items, bands):\n", + " if not isinstance(bands, tuple):\n", + " bands = tuple([bands])\n", + " for i in bands:\n", + " dc[i] = post_process_eodc_cube_(dc[i], items, i)\n", + " return dc\n", + "\n", + "def post_process_eodc_cube_(dc: xr.Dataset, items, band):\n", + " scale = items[0].assets[band].extra_fields.get('raster:bands')[0]['scale']\n", + " nodata = items[0].assets[band].extra_fields.get('raster:bands')[0]['nodata']\n", + " return dc.where(dc != nodata) / scale" + ] + }, + { + "cell_type": "markdown", + "id": "2567644a", + "metadata": {}, + "source": [ + "The VV polarization of the discover items can be loaded with `odc-stac` and cast in the desired projection and resolution. The data is at this point only lazily loaded, meaning that we only make an instance of the outlines of the datacube with the proper shape and resolution, but without actually loading all the data. This is done by providing the chunks as defined before, which partitions the data in portions which are more easily handled by the setup used for processing the data (in this case my own pc). \n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "6e5f655a", + "metadata": {}, + "outputs": [], + "source": [ + "bands = \"VV\"\n", + "sig0_dc = odc_stac.load(items_sig0,\n", + " bands=bands,\n", + " crs=crs,\n", + " chunks=chunks,\n", + " resolution=res,\n", + " bbox=bounding_box,\n", + " groupby=None,\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "1ac48abb", + "metadata": {}, + "source": [ + "Now we can rescale our variable, fill the no data values with `np.nan` values, and add the orbit names, with the previous defined functions.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "023e72ff", + "metadata": {}, + "outputs": [], + "source": [ + "sig0_dc = post_process_eodc_cube(sig0_dc, items_sig0, bands).\\\n", + " rename_vars({ \"VV\": \"sig0\"}).\\\n", + " assign_coords(orbit=(\"time\", extract_orbit_names(items_sig0))).\\\n", + " dropna(dim=\"time\", how=\"all\").\\\n", + " sortby(\"time\")" + ] + }, + { + "cell_type": "markdown", + "id": "92120430", + "metadata": {}, + "source": [ + "Then we remove duplicate time dimensions from the data cube and extract the orbit names as we will need those for obtaining the correct harmonic parameters and local incidence angles,as explained in the next section. Also, note, that we call `dask.persist` to materialize the object but retain it as a delayed object in the workers memory.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "dd2674bc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset> Size: 237MB\n",
+       "Dimensions:      (time: 8, latitude: 1668, longitude: 4445)\n",
+       "Coordinates:\n",
+       "  * latitude     (latitude) float64 13kB 54.6 54.6 54.6 54.6 ... 54.3 54.3 54.3\n",
+       "  * longitude    (longitude) float64 36kB 12.3 12.3 12.3 12.3 ... 13.1 13.1 13.1\n",
+       "    spatial_ref  int32 4B 4326\n",
+       "  * time         (time) datetime64[ns] 64B 2022-10-11T05:25:01 ... 2022-10-23...\n",
+       "    orbit        (time) <U4 128B 'D168' 'A44' 'A44' ... 'A146' 'A146' 'D168'\n",
+       "Data variables:\n",
+       "    sig0         (time, latitude, longitude) float32 237MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>
" + ], + "text/plain": [ + " Size: 237MB\n", + "Dimensions: (time: 8, latitude: 1668, longitude: 4445)\n", + "Coordinates:\n", + " * latitude (latitude) float64 13kB 54.6 54.6 54.6 54.6 ... 54.3 54.3 54.3\n", + " * longitude (longitude) float64 36kB 12.3 12.3 12.3 12.3 ... 13.1 13.1 13.1\n", + " spatial_ref int32 4B 4326\n", + " * time (time) datetime64[ns] 64B 2022-10-11T05:25:01 ... 2022-10-23...\n", + " orbit (time) " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "__, indices = np.unique(sig0_dc.time, return_index=True)\n", + "indices.sort()\n", + "orbit_sig0 = sig0_dc.orbit[indices].data\n", + "sig0_dc = sig0_dc.groupby(\"time\").mean(skipna=True)\n", + "sig0_dc = sig0_dc.assign_coords(orbit=(\"time\", orbit_sig0))\n", + "sig0_dc = sig0_dc.persist()\n", + "wait(sig0_dc)\n", + "sig0_dc" + ] + }, + { + "cell_type": "markdown", + "id": "d271c7c1", + "metadata": {}, + "source": [ + "## Harmonic Parameters\n", + "\n", + "The so-called likelihoods of $P(\\sigma^0|flood)$ and $P(\\sigma^0|nonflood)$ can be calculated from past backscattering information. To be able to this we load the harmonic parameters we can model the expected variations in land back scattering based on seasonal changes in vegetation. The procedure is similar to the backscattering routine.\n", + "\n", + "We discover items.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "ecabe307", + "metadata": {}, + "outputs": [], + "source": [ + "search = eodc_catalog.search(\n", + " collections=\"SENTINEL1_HPAR\",\n", + " bbox=bounding_box\n", + ")\n", + "\n", + "items_hpar = search.item_collection()" + ] + }, + { + "cell_type": "markdown", + "id": "579ac7f9", + "metadata": {}, + "source": [ + "Load the data as a lazy object.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "ed8ebfd9", + "metadata": {}, + "outputs": [], + "source": [ + "bands = (\"C1\", \"C2\", \"C3\", \"M0\", \"S1\", \"S2\", \"S3\", \"STD\")\n", + "hpar_dc = odc_stac.load(items_hpar,\n", + " bands=bands,\n", + " crs=crs,\n", + " chunks=chunks,\n", + " resolution=res,\n", + " bbox=bounding_box,\n", + " groupby=None,\n", + " )\n", + "\n", + "hpar_dc = post_process_eodc_cube(hpar_dc, items_hpar, bands).\\\n", + " rename({\"time\": \"orbit\"})\n", + "hpar_dc[\"orbit\"] = extract_orbit_names(items_hpar)\n", + "hpar_dc = hpar_dc.groupby(\"orbit\").mean(skipna=True)" + ] + }, + { + "cell_type": "markdown", + "id": "22555dd1", + "metadata": {}, + "source": [ + "We expand the variables along the orbits of sigma naught to be able to calculate the correct land reference backscatter signatures.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "f23050ec", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset> Size: 2GB\n",
+       "Dimensions:      (orbit: 8, latitude: 1668, longitude: 4445)\n",
+       "Coordinates:\n",
+       "  * latitude     (latitude) float64 13kB 54.6 54.6 54.6 54.6 ... 54.3 54.3 54.3\n",
+       "  * longitude    (longitude) float64 36kB 12.3 12.3 12.3 12.3 ... 13.1 13.1 13.1\n",
+       "    spatial_ref  int32 4B 4326\n",
+       "  * orbit        (orbit) object 64B 'D168' 'A44' 'A44' ... 'A146' 'A146' 'D168'\n",
+       "Data variables:\n",
+       "    C1           (orbit, latitude, longitude) float32 237MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n",
+       "    C2           (orbit, latitude, longitude) float32 237MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n",
+       "    C3           (orbit, latitude, longitude) float32 237MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n",
+       "    M0           (orbit, latitude, longitude) float32 237MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n",
+       "    S1           (orbit, latitude, longitude) float32 237MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n",
+       "    S2           (orbit, latitude, longitude) float32 237MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n",
+       "    S3           (orbit, latitude, longitude) float32 237MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n",
+       "    STD          (orbit, latitude, longitude) float32 237MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>
" + ], + "text/plain": [ + " Size: 2GB\n", + "Dimensions: (orbit: 8, latitude: 1668, longitude: 4445)\n", + "Coordinates:\n", + " * latitude (latitude) float64 13kB 54.6 54.6 54.6 54.6 ... 54.3 54.3 54.3\n", + " * longitude (longitude) float64 36kB 12.3 12.3 12.3 12.3 ... 13.1 13.1 13.1\n", + " spatial_ref int32 4B 4326\n", + " * orbit (orbit) object 64B 'D168' 'A44' 'A44' ... 'A146' 'A146' 'D168'\n", + "Data variables:\n", + " C1 (orbit, latitude, longitude) float32 237MB dask.array\n", + " C2 (orbit, latitude, longitude) float32 237MB dask.array\n", + " C3 (orbit, latitude, longitude) float32 237MB dask.array\n", + " M0 (orbit, latitude, longitude) float32 237MB dask.array\n", + " S1 (orbit, latitude, longitude) float32 237MB dask.array\n", + " S2 (orbit, latitude, longitude) float32 237MB dask.array\n", + " S3 (orbit, latitude, longitude) float32 237MB dask.array\n", + " STD (orbit, latitude, longitude) float32 237MB dask.array" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hpar_dc = hpar_dc.sel(orbit = orbit_sig0)\n", + "hpar_dc = hpar_dc.persist()\n", + "wait(hpar_dc)\n", + "hpar_dc" + ] + }, + { + "cell_type": "markdown", + "id": "3edbb490", + "metadata": {}, + "source": [ + "## Local Incidence Angles\n", + "\n", + "Local incidence angles of measured microwave backscattering is as well important for calculating reference backscatter values, but now for water bodies. The procedure is much the same as for the harmonic parameters.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "c5592a53", + "metadata": {}, + "outputs": [], + "source": [ + "search = eodc_catalog.search(\n", + " collections=\"SENTINEL1_MPLIA\",\n", + " bbox=bounding_box\n", + ")\n", + "\n", + "items_plia = search.item_collection()" + ] + }, + { + "cell_type": "markdown", + "id": "f9fd880f", + "metadata": {}, + "source": [ + "Load the lazy object and preprocess.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "cd5f428d", + "metadata": {}, + "outputs": [], + "source": [ + "bands = \"MPLIA\"\n", + "plia_dc = odc_stac.load(items_plia,\n", + " bands=bands,\n", + " crs=crs,\n", + " chunks=chunks,\n", + " resolution=res,\n", + " bbox=bounding_box,\n", + " groupby=None,\n", + " )\n", + "\n", + "plia_dc = post_process_eodc_cube(plia_dc, items_plia, bands).\\\n", + " rename({\"time\": \"orbit\"})\n", + "plia_dc[\"orbit\"] = extract_orbit_names(items_plia)\n", + "plia_dc = plia_dc.groupby(\"orbit\").mean(skipna=True)" + ] + }, + { + "cell_type": "markdown", + "id": "e6443f15", + "metadata": {}, + "source": [ + "We expand the variables along the orbits of sigma naught to be able to calculate the correct land reference backscatter signatures.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "224f2945", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset> Size: 237MB\n",
+       "Dimensions:      (orbit: 8, latitude: 1668, longitude: 4445)\n",
+       "Coordinates:\n",
+       "  * latitude     (latitude) float64 13kB 54.6 54.6 54.6 54.6 ... 54.3 54.3 54.3\n",
+       "  * longitude    (longitude) float64 36kB 12.3 12.3 12.3 12.3 ... 13.1 13.1 13.1\n",
+       "    spatial_ref  int32 4B 4326\n",
+       "  * orbit        (orbit) object 64B 'D168' 'A44' 'A44' ... 'A146' 'A146' 'D168'\n",
+       "Data variables:\n",
+       "    MPLIA        (orbit, latitude, longitude) float32 237MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>
" + ], + "text/plain": [ + " Size: 237MB\n", + "Dimensions: (orbit: 8, latitude: 1668, longitude: 4445)\n", + "Coordinates:\n", + " * latitude (latitude) float64 13kB 54.6 54.6 54.6 54.6 ... 54.3 54.3 54.3\n", + " * longitude (longitude) float64 36kB 12.3 12.3 12.3 12.3 ... 13.1 13.1 13.1\n", + " spatial_ref int32 4B 4326\n", + " * orbit (orbit) object 64B 'D168' 'A44' 'A44' ... 'A146' 'A146' 'D168'\n", + "Data variables:\n", + " MPLIA (orbit, latitude, longitude) float32 237MB dask.array" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plia_dc = plia_dc.sel(orbit = orbit_sig0)\n", + "plia_dc = plia_dc.persist()\n", + "wait(plia_dc)\n", + "plia_dc" + ] + }, + { + "cell_type": "markdown", + "id": "245f7c66", + "metadata": {}, + "source": [ + "## ESA World Cover from Terrascope\n", + "\n", + "For flood mapping we are only interested in microwave backscattering over what used to be land, as such, we need a way to mask water bodies. For this we use the ESA World Cover data from the following STAC catalog.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "982c9e1f", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "os.environ['AWS_NO_SIGN_REQUEST'] = 'YES'\n", + "wcover_catalog = pystac_client.Client.open('https://services.terrascope.be/stac/')" + ] + }, + { + "cell_type": "markdown", + "id": "35f5c022", + "metadata": {}, + "source": [ + "Similarly, we discover the required items.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "4df8d2a3", + "metadata": {}, + "outputs": [], + "source": [ + "search = wcover_catalog.search(\n", + " collections= \"urn:eop:VITO:ESA_WorldCover_10m_2021_AWS_V2\",\n", + " bbox=bounding_box\n", + ")\n", + "\n", + "items_wcover = search.item_collection()" + ] + }, + { + "cell_type": "markdown", + "id": "222f335f", + "metadata": {}, + "source": [ + "Load the data lazily.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "dc76e128", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset> Size: 30MB\n",
+       "Dimensions:      (latitude: 1668, longitude: 4445)\n",
+       "Coordinates:\n",
+       "  * latitude     (latitude) float64 13kB 54.6 54.6 54.6 54.6 ... 54.3 54.3 54.3\n",
+       "  * longitude    (longitude) float64 36kB 12.3 12.3 12.3 12.3 ... 13.1 13.1 13.1\n",
+       "    spatial_ref  int32 4B 4326\n",
+       "Data variables:\n",
+       "    wcover       (latitude, longitude) float32 30MB dask.array<chunksize=(1300, 1300), meta=np.ndarray>
" + ], + "text/plain": [ + " Size: 30MB\n", + "Dimensions: (latitude: 1668, longitude: 4445)\n", + "Coordinates:\n", + " * latitude (latitude) float64 13kB 54.6 54.6 54.6 54.6 ... 54.3 54.3 54.3\n", + " * longitude (longitude) float64 36kB 12.3 12.3 12.3 12.3 ... 13.1 13.1 13.1\n", + " spatial_ref int32 4B 4326\n", + "Data variables:\n", + " wcover (latitude, longitude) float32 30MB dask.array" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wcover_dc = odc_stac.load(items_wcover,\n", + " crs=crs,\n", + " chunks=chunks,\n", + " resolution=res,\n", + " bbox=bounding_box,\n", + " ).\\\n", + " squeeze(\"time\").\\\n", + " drop_vars(\"time\").\\\n", + " rename_vars({\"ESA_WORLDCOVER_10M_MAP\": \"wcover\"})\n", + "wcover_dc = wcover_dc.persist()\n", + "wait(wcover_dc)\n", + "wcover_dc" + ] + }, + { + "cell_type": "markdown", + "id": "15aad1de", + "metadata": {}, + "source": [ + "## Fuse cube\n", + "\n", + "Here we fuse the four data cubes together and filter for the values that have a HAND value of above zero. We can now drop the obit coordinates as well as time slices which contain no land backscattering data.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "e18d7992", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset> Size: 2GB\n",
+       "Dimensions:      (time: 6, latitude: 1668, longitude: 4445)\n",
+       "Coordinates:\n",
+       "  * latitude     (latitude) float64 13kB 54.6 54.6 54.6 54.6 ... 54.3 54.3 54.3\n",
+       "  * longitude    (longitude) float64 36kB 12.3 12.3 12.3 12.3 ... 13.1 13.1 13.1\n",
+       "    spatial_ref  int32 4B 4326\n",
+       "  * time         (time) datetime64[ns] 48B 2022-10-11T05:25:01 ... 2022-10-23...\n",
+       "Data variables:\n",
+       "    sig0         (time, latitude, longitude) float32 178MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n",
+       "    MPLIA        (time, latitude, longitude) float32 178MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n",
+       "    C1           (time, latitude, longitude) float32 178MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n",
+       "    C2           (time, latitude, longitude) float32 178MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n",
+       "    C3           (time, latitude, longitude) float32 178MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n",
+       "    M0           (time, latitude, longitude) float32 178MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n",
+       "    S1           (time, latitude, longitude) float32 178MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n",
+       "    S2           (time, latitude, longitude) float32 178MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n",
+       "    S3           (time, latitude, longitude) float32 178MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n",
+       "    STD          (time, latitude, longitude) float32 178MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n",
+       "    wcover       (latitude, longitude) float32 30MB dask.array<chunksize=(1300, 1300), meta=np.ndarray>
" + ], + "text/plain": [ + " Size: 2GB\n", + "Dimensions: (time: 6, latitude: 1668, longitude: 4445)\n", + "Coordinates:\n", + " * latitude (latitude) float64 13kB 54.6 54.6 54.6 54.6 ... 54.3 54.3 54.3\n", + " * longitude (longitude) float64 36kB 12.3 12.3 12.3 12.3 ... 13.1 13.1 13.1\n", + " spatial_ref int32 4B 4326\n", + " * time (time) datetime64[ns] 48B 2022-10-11T05:25:01 ... 2022-10-23...\n", + "Data variables:\n", + " sig0 (time, latitude, longitude) float32 178MB dask.array\n", + " MPLIA (time, latitude, longitude) float32 178MB dask.array\n", + " C1 (time, latitude, longitude) float32 178MB dask.array\n", + " C2 (time, latitude, longitude) float32 178MB dask.array\n", + " C3 (time, latitude, longitude) float32 178MB dask.array\n", + " M0 (time, latitude, longitude) float32 178MB dask.array\n", + " S1 (time, latitude, longitude) float32 178MB dask.array\n", + " S2 (time, latitude, longitude) float32 178MB dask.array\n", + " S3 (time, latitude, longitude) float32 178MB dask.array\n", + " STD (time, latitude, longitude) float32 178MB dask.array\n", + " wcover (latitude, longitude) float32 30MB dask.array" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "flood_dc = xr.merge([sig0_dc, plia_dc, hpar_dc, wcover_dc])\n", + "flood_dc = flood_dc.where(flood_dc.wcover != 80)\n", + "flood_dc = flood_dc.\\\n", + " reset_index(\"orbit\", drop=True).\\\n", + " rename({\"orbit\": \"time\"}).\\\n", + " dropna(dim=\"time\", how=\"all\", subset=[\"sig0\"])\n", + "flood_dc = flood_dc.persist()\n", + "wait(flood_dc)\n", + "flood_dc" + ] + }, + { + "cell_type": "markdown", + "id": "e1455f37", + "metadata": {}, + "source": [ + "## Likelihoods\n", + "\n", + "Now we are ready to calculate the likelihoods of micorwave backscattering given flooding (or non flooding).\n", + "\n", + "### Water\n", + "\n", + "We start with water which is the simplest calculation, where the hard coded values are coefficients of a regression model fitted to global water backscattering values. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "ad1fe5d4", + "metadata": {}, + "outputs": [], + "source": [ + "def calc_water_likelihood(dc):\n", + " return dc.MPLIA * -0.394181 + -4.142015" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "2db1e4c0", + "metadata": {}, + "outputs": [], + "source": [ + "flood_dc[\"wbsc\"] = calc_water_likelihood(flood_dc)" + ] + }, + { + "cell_type": "markdown", + "id": "bacc676e", + "metadata": {}, + "source": [ + "### Land\n", + "\n", + "For land backscattering we construct the harmonic model from the parameters as contained in the fused data cube. By doing so, we obtain a reference land backscattering value to which to compare our actual observed sigma naught values.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "8f9777eb", + "metadata": {}, + "outputs": [], + "source": [ + "def harmonic_expected_backscatter(dc):\n", + " w = np.pi * 2 / 365\n", + " \n", + " t = dc.time.dt.dayofyear\n", + " wt = w * t\n", + " \n", + " M0 = dc.M0\n", + " S1 = dc.S1\n", + " S2 = dc.S2\n", + " S3 = dc.S3\n", + " C1 = dc.C1\n", + " C2 = dc.C2\n", + " C3 = dc.C3\n", + " hm_c1 = (M0 + S1 * np.sin(wt)) + (C1 * np.cos(wt))\n", + " hm_c2 = ((hm_c1 + S2 * np.sin(2 * wt)) + C2 * np.cos(2 * wt))\n", + " hm_c3 = ((hm_c2 + S3 * np.sin(3 * wt)) + C3 * np.cos(3 * wt))\n", + " return hm_c3" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "0a4eb9a6", + "metadata": {}, + "outputs": [], + "source": [ + "flood_dc[\"hbsc\"] = harmonic_expected_backscatter(flood_dc)" + ] + }, + { + "cell_type": "markdown", + "id": "f535bb51", + "metadata": {}, + "source": [ + "## Flood mapping\n", + "\n", + "Having calculated the likelihoods, we can now move on to calculate the probability of (non-)flooding given a pixel's $\\sigma^0$. These so-called *posteriors* need one more piece of information, as can be seen in the equation above. We need the probability that a pixel is flooded $P(F)$ or not flooded $P(NF)$. Of course, these are the figures we've been trying to find this whole time. We don't actually have them yet, so what can we do? In Bayesian statistics, we can just start with our best guess. These guesses are called our \"priors\", because they are the beliefs we hold *prior* to looking at the data. This subjective prior belief is the foundation Bayesian statistics, and we use the likelihoods we just calculated to update our belief in this particular hypothesis. This updated belief is called the \"posterior\".\n", + "\n", + "Let's say that our best estimate for the chance of flooding versus non-flooding of a pixel is 50-50: a coin flip. We now can also calculate the probability of backscattering $P(\\sigma^0)$, as the weighted average of the water and land likelihoods, ensuring that our posteriors range between 0 to 1.\n", + "\n", + "The following code block shows how we calculate the priors which allow use to predict whether it is likely if a land pixel became flooded.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "5d6c33f2", + "metadata": {}, + "outputs": [], + "source": [ + "def bayesian_flood_decision(dc):\n", + " \n", + " nf_std = 2.754041\n", + " sig0 = dc.sig0\n", + " std = dc.STD\n", + " wbsc = dc.wbsc\n", + " hbsc = dc.hbsc\n", + "\n", + " f_prob = (1.0 / (std * np.sqrt(2 * np.pi))) * np.exp(-0.5 * \\\n", + " (((sig0 - wbsc) / nf_std) ** 2))\n", + " nf_prob = (1.0 / (nf_std * np.sqrt(2 * np.pi))) * np.exp(-0.5 * \\\n", + " (((sig0 - hbsc) / nf_std) ** 2))\n", + " \n", + " evidence = (nf_prob * 0.5) + (f_prob * 0.5)\n", + " nf_post_prob = (nf_prob * 0.5) / evidence\n", + " f_post_prob = (f_prob * 0.5) / evidence\n", + " decision = xr.where(np.isnan(f_post_prob) | np.isnan(nf_post_prob), np.nan, np.greater(f_post_prob, nf_post_prob))\n", + " return nf_post_prob, f_post_prob, decision" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "5bfbe4a9", + "metadata": {}, + "outputs": [], + "source": [ + "flood_dc[[\"nf_post_prob\", \"f_post_prob\", \"decision\"]] = bayesian_flood_decision(flood_dc)" + ] + }, + { + "cell_type": "markdown", + "id": "45a1e6a0", + "metadata": {}, + "source": [ + "## Postprocessing\n", + "\n", + "We continue by improving our flood map by filtering out observations that we expect to have low sensitivity to flooding based on a predefined set of criteria.\n", + "\n", + "These criteria include:\n", + "* Masking of Exceeding Incidence Angles\n", + "* Identification of Conflicting Distributions\n", + "* Removal of Measurement Outliers\n", + "* Denial of High Uncertainty on Decision\n" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "d1aa0a68", + "metadata": {}, + "outputs": [], + "source": [ + "def post_processing(dc):\n", + " dc = dc * np.logical_and(dc.MPLIA >= 27, dc.MPLIA <= 48)\n", + " dc = dc * (dc.hbsc > (dc.wbsc + 0.5 * 2.754041))\n", + " land_bsc_lower = dc.hbsc - 3 * dc.STD\n", + " land_bsc_upper = dc.hbsc + 3 * dc.STD\n", + " water_bsc_upper = dc.wbsc + 3 * 2.754041\n", + " mask_land_outliers = np.logical_and(dc.sig0 > land_bsc_lower, dc.sig0 < land_bsc_upper)\n", + " mask_water_outliers = dc.sig0 < water_bsc_upper\n", + " dc = dc * (mask_land_outliers | mask_water_outliers)\n", + " return (dc * (dc.f_post_prob > 0.8)).decision" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "9f178029", + "metadata": {}, + "outputs": [], + "source": [ + "flood_output = post_processing(flood_dc)" + ] + }, + { + "cell_type": "markdown", + "id": "63b2ce5a", + "metadata": {}, + "source": [ + "## Removal of Speckles\n", + "\n", + "The following step is designed to further improve the clarity of the floodmaps. These filters do not directly relate to prior knowledge on backscattering, but consists of contextual evidence that supports, or oppose, a flood classification. This mainly targets so-called speckles. These speckles are areas of one or a few pixels, and which are likely the result of the diversity of scattering surfaces at a sub-pixel level. In this approach it is argued that small, solitary flood surfaces are unlikely. Hence speckles are removed by applying a smoothing filter which consists of a rolling window median along the x and y-axis simultaneously.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "64bef83c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'decision' (time: 6, latitude: 1668, longitude: 4445)> Size: 356MB\n",
+       "dask.array<where, shape=(6, 1668, 4445), dtype=float64, chunksize=(1, 1302, 1302), chunktype=numpy.ndarray>\n",
+       "Coordinates:\n",
+       "  * latitude     (latitude) float64 13kB 54.6 54.6 54.6 54.6 ... 54.3 54.3 54.3\n",
+       "  * longitude    (longitude) float64 36kB 12.3 12.3 12.3 12.3 ... 13.1 13.1 13.1\n",
+       "    spatial_ref  int32 4B 4326\n",
+       "  * time         (time) datetime64[ns] 48B 2022-10-11T05:25:01 ... 2022-10-23...
" + ], + "text/plain": [ + " Size: 356MB\n", + "dask.array\n", + "Coordinates:\n", + " * latitude (latitude) float64 13kB 54.6 54.6 54.6 54.6 ... 54.3 54.3 54.3\n", + " * longitude (longitude) float64 36kB 12.3 12.3 12.3 12.3 ... 13.1 13.1 13.1\n", + " spatial_ref int32 4B 4326\n", + " * time (time) datetime64[ns] 48B 2022-10-11T05:25:01 ... 2022-10-23..." + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "flood_output = flood_output.rolling({\"longitude\": 5, \"latitude\": 5}, center=True).median(skipna=True).persist()\n", + "wait(flood_output)\n", + "flood_output" + ] + }, + { + "cell_type": "markdown", + "id": "cd5dd5b0", + "metadata": {}, + "source": [ + "## Results\n", + "\n", + "We are now ready to visualize our results.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "b9c04941", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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X6OTjPH1zTff9K7z9NNPl6s+0dbBKW3XcNx+++3euqxevTpuZRiG+dcl8vLyvL+5fOM3PfsAWI1kHxIGDSZnKSwsNDIzM70XV/y5+OKLDUnGhRdeGLCc3r17G5KMc845x+9Fi1AOHTrkbWDcfPPNEa9vVhmBRNpgGjt2rCGdHc5x//79fpd5+umnvWVu3LjRtLqacSEv1sm+9evXe5d/5pln/C7z888/ey+OjRs3zu8ydmkwPfvss966fPzxx36XiUVd3377be923nzzTb/LrF271rvMtGnTwiqXZF/sEVudhdganmSKrdOnTzeks0Ncud3umCX7rCjD14IFC0LG73BMnTrVW06gG2reeOMN7zILFiwIq1wrkn2e4bwzMzON/Px8v8vccccd3ou8hw8fLvHaE088EfK9GsZ/zxEdOnQwre4oi/jqLMTX8CRyfC0qKjIaN25sSDKuvvrquNQh0dquvu/n2WefjVsZ/pT3usQ999xjSDKGDBliGMZ/9znJPgBWYxhPON7q1avlcrk0ceJESdKePXvKTCzctGnTEusEm4i5e/fuJSbOXbVqlfr27av69eurSpUquuiii/TMM8/o9OnT3nWOHTumv/zlL7r44ouVkZGhWrVq6brrrtPatWtD1r+goEB/+9vfdPXVV6tu3bqqWLGi6tatq969e+vNN99M2CF0KlSooPPPP1/S2cmyS9u9e7c2b94sSRoyZEjAcjyvZWdn67PPPou4HnXq1FHdunUD1iNWZZhl0aJFkqSuXbuqQYMGfpfx3Z/vvvtuTOplV579JQU+zho2bOgdOsXu++tXv/qV93k8j0XPfk1PT/cOr1Jahw4dvOdmu+/XZERsdSZiqzWcGlt/+uknPfroo0pLS9PMmTPlcrniXSXTzJs3T9LZIb6GDRsWdTmez7ZZs2a67LLL/C7Tr18/VapUSVL8Ptv8/HytWLHCW5/09HS/y3mOw+LiYn3wwQclXvvmm28kSVWrVlX79u0Dbqt79+6SpHXr1sX9u5eIiK/ORHy1hpPi65IlS7R3715J0r333huXOiRa27VixYre5544G48yzLZu3TrNmDFDNWrU0LRp0+JdHQBJhmQfEMTTTz+tq6++Wu+9954OHjyo/Px8bdmyRQ8++KAGDhyooqIi7dmzR506ddKjjz6q7777TidPnlRubq6WLFmibt26aeXKlQHL//7773XhhRdq7Nix+uijj3T48GGdOXNGhw8f1tKlSzVkyBD169cv4LwATnfo0CFJUvXq1cu8tn79eu/zzp07ByzD97UNGzZEXIczZ84oJycnYD1iVYYZsrOztWfPHknB91mTJk28jalo9lki8RxnDRs2VFZWVsDlPPtz9+7d3s86mMLCwojr4rlYU56LsZ7vlBT+sWhFXT37tV27dkEbXZ79muzHYbIhtlqL2GouJ8fWO+64Q3l5ebr33nt1ySWXxLs6pjly5Ig3kXXNNdcEvEAsSU2bNvWbPPHwfFbBPttKlSqpXbt2JZY32+7du71x1ZO08bVlyxbl5+eHrGuHDh2UkpLit66eOcJq1qwZ9LdGZmamJMkwDH399deRvA3EGfHVWsRXczktvnrm10tNTdXVV19d4rWioqKY1CHR2q6vv/6693mHDh0sK8OMuoarqKhIo0ePltvt1pNPPhn0NwoAWIFkHxyva9euOnHihB5++GFJUlZWVpmJhbds2RJxuR9//LEefvhhDRo0SGvWrFF2dra2bt2qW265RdLZH3svvviiBg8erJycHM2aNUt79uzR4cOH9fbbb6t+/foqLCzUqFGj/P7427dvn7p3765du3apSZMmmjVrlrZv366jR49q69atmjhxoipVqqT33ntPd9xxR1T7pqioSHl5eeV6FBcXR7XtUDZu3KidO3dK8v/jftu2bd7nwSY09lzEKb1OuN5//33vna7BGhlWl2GGcPeZdPYO9tLrJCPP+w93f/mu48/kyZOVmZmpSpUqqUKFCmrRooVuvfVW7930VnvrrbckSSkpKerYsWPQZa2qq9vt1n/+8x9J4e/X48eP68CBA+XaLsxFbA2M2BoasTX+sfW1117T4sWL1aRJE02YMCHe1THVa6+9pjNnzkiSRowYEXU5P//8s06cOCEp/M92+/btcem5FO5xWLlyZdWvX7/MOtJ/L+rn5uYGfQ9Hjx71Pt+6dWtU9UVgxNfAiK+hEV/jF1/XrVvnrUt6errmz5+vLl26qHLlyqpQoYLq1aunoUOHWnqTRCK0XXNycvT111/r97//vZ588klJ0qBBgyJK9plRhlWmTJmiTZs2qWPHjrr99tvjXR0AySieY4gCZopk3gMFGaP8yiuv9L4+evRov+tfccUV3rHlq1WrZmzfvr3MMsuWLfOWs2zZsjKv9+vXz5BkXHTRRcbRo0f9bmfx4sXeMr7++uuQ76s033HGo31EMz55KG632+jevbshyUhJSTG+++67Mst4xjiXZJw4cSJoebVq1TIkGQMHDoyoHgUFBcb5559vSDIyMjKMQ4cORbS+WWUEE8m8BwsXLvQu+9577wVddsCAAd55X8zixDn7atasaUgyBg0aFHS5d99911vuokWLyrwe6nvkcrmMhx56yDshvD++555ofPTRR971PXMD+GN1XXNzc72v3XfffUHr/Ne//tW77LfffhvyPTJnX+wRW8sitgZHbI1/bM3Ozjbq1q1rSDLef//9Eq8lwpx97du3NyQZNWvWDDh3nYfn/fo7h33zzTfeOj3//PNBy7n33nu9yx4/fjxkHSOds2/Xrl3e5f3N5+OZe1GSsXnz5qBltW3b1pBktGvXrsTfH330UW8Z69atC7j+JZdcEnYcR/SIr2URX4MjvsY3vnriaocOHYy77ror4DGYkpJiTJ8+3ZI6OLXtOnnyZL/bqVy5snH33Xcbp0+ftrSMaNrZ0VyX+M9//mOkp6cbaWlpxjfffFPitWAxHgDMRM8+IIAqVaromWee8fva0KFDJZ29+/Duu+/W//zP/5RZpmfPnjrnnHMkqcz8B7t27fKOtz59+nTVqlXL73Z69+7tnTfjlVdeiep92NGf//xnrV69WpI0duxYXXTRRWWWOXnypPd5oHlJPCpXrixJysvLi6ged9xxh7Zv3+6tU506dSJa36wyzBKLfZZoPPss3P0l+d9nnTp10t/+9jetX79eBw8e1OnTp7Vz50797W9/U4MGDWQYhp566qmgvStWr14twzCi6jHwyy+/eOcsqlGjhp566qmAy1pd12iOQ4ljMVkQW61DbLWGE2Prfffdp0OHDmnQoEG6/vrr41oXs23ZssXba2LIkCEhP5Pdu3fLMAzt3r27zGt2ildNmzb1xlV/87KZcRwOHDjQ+/zRRx+V2+0us+7rr7+ub7/91vtvT89H2B/x1TrEV2s4Lb4eO3ZM0tn5T//+97/roosu0tKlS71D4c6fP1+NGzeW2+3WvffeqyVLlpheh0Rpu3rceOONuvnmm0vMu2dFGWbUNRy33XabCgoKNG7cOLVu3drSbQFAICT7gAA6deqkmjVr+n3tvPPO8z7v1auX32VcLpd3udLD061cuVKGYSg9PV0dOnQIOhRJmzZtJP132IhIjBw50vujJtqHp8Fmlrfeesv7o/HSSy/V008/HXKdUGOrRzP2+nPPPac5c+ZIkvr06aNx48bFpQyrWLHPEll599eaNWt01113qV27dqpbt64qVqyoZs2a6a677tLGjRu954LJkyd7hwAyy6lTp9S/f3/t379fLpdL//znPwPOTRTrunIcojRiK7E1FmVYxQnntJUrV2ru3LmqVq2a/vrXv8a7OqabN2+e93l5hvAszQmfrUe0dW3btq2GDBkiSVq2bJmuu+46ff755zp69Kh27NihJ554QiNGjChxkdhO7xvBEV+Jr7EowypOOAd7bpAoLCzUueeeq08++US9evVSlSpVVKNGDd1www1atWqVMjIyZBiGHnroIcvq4rS263333ecdpvjAgQNavny5Bg8erHnz5ql9+/aaOnVqTMqw0uzZs7Vq1SplZWVp4sSJca0LgOSWFu8KAHbVsGHDgK/5NoLDWS4/P7/E3z3jphcUFKhGjRph1efw4cNhLWdnK1eu1LBhw2QYhv7nf/5HH3zwgSpVquR32apVq3qf5+fnKyMjI2C5nv0bbBlf//73v3X//fdLOtswfu211yJuQIRbRnFxcZnP3yM1NbXEsVRepfdZMIH2WbC7JcPdv05StWpV5ebmhr2/pMj3Q7169fTXv/5Vv/nNb3TmzBm9+eabpjX+zpw5oxtuuMF7B/azzz6rwYMHR12eGXWN5jiUEvP4QlnEVvMRW0tK5tian5+v3//+95KkJ554Queee65pZduB2+329hY6//zzyz3XlJPilRnHoST985//VHZ2tlasWKFly5Zp2bJlJV6vWbOmpk6dqlGjRklSwB5csB/iq/mIryUlc3z1lJeTkyNJGjdunDIzM8ssc95552nkyJH629/+pm+//Va7du0qMX9eeTm17VqhQgVVqFDBW5/69eurR48eeuqpp/Twww/r/vvvV7NmzUr0QLeiDKscPHhQDzzwgCTp+eefL3FsA0Cs0bMPCCA1NdW05UoPF+AZAiISBQUFEa9jp0nO16xZo379+un06dPKysrSihUrVK9evYDL165d2/v80KFDAZcrLCxUbm6uJHmHnglmwYIFuvnmm2UYhtq0aaMlS5ZE/GMskjI+/fRTVatWze+jd+/eEW03lHD3mXT2B6lUdp8Fqmu1atVMratdePZZuPtLCu84K61Xr17e4VY2bNgQ8fr+FBcX67e//a13iJjHH39c48ePL3e55a1rtWrVvMOoWL1f4TzEVmKrGWUQW/2bMmWKfvzxR1166aW66667TC3bDlasWKGff/5Zkjm9+qL5bCtVqhSXZJ8Zx6F09lhcunSpXnrpJfXo0UPnnHOOKlasqCZNmuiOO+7Qt99+q/PPP9+7fOPGjU16B7Aa8ZX4akYZxNfw6tu1a9eAy3Xr1s37/Pvvv7ekDk5su/rzhz/8wTsizbRp0+JWRnk9/PDDysnJUf/+/dW3b9+41AEAPEj2AXHguUiQmZkZ9pAk/uYaCeXll18O+gM4nMenn35a7ve7ceNG9e7dWydPnlT9+vW1cuVKZWVlBV3nggsu8D7/8ccfAy63Z88e75AaLVu2DFrm0qVLNXToUBUXF6tVq1b68MMPAw53Y2UZVgl3n0ln596QQu+zROfZZ+HuLym6fZaWlua9+9PTwC8PwzA0atQozZ8/X9LZYU2CzakQifLWNSUlxTsXTLj7tXr16kHvNAfCQWwltlrBSbHVM9TW+vXrlZaWJpfLVeaxZ88eSdLHH3/s/ZtZ8cNqniE8U1JS9Lvf/a7c5Z177rne80a4n+35558fl+Hkwj0OCwoKvEMwBjoOU1NT9bvf/U7Lly/XkSNHdPr0ae3evVsvvPCCGjduXOLi9GWXXWbSO4CTEV+Jr1ZwUnyVpFatWnmfB+v17Pva8ePHTa2DU9uugaSkpHjjzMaNG+NWRnl5fn8tXLjQ728v398N8+bN8/7N3xy9AFBeJPuAOGjevLkkKScnR0ePHo1zbaz13XffqWfPnjp27JjOOeccrVixQi1atAi5Xvv27b3Pv/zyy4DLrVmzxvv80ksvDbjcqlWrNHDgQBUWFqp58+ZasWJFxBOSR1NG9+7dAzaCPRO9m6V27dpq0qSJpOD77KefftL+/fslld1nwRrtichznO3fv1979+4NuJznOGvatKnfIVtCOXPmjLKzsyWZMyTWnXfe6b3oefvtt+vZZ58td5keZtTVs183btyowsLCgMt59mu7du2i2g7gi9hKbCW2Jq4TJ05o4cKFkqSrrrrKtB5nns8q2GdbWFjo7dkQ7PtgpYsuusjbyyJYXb/66itvIiHaunqG9qxfv77atm0bVRlILMRX4ivxteTND562kj++r5mdWHVq2zWYoqIiW5QBAImCZB8Shmf8brOG7rDSNddcI+nsj9M333zTsu3Ee5Lz//znP+rZs6eys7NVo0YNLVu2TBdddFFY6zZt2lS/+tWvJCnoPvK8lpmZqS5duvhdZs2aNerTp4/y8/PVqFEjrVy5MuJeRGaUEQt9+vSRJH3yySf65Zdf/C7juz+TfZgJz/6SAh9nBw4c8N4lHO3+Wrx4sU6fPi2p/Imt++67TzNnzpQk/e53v9MLL7xQrvJKM6Ounv2an5+v9957z+8yX3/9tfeu02Q/Du2M2FoWsfUsYmtJdoitkyZN0saNG4M+GjRoIOnsBVPP326//fa41DcS8+fP16lTpySZM4Snh+ez3blzp9avX+93mUWLFnmHJIzXZ1u5cmX16NFDkvTuu+9643RpnuMwNTVV119/fcTb+fHHH/XBBx9Ikm655RalpaVFWWOEQnwti/h6FvG1JDvEV0kaMGCA9/nHH38ccDnfpGibNm1MrYMT267BnDlzxpuYPO+88+JWRnn961//Cvn7y6NPnz7ev9EGBmAFkn1IGJ7xyw8fPmz7O3suuOAC/eY3v5Ek/fGPfww5lvvx48e9Q/I4xZ49e3T11Vfrl19+UdWqVbV48eKI7zAeM2aMpLN3WL700ktlXl+9erUWL14sSfr973/vdw4K32FY6tWrp5UrV3rHdA+XGWXEyh133KGUlBQVFRXpkUceKfP64cOHNWXKFElS586dk/6O7UsvvVSdOnWSJD3zzDM6cuRImWUeeeQRFRUVKTU11e8F0X379gXdxs8//6xx48ZJOnth58Ybb4y6vo8//riee+45SdINN9ygOXPmRDScWKzq2qdPH++duo899liZeVvcbrcefPBBSWfn2jBjODZYg9hqL8TW+HBKbM3KylKbNm2CPjxzqmZkZHj/Vr9+/bjUNxKe3uzVqlXTwIEDTSt3xIgR3rmdHnzwQW+vOI/8/Hw99thjkqQmTZpElUAzi+e7m52draeffrrM69u2bdPs2bMlSTfeeGOJ+aXCceLECd10000qLCxUw4YN9Yc//KH8lUZAxFd7Ib7Gh1Piq3S2h/XVV18tSfrrX//qd968rVu3euPVlVdeaXqC1Ult123btoVc5k9/+pM3yXvDDTdYUkYstGjRIuTvL4/MzEzv36LpdQkAoXCrHhKGZ0iD06dP64knntCdd97pDZ4ulyvsSctj5YUXXtC6det08OBBdezYUXfffbf69++v5s2by+Vy6fDhw9q0aZOWLFmid955Ry+++GLcfrxE6uDBg+rRo4f27t2rChUq6JVXXtEll1yivLy8gOt45oLwNWrUKM2aNUsbN27U6NGj9csvv2jo0KFKS0vTBx98oPvvv1+GYSgrK8vvBYlt27apV69eOnbsmKpXr64FCxaoYcOGAeuRkpKiKlWqmF5GJLZs2VJibH/fH+MbN24sccfjeeedV2YolgsvvFB33XWXnn/+ec2ZM0fS2Z5gdevW1ddff63x48fr0KFDqlChgjdpFK19+/aVqN+WLVu8z3/88ccSw7HUqVPH7512P/74ow4fPlzi377leYaskqRGjRqpUaNG5aqzP9OmTVO3bt106NAhdevWTVOnTlX79u116NAhPfvss96x9O+8884SczV49O3bV7Vr19agQYN02WWXqVGjRqpQoYJ+/vlnLVmypERD7E9/+pOaNWvmtx7du3f33iXqb+iZqVOnatKkSZLODmH2j3/8Q/n5+QHfV8WKFb0XdWNd14oVK2rq1Km64YYbtGXLFl199dV66qmn1KpVK+3evVsTJ07URx99JEmaMGFCwAuS5f0+oPyIrfZBbCW2hhtb7cDM97F7925vL4XBgwdHdCw0bdpUe/bsUZMmTfzOIVa7dm1NmDBB9913n1auXKl+/frp8ccfV9OmTbVlyxY99NBD2rp1q6Szcbh0XPXYuHFjid52vr9tSg9Pd+GFF6p69epl3qMn5o4YMcLvPD69evVSnz599N5772nChAk6efKkRo8erWrVqumTTz7RuHHjVFBQoBo1auiJJ57wW8/Jkydr/fr1uummm9SuXTvVrFlTR44c0UcffaTJkydr9+7dSk9P18svv6waNWr4LQPmIL7aB/GV+BpuXJo2bZo6deqkgwcP6oorrtBTTz2lrl27qri4WB9++KEefPBB5efnq1KlSqZOs1C6Dk5ou/7v//6vqlatqhtvvFGdOnVSVlaWKleurJycHH399deaNWuWVqxYIensfLjjx4+3pIxw6irZ47oEAJjCABJI9+7dDUllHk2aNCmxnOfvc+bMKVPGlVdeaUgyRowYEXA7q1at8paxa9eugMuFKmv79u3GxRdf7LfOpR/vvvtu6B1gE3PmzAnrPfk+Atm3b5/RqlWrgOude+65xrfffut33ccffzyiOpQ+TswqIxKeYyach7/j1zAM48yZM8bAgQMDrpeenm68+uqr5aqnYUS2bwJ9B0aMGBF2GY8//njIOvl+NwPtH39eeeUVIz09PeC2Bw0aZJw5c8bvuq1btw5Z97S0NGPixIlB6+D72fvTpEmTiI5Ff/srVnX1eOaZZ4yUlJSA27r77rvD3k603weUH7HVHoit0Uu22BqMJ5ZceeWVYa8TTWw1831MnDjRu+zHH38cdr0N47/vN9QxNHbs2ID1S0lJMaZMmRLWdsJ5rFq1qsz6u3btCmt/HDt2zLjiiisCll2zZk1j5cqVAdcP9bk0bNgw6PowF/HVHoiv0UvG+Lp48WKjRo0aAdfNyMgwFi1aFFadErntGs52JBndunUzfv75Z8vKCKeuhmH+dYnSwjm2AMAM9OxDQlm0aJGeeuopvffee9q5c6dOnTplyeTMZvmf//kfbdy4UW+88YbeeustrVu3TocPH5ZhGKpdu7Zatmyprl27auDAgbrkkkviXd24OPfcc7V+/Xo9//zzeuONN7Rjxw4VFxeradOmGjBggMaPH2/5pNFOk5aWprfffluvv/66Zs+erU2bNun48eNq0KCBevToofHjx/u9yy+Z3XTTTWrbtq2ee+45rVixQgcOHFD16tXVunVrjRo1SkOHDg247tSpU7Vy5Up9+eWX2rNnj44cOaJTp06pRo0aatGihbp3767Ro0fbovdFrOv6wAMPqGvXrvrrX/+qzz77TIcOHVJmZqY6dOigO++8U7169TJlO7AWsTXxEFsjR2yNH89weM2aNVPXrl0t2caMGTN0/fXX64UXXtBXX32lo0ePqm7duuratavGjRunjh07WrLdSFWvXl0ff/yx/vnPf+rf//63tm7dqvz8fDVu3FjXX3+97rvvvqC9DW644QadPHlSH3/8sX766ScdPXpUNWvW1Pnnn68BAwZo9OjRZXodwjrE18RDfI2c0+Jr79699d1332n69On64IMP9NNPP0k6G6OuvfZa3XvvvTr33HMtrYMT2q6vvPKKli9fro8//lg//PCDDh48qGPHjikjI0ONGjXSZZddpqFDh+qaa64JOC2FGWUAQLJxGXb+NQkAAAAAAAAAAAAgoJR4VwAAAAAAAAAAAABAdEj2AQAAAAAAAAAAAA5Fsg8AAAAAAAAAAABwKJJ9AAAAAAAAAAAAgEOR7AMAAAAAAAAAAAAcKmmSfbt375bL5Qrr8fXXX4dd7uHDh1W7dm3vuiNHjjStzocOHdKf//xndejQQXXq1FF6erqysrL061//WhMmTNCePXuCrr9161bddtttatasmdLT01WvXj1dc801euONN0yrIwAAAAAAAAAAgGEY2rp1q+bNm6e77rpLl112mSpVquTNn+zevdu0be3bt0/33nuvzj//fFWpUkXnnHOOunTpolmzZqm4uNi07ThFWrwr4HT33HOPsrOzTS/3jTfe0B133KGcnJwSf9+7d6/27t2r1atXq2nTpgGTi6+++qpGjRqlgoIC798OHTqk5cuXa/ny5Zo/f75ef/11paVxCAAAAAAAAAAAgPLZs2ePLrzwQsu389FHH2nQoEHKzc31/i0/P1+ff/65Pv/8c7388stavHixqlWrZnld7CJpevb5Wrx4sU6cOBHw0a5du7DKWbp0qV599VU1b97c1Pq98soruummm5STk6OLL75YL7/8snbt2qWjR4/qhx9+0Ny5c9WjRw+lpqb6Xf/LL7/UyJEjVVBQoJYtW+qDDz7QoUOH9O2332rEiBGSpLffflvjx483td4AAAAAAAAAAACNGjXSgAED1LVrV1PL3blzpwYOHKjc3Fw1aNBAb7zxhg4cOKDt27fr/vvvlyR99tlnGjZsmKnbtTuXYRhGvCsRC7t371azZs0kSatWrVL37t3LVd7Jkyd10UUXac+ePVq6dKmuvfZaSdKIESM0d+7cctXzV7/6lU6ePKm+ffvqrbfeUoUKFSIq4/LLL9eaNWtUp04dfffdd6pbt26J10eMGKGXXnpJqamp+u6779SyZcuo6wsAAAAAAAAAAHDixAl99NFH6tixo+rXry9JmjBhgiZOnChJ2rVrl5o2bVqubfzv//6vXn/9daWnp2vDhg1q1apVidcff/xxTZo0SZL04YcfqmfPnuXanlMkZc8+Mzz66KPas2ePhgwZol69eplW7h//+EedPHlStWvX1ty5cyNO9G3YsEFr1qyRJD3wwANlEn2SNHnyZKWmpqq4uFgzZ840pd4AAAAAAAAAACB5VatWTf369fMm+sx25MgRzZ8/X5J0yy23lEn0SdLDDz+sWrVqSZL+/ve/W1IPOyLZF4V169ZpxowZqlGjhqZNm2ZaudnZ2Xr77bclSSNHjvQekJFYtGiR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fgAAAAAAIHokUxAvHHsAACDZxSzZ98knn8jlcunuu+8Oa/lGjRpJkg4cOGBltQAEEE5jyXd4HhpXAACEFml8BQAn4fwFJ/A31CcAANEoNlwqNlIc+AjcCQvOFbNk38GDByVJ5513XljLV6hQQZJUWFhoWZ0ARI+GPAAA5isdX7mZBgCA8ik9j2SwoT4BAACcKmbJvipVqkiSTp06Fdbynh59tWrVsqxOAAAAQKyEStx5LkSS4APgVP7OX5zTYLVojjGOSwAAkGhiluxr3ry5JOnrr78Oa/mVK1dKkn71q19ZVicA/oXb8KGBBAAAACSfSNoBjAgCAAASlVsuxz5iYdmyZerXr58aNmyo9PR0ZWVl6be//a3Wrl1b7rLdbrf+/e9/67rrrlPDhg1VsWJFVa1aVRdccIFuvvlmrVmzxoR34CwxS/b16tVLhmHoueeeC7ns8ePHNXXqVLlcLl133XUxqB2ASPVMGUzDHQAAE/VMGcyNNAAAxABtWQAArDVu3Dhde+21WrRokQ4cOKDTp09r7969evXVV3XFFVfo2WefjbrsnJwcde3aVcOHD9eSJUt04MABnTlzRqdOndL27ds1d+5cXX755XrggQdMfEf2F7Nk3913362qVavq008/1YgRI5SXl+d3uW3btumaa67Rnj17lJmZqdGjR8eqigAAAEDc+V6A5GIkAACBhXOTDDfSAAAQW88995xmzJghSbr++uv11Vdf6fDhw1q9erU6deqk4uJiPfDAA3rnnXeiKn/EiBH64osvJEn9+vXTJ598ogMHDug///mP5s6dqyZNmkiSnn32Wf3rX/8y5005QFqsNlSvXj29+OKLGjp0qF5++WW988476ty5s/f1wYMH68cff9S3334rt9ut1NRUvfTSS6pWrVqsqghAkTeElrvn08sPAIAQoomvAADAPMRWAACsd+TIEU2YMEGS9Otf/1qLFi1SSsrZPmdXXnmlPvroI7Vt21Y//PCD7rvvPv3mN79RxYoVwy5/x44deu+99ySdTSQuXLiwxOstWrRQly5d1Lp1a508eVJ///vfdeutt5ry3uwuZj37pLMJvffee0916tTRyZMntWLFCu9r77zzjr755hu53W7Vq1dP77//vnr37h3L6gGIEo0mAAAAIHnw+x9OQ+8+AIAVipWiYsOBDwvTQi+99JJOnDghSXr66ae9iT6PypUra9KkSZKk3bt3a/HixRGV/80333ifDxs2zO8y5513ni6//HJJZ0eSTBYx69nncd1112nPnj16/fXXtWLFCm3btk3Hjh1TRkaGmjdvrl69emnYsGGqXLlyrKsGAAAAAACiRBIQsRRtAo+RaQAAsM6iRYskSc2aNdNll13md5l+/fqpUqVKOn36tN599131798/7PLT09O9z10uV8DlUlNTJUl169YNu2yni3myT5IqVaqkESNGaMSIEfHYPAAL0GACAMA/LkYCAAAAAJLBhg0bJKnEFG6lVapUSe3atdOaNWu8y4erdevWSk1NVXFxsebPn68hQ4aUWWbfvn3eOf2uu+66iMp3spgO4wnA3iK9GMlQKAAAWItYC8BJOGfBKThWAQA4Kzc3Vzk5OQEfkfj555+9Q3g2b9486LLNmjWTJG3fvl2GYYS9jcaNG2vUqFGSpLffflsjRozQN998o5MnT+rQoUNauHChevbsqePHj6tly5b685//HNF7cDKSfQBKCKcHQellPA0lGkwAnGC5ez69pWBrxFMATkRsRaxF2nYlvgIAzOY2XI59eDRv3lyZmZkBH5E4cuSI93m9evWCLut5vaCgQHl5eRFt529/+5vuuOMOpaam6qWXXlLbtm2VkZGhevXqacCAAcrJydFDDz2ktWvXqnbt2hGV7WSWDOP5ySefmFpet27dTC0PgH/hNtB9G0k0mAAACG65e365es8znCcAp+BchVgJNzaWjr/EVwAArHPy5Envc9+59fypXLmy93leXp6qVasW9nYqVKigZ599Vk2aNNGjjz6qoqKiEq8fP35c+/bt06FDh1S9evWwy3U6S5J93bt3Dzo5YiRcLleZDwuA+cqTtPO9iEmDCYDdcZ5CLJkVXwHA7oiviLVoYiSxFQCAknbu3KmaNWuaXm6o/FB58kfr169X//79tW/fPv3ud7/TnXfeqfPPP1/5+fn67LPPNGHCBL388stasmSJ3n//fXXq1CnqbTmJJck+SRGNsxqLcgBYh8YSAADmKn0xkovoAOyOcxSciPgKAEh2NWvWVK1atUwpq2rVqt7n+fn5QZf1fT0jIyPsbezatUvdu3dXXl6eHn74YT355JMlXh8yZIiuvfZaXXbZZfrPf/6jIUOGaMeOHapQoULY23AqS+bs27Vrl9/HqlWr1KxZM7lcLg0cOFCv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SXv37tVTTz1levmVK1dWRkZGwEdKSujdcvLkSd1+++2SpBdeeMH0Ono89thj2rVrl4YOHaquXbtGtG7FihWDvs8KFSpYVGsgejSaAESi9PmC8wfgH/EVAADzEV8BILm5jRTHPpB4bPupXnXVVZKkBQsWxLkm/j366KPas2ePhgwZol69elmyjQ0bNmj69OmqUaOGpk2bZsk2ALvyNJpoOAEAYB5iKwDASZwSs4ivAAAg3tLiXYFA0tPTJUn79u2Lc03KWrdunWbMmGFpEq64uFi33nqriouLNXnyZNWvX9+S7QBOULrRFI/J2AHYDxdUYCdOOx791Zf4CiDQuaxnymDOEUAYiK8AACBebJvs+/zzzyVJVatWtWwbhYWFqlixYkTrFBUVafTo0XK73XryySfVoEEDS+r23HPPaePGjerUqZN3zr5onTlzRmlpaXK5XCbVDk7mtIuR/vi+BxpOQHIKdi7jgiQQHeIrgGCIr0B0iK8AACAWbDmM5+bNm3X33XfL5XKpY8eOppc/ZswYVatWTZUqVVKlSpV00UUXady4cdqxY0fIdadMmaJNmzapY8eO3jn7zLZz5049/vjjSktL06xZs8KaQ9CfefPmqX79+qpYsaIqVKigrKws3XTTTfr4449NrjFgrkgaQAz3CSSfcL7vnBOAsoivAILh+w5Yj/gKAInFLalYLsc93PHecbBEzHr23XLLLSGXyc/P1w8//KBNmzbJMAylpqbqoYceMr0u33//vfd5YWGhtmzZoi1btmjmzJmaOnWqxowZ43e9HTt2aNKkSeVOwoXy+9//Xvn5+br//vt1ySWXRF3O7t27vc+Li4u1d+9evfbaa3rttdc0YsQI/eMf/4i4Z6NHTk5OwNdyc3OjKhPwVfqCZHku7nP3JACnIL7CasRXAP4kcuKB2OpcTjkuo4mtwZYjvgIAgGjELNk3d+7csIaRNAxDklStWjX9v//3/9SlSxdTtp+SkqKePXtq6NChat++vRo1aqSqVatq9+7dWrBggSZPnqzjx49r7Nixqlq1qm6++eYyZdx2220qKCjQfffdp9atW5tSr9LmzZunFStWKCsrSxMmTIiqjF/96le666671K1bN2VlZal27do6ePCgVq5cqb/85S/6z3/+o3nz5skwDM2bNy+qbWRmZka1HhAOf0MELXfPj6qx5ymHoVOAxBDu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12vgwIH69NNPvRI3wg8XqgAQujjHBw77HiiMymkA3hBO+dX+nMk5FAAA7ztw4IAeffRRffLJJ8rLy3NrG4vFQmOfL8TGxio+Pr5UZZw8eVL33XefJGnGjBnq3LmzN0LTli1bHP49KSlJLVu21HXXXacBAwYoJydHM2fO1NixY4us++STT+ro0aMqW7asVq1apYYNG0qSatSoocmTJysuLk4TJkzQkiVLtGLFCnXs2NErsQeCO0N3hNMdfACA0iFvuIf9FN6oOIQ/cayFBvJGeDU2IXg4mtMPAACU3KFDh3Tttdfqjz/+KLYnnz1P1i2psJmzz9ueeuop7d27V/3791enTp389rr9+vVTxYoVJcnh3IKZmZlKTT1/ETV06FBbQ5+9xx9/XJUqVZIkvf766z6MNvC4oGQeIACAZ9zJG+TX8M6tVBbCX5hzCuEk3HOrRH4FAJiQYTHvghJ57rnntHfvXknS8OHDtXHjRp08eVIFBQXFLr5GY18JfP/995o+fboqVqyoV155xa+vbbFYFBl5vkNmTExMkec///xz25x//fv3d1hG2bJl1b17d0nS8uXLdebMGR9F61vFXQhwsQQAgPeRXwH4Cw3LoYfGHDjDsWFu3JwBAAgXn3/+uSwWi55++mn9+9//VrNmzRQbGxvosCSF6TCeVnl5eYqOjvZom/z8fN1zzz0qKCjQCy+8oKSkJB9F59jKlSuVlZUlSbr66quLPP/jjz9KksqUKePweatWrVppzpw5On36tHbs2KErrrjCNwHDr6zD43ChBAAlF87n0HB+766wX8yPoUeBwAvnc2k4v/fisG9CQ0SNXwMdAgAAfrF//35J0p133hngSIoKy8a+lJQU7d27VydOnFB0dLTq1aunDh06aPjw4apXr57LbSdPnqzNmzfrmmuusc3Z52unTp3Svn379PHHH2vy5MmSpFq1aumBBx4osu7OnTslnZ/jr2zZsk7LrFOnTqFtPG3sy8nJcfrckSNHPCqrJNy5IAineSHs9wcXSwBgXoHOryiMnBo6aOgDwhe5NbiQW82PG2gAAOGsUqVKOnTokCpUqBDoUIoIy8a+bdu22R7n5eVp+/bt2r59u9544w1NmTJFKSkpDrf77bffNGHCBEVGRmrmzJmKiPDdKKjffvutWrVqVeTvFotFN998s95++23Fx8cXeT4zM1OSVL16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BQVq0KCB/v3vf3sxOu96+umn1aJFC6fPV69eXY888oik83MseWtkBU/l5eXZ5vLr3Lmz2rVrV2Sd2NhYjR07VpK0Y8cOt+ZTAsyO/Foy4Zhfi3PPPffYHjubl7w08vPz9eabb0qSunTpovbt2xdZ584777Rd0wby2vWOO+5Q3759nf4WKVOmjF544QXb/wM5Uou36gSC4fcXAO+bPXu2bbGaM2dOob97svgajX0wvTVr1shisWj8+PGSzg9Pc+FkvbVr1y60jatJcq0TAFt/oK9evVrdunVTjRo1FBcXp8aNG+ull14qNPHy0aNH9fzzz6tJkyaKj49XpUqVdPPNNxc7ybMknTlzRq+99ppuvPFGVatWTdHR0apWrZq6dOmijz76SIZhlHjfBLOoqChddtllks5PZHyhPXv2aMuWLZKk/v37Oy3H+lxWVpbWr1/vcRxVq1ZVtWrVnMbhrzK8ZcmSJZKkNm3aKCkpyeE69vvz008/9UtcjpQtW9b22NkPYut3VZJtH3vT559/brvQdnaclS1b1jbkzfLly4ud8DyYLV26VPv27ZMkPfzwwwGOpvT++c9/2h4H+rsXasit5kRu9Y1gyq3hct7bunWrvvnmG0lSSkqKy4prMwiGz+1///ufbfhBRw19VvbPLVq0yMdRhR/yqzmRX30j1PJrdHS07XFMTEypY7rQ+vXrlZ2dLcm942zz5s3au3ev1+PwlmDIjVL41QkACG009gEuvPjii7rxxhv12WefKSMjQ6dPn9b27ds1ZswY9erVS/n5+dq7d69atmypp556Slu3btXJkyd15MgRLV26VNdff71WrVrltPxt27apUaNGGj58uL766isdPnxYZ8+e1eHDh7Vs2TL1799f3bt3dzovgNkdOnRIklShQoUiz/3444+2x61atXJahv1zGzdu9DiGs2fPKicnx2kc/irDG7Kysmw/5l3ts1q1atkupkqyz7zFfq426510F/r8889tx//NN9/s9Risx1mZMmV09dVXO13Puj9Pnz6tHTt2FFvu2bNnPa7sGDJkiK0yZ8+ePR5t6y7rHZNlypTRjTfeWOi54uZ0sFe7dm2HlVGu5OXlub2uu6znECmw3z14htzqW+RW7wq23Bou5z37O/xvuummQs+dPXvW7XKsDSGe3GUfqHzl61jt5wiz9k5wxP6577//3u3yEXjk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t+J47733bEM+tWzZUh988IHHP9zcLePcuXNOL4aLe1+e8sY+c3Xx7m2pqakaMmSIcnNz9emnn+qZZ55Ro0aNVKlSJdWrV08jR47U6tWrFRMTo59++sknF6TWfebu/pLcP87s1581a5bt//PmzfNoe2+yj33EiBFKTEwsss6ll16qIUOGSDr/A2b37t1ej6NBgwYaP368JCk7O9vtoQyOHTumzp076/fff1dERITmzZuna6+91uvxwXfIrd5Hbg393Hrvvfdq8eLFks73Khk1apQH78Cc7Pfh4MGDCzVWWCUmJurhhx+WdH4Y6m+++cbrcVSvXt02rPXZs2fdHlb87Nmz6tOnj62H1Msvv6y+fft6PT577sTarFkzzZ8/X7GxsTp+/Lgeeugh1apVS1WqVNFNN92k7777Trfddptuvvlm2zbOenEhuJBfvY/8Sn51JjIy0jbsbtWqVXXddddp5syZth6tU6dOtX0XvMkf165RUVF66623bOcDb1+7Pvfcc7bekz179izVfvJWrP7YrwBCS3p6uiSpZs2abq1vvUHxzz//9FlMVjT2AU64O/+TO+tdOByPdWgiT1jn1PJEME1yvmHDBnXv3l25ublKTk7WypUrXY6Jbj+fiaseXXl5ebbx2a09hVxZtGiR7rzzThmGoWbNmmnp0qWFLjTc4UkZ69atc3ox3KVLF49etzju7jNJtnnlLtxnri7evc3a2NOuXTundxlfccUVtqGHUlNTS/TdccW6z9zdX5J7x9mFGjdurHr16kmSNm7c6PH23mJ/jFjvLHLE/u6kbdu2+SQW612Yknv75NSpU7rlllu0ceNGWSwWvf322z6vOIX3kVvJrd4oI5xy66hRo/T2229LOt/rxVvzqQa7YMpXnTp1sg3t5U6+OnfunO644w7bUNhjx461zffla+7E2qtXL23btk0pKSm67LLLFBsbqwoVKqh169aaN2+e5s+fb/v+V61a1WnjBoIL+ZX86o0yyK+lM2DAAFvOeuWVV0pd3oWs+ywnJ0dnz551ul5pr12rVKlim+vTm9eur776qp5++mlJ0k033aQPP/yw1POueyNWf9UJAAgd1t9K7v7esa6Xl5fns5isaOwDAsB6F1BiYqLbQ5I4mxvLlWCZ5HzTpk3q0qWLTp48qRo1amjVqlVKTk52uU39+vVtj3///Xen6+3du9c2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dBvrXBD27rrrLs2cOVObNm3SPffco4MHD2rAgAGKjIzUF198odGjR8swDCUnJ+tf//pXke137typTp066ejRo6pQoYIWLVqkiy66yGkcERERRYaT8EYZnti+fXuhOWfsK3Y2bdpU6I7HSy+9tMhQLI0aNdKDDz6oV1991VZZM2rUKFWrVk0//PCDHnnkER06dEhRUVG2SqmSSk9PLxTf9u3bbY9///33QkOLVK1aVZdeemmh7Z9++ml99dVXOnfunLp166YnnnhCffr0UY0aNZSVlaUvvvhC48aNU25uriwWi224FW97/vnntXTpUh09elQ33HCDpk2bpuuvv17Hjx/XW2+9ZbvA7Nq1q+3OZnvDhw9XRkaG+vXrp1atWqlWrVoqW7asDh06pFWrVumll16yzakwdOhQ2wTiFxoyZIitkW337t0OL8pLu8+l85PFt2zZUhkZGbruuus0adIktWnTRufOndPy5cs1ZswYnT59WjExMU6HH6tdu7b27t2rWrVqOZwvolmzZrr++uvVvXt3NW/eXElJSYqIiNCePXu0ePFiTZ06VSdPnrTFU6FChSJlPPTQQ7b9cccdd+jZZ591eQ4pW7asIiP5WeNt5NbgQW4N/dyampqqe+65R4Zh6J///Kc++ugjFRQUON0vUVFRiomJKfJ3b+SK0jp8+HChOZjsK/7T09MLxVChQgU1atSoSBnPPvusPv/8c2VkZKh9+/aaNGmSbrrpJkVGRmr9+vUaM2aMMjIyZLFY9Morrzg8H7Vr185WGepoWLdu3bqpSpUq6t27t1q0aKGaNWsqKipKf/75p5YuXaqXXnrJNufS008/rTp16hQpY8qUKZowYYIk6YYbbtCbb75ZaLjyC0VHRzucp8gfsUrSP/7xDw0ePFidO3dW7dq1bXMiz549W3PnzpVhGLr55pv18MMPO30PKD3ya/Agv5JfL+Qov44ZM0a7d+/W7bffruuuu05169ZVuXLldOzYMf3888+aO3eu7SbFatWq+ezadcyYMXr//fe1b98+devWTVOmTNHNN9+s/Px8ffjhh3rqqackne/lNnTo0CLbT548WatWrdJtt92mNm3a6NJLL1W5cuWUnZ2tdevW6eWXX9aWLVskne/9ePvttzuMY9y4cRo/fryk80PGXtirdv369bZhZC+++GItXrxYcXFxTvd5mTJlivSW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7XFWVpbT9eyfu3BOgauuukpffPGF9u/fr3379umSSy5xWMaGDRsknR9TNjExsRRRAwAAAAAAAAAAhI7k5GSnjX1Hjx4t1GGsYsWKio+P14kTJ3T06FFJksViUUJCgt/mzGSwXjsLFy60PW7evLnt8dtvv61Nmza5XKy6du1q+5unQ35ee+21ql69uiRp7dq1Ttdbs2aN7fEVV1xR6LmuXbvaHn/00UcOtz9w4IDWrVsnST4dlhQAAAAAAAAAgJBkmHhBsfbs2aPdu3cXWV5//XVZLBZVr15d06dP159//qmcnBzt27dPOTk5+vPPP/Xvf//bNpLk66+/XmikRV8Jm5596enpqlmzptPnt2zZonHjxkmSEhMT1aVLF9tz9erVc/t1EhMT1axZsxLFGBERoZSUFD399NNasWKFVq9erfbt2xda59SpU3r22WclnW8tto9Tkq688kq1bNlS3377rV566SUNHjy40FyAkvTEE08oPz9fZcqU0X333VeiWAEAAAAAAAAAAMLFtm3b1K9fP9WoUUPr1q1TUlJSkXWSkpI0fPhw9enTR23atFG/fv303XffqXHjxj6NLWx69jVr1ky9evXS3LlztWXLFmVmZio7O1sbN27UM888o1atWtm6Xb7yyis+6Vq5Zs0aWSwWWSwWW8PihR555BE1aNBAhmGoe/fumj59uv744w9lZWVp+fLlatu2rbZt2yZJeu6554oM42mNPyoqSocOHdL111+vpUuX6vDhw9q2bZvuvPNOzZkzR5L0wAMPFJonEAAAAAAAAAAAAEVNnjxZp0+f1qRJkxw29NlLSkrSxIkTderUKb300ks+jy1sevbl5+dr0aJFWrRokdN14uLiNG3aNA0aNMiPkRWNYenSpercubN++eUXjRgxQiNGjCiy3tNPP62UlBSHZbRs2VJz5szRXXfdpR07dujmm28usk7v3r01depUr8cPAAAAAAAAAAAQar766itJUtu2bd1a37re6tWrfRaTVdg09s2ePVvr16/Xd999p/T0dGVlZSk3N1cJCQlq2LChOnTooLvvvrvY1lh/qF27tjZt2qTXX39dqamp+vXXX3Xq1CklJSXp+uuv10MPPaSrrrrKZRm33367rrjiCk2dOlUrV67UgQMHVKFCBTVtm8mBdQAAq7NJREFU2lR33XWXBgwY4Kd3AwAAAAAAAABA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O200P3HYYYdlNeQm+Y/USPbFWb9+fey9n7viVlRUpPysa9eukqR9+/ZpwYIFKaebP3++pP0PquzUqZOzBQQAAAAAAAAAAKHy05/+VJL0/vvvp5xm7969sZEVo9PbRf4jNZ7ZF+fll1+OvT/22GNj75988knt3Lkz7XePOeYYSVLfvn119913S5LatGnjQimlefPmSdo/PnC7du2qfNanTx8VFRWpsrJSL774ok4++eRq39+zZ4+mTZsmSerVq5fq1q3rSjkBAAAAAAAAAEA49O3bV2+//bZWrFihjz/+OGkyb9q0abFeedk+No38R2qh6dm3du3atJ8vXrxYI0eOlCQ1adJE55xzTuyzDh06qEuXLmlfUU2aNIn9rUmTJlmV8csvv9S+ffvSTjN9+vRYUrJnz57Vxptt1qyZLrzwQknSU089pS+++KLaPO6//36VlpZKkn79619nVUYAAAAAAAAAAIBEQ4cOVYMGDSRJt912myorK6t8vnv3bt15552SpLZt26pPnz5ZzZ/8R2qhSfZ16dJF559/viZOnKjFixdr8+bNKisr08KFC3XnnXeqe/fusef0Pfroo2rYsKHjZZg7d27seX7RxGK8v/3tb+rYsaNGjBiht956S2vXrtW2bdu0bt06zZ49W1dddZX69esny7JUr149jRo1Kuly7rnnHjVq1Ei7d+/W6aefrsmTJ2vDhg366quvdNttt+muu+6StD/LftZZZzm+ngAAAAAAAAAAIFyaNm0ay33Mnj1b5513nj766CNt3rxZ8+bN0xlnnKGlS5dKkh555BEVFxdX+X6mHIpE/iOV0AzjWVFRoSlTpmjKlCkpp6lXr55Gjx6tSy+91MOSVfX111/HhgFNpW3btnr66afVuXPnpJ+3b99eL7/8sgYOHKh169bFMt3xevTooWeeecaRMofJAQccIMuyCl0MZIn9Zi72nZnYb8gWx4yZ2G9mYr+Zi32HbHHMmIn9Zib2m5nYb4A7fvvb32rVqlV67LHH9Nprr+m1116r8nlRUZEeeOABDRw4MKf5k/9ILjTJvvHjx+vdd9/VBx98oLVr16q0tFR79uxR48aN1alTJ5155pm64oor1KpVq4KV8bbbblOXLl00d+5cffrpp9qwYYNKS0tVXFys5s2bq0uXLurXr58GDx6ccZzZ008/XYsXL9bDDz+s6dOna82a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5cieE/vtkEMO0eWXXy5J+uc//6mhQ4fq008/1a5du7Rx40ZNnTpVvXr10vbt23X44YfrT3/6k6PrEBaWZWn9+vV688031atXL73zzjuSpD/96U853Rm5bNkySVKrVq2q3OGaqF27dtW+A/MQX81EbDUX8dUcxFfkg/hqJuKrmYitZiG+AgiqmoUuAGCKe++9N3an1rXXXpvXvK6++mrt3r1bN998s37yk584UTyk4cS+++9//xt7/8Ybb+iaa65RRUVF7G87d+7UrFmzNGvWLA0ePFhPP/20atakis2HU+fcX//6V9WoUUNPPPGEJk2apEmTJlX5vEWLFrr99tt1xx135H3Hc9icffbZmjFjRrW/t2zZUnfffbeuvPLKnOYbHfamRYsWaaeL/zzfoalQOMRXMxFbzUV89T/iK5xAfDUT8dVMxFYzEF8BBB23YwE2vPXWW7rnnnskSV27dtUVV1yR87wmTpyoWbNmqU2bNho5cqRDJUQqTu27bdu2xd5fe+21atCggZ588klt2rRJu3fv1nvvvacePXpIkl544QX94Q9/yL/wIebkOVerVi09/PDDuueee5JexG7fvl1r166tMuwKclenTh396le/Up8+fXKex65du2LzSqdu3bqx9zt37sx5eSgc4quZiK3mIr6ai/iKbBBfzUR8NROx1WzEVwBBQrIPyGD58uW68MILtW/fPjVu3FjPPfdczne9bdq0STfddJOk/Xds5TOUCjJzct9VVlbG3ldUVOj111/X5ZdfrqZNm6pOnTo68cQTNWvWLHXp0kWSNHr0aK1fv96J1QgdJ/ebtH/8/I4dO+r222/XRRddpPnz56u0tFRr167V888/r7Zt2+rpp59Wt27d9P777zu4JsE3depU7dixQ9u3b9eqVav0/PPP66ijjtKIESN09NFH66233spr/ukeTG/nc/gb8dVMxFZzEV/NQXxFPoivZiK+monYahbiK4CgI9kHpLF27VqdddZZKi0tVb169fTqq6+qQ4cOOc/v+uuvV2lpqQYMGKC+ffs6WFIkcnrflZSUxN6fffbZsQcrx6tdu3bsrsg9e/boX//6V87LCyun99vKlSvVs2dPrV27VnfccYcmTZqkbt26qUmTJjrooIM0ePBgvf/++/rxj3+s0tJSDR48mIfWZ6FOnToqKSlRgwYN1LZtWw0ePFjz589Xnz59VFZWpn79+lUZRsiuaEPS7t27004X/3n8OQr/I76aidhqLuKrWYivyBXx1UzEVzMRW81DfAUQdCT7gBQ2bdqkXr16afXq1SouLtbLL78cG+oiF/PmzdNzzz2nkpISjRkzxsGSIpHT+06SmjZtGnt/8sknp5zulFNOib3//PPP81pm2Lix3x555BHt3LlT9erVSzk8TaNGjfS73/1O0v7nW7z55pt5LTPsatasGavjdu3apb///e9ZzyN6vmUanmbDhg2x9wceeGDWy0FhEF/NRGw1F/E1GIivyIT4aibiq5mIrcFBfAUQJCT7gCS2bNmiXr16admyZapZs6ZeeOEF9e7dO695rlixQtL+cbkPOeQQRSKRaq+JEyfGpo/+rWfPnnktN2zc2HeS1KlTp9j7Aw44IOV08Z9t37497+WGhVv77d1335UkHXnkkapXr17K6Y477rjYey5089e+fXs1a9ZMkvTJJ59k/f2OHTtKktatW6fy8vKU061cuTL2/vDDD896OfAe8dVMxFZzEV+DhfiKVIivZiK+monYGjzEVwBBQbIPSLB9+3adffbZWrRokYqKijRhwgT179+/0MWCDW7uu/gf1KWlpSmni/+scePGjiw76Nzcb9FhMrIZO59x9J2xb9++nL/btWvX2DwWLFiQcrr58+dL2v+g8/hGDfgT8dVMxFZzEV+DifiKRMRXMxFfzURsDS7iK4AgyP2psUAAfffdd+rTp48+/PBDRSIRjR07VhdffLEj8+7Xr1/GO4TuvPNOvfrqq5J+uJuIcbztcXPfSdKJJ56oFi1aaMOGDXr77bdjQ2ckmjt3buz9Mccc49jyg8rt/da6dWstX75cn3/+uXbv3q26desmnS7+B3nbtm0dW35YffbZZyorK5Mk/ehHP8r6+3369FFRUZEqKyv14osvJh1+aM+ePZo2bZokqVevXin3LfyB+GomYqu5iK/BRHxFIuKrmYivZiK2BhfxFUBgWECAjRgxwpJkSbJWrlyZdtry8nKrV69eselHjx7tTSHjDB06NLb8sPPjvvvTn/5kSbIikYj11ltvVft8165d1pFHHmlJsho1amRt2bLFlXL4md/22z333BOb/x/+8Iek02zbts067LDDLElWcXGxtXHjRsfL4Xd299uePXusr7/+Ou28du/ebZ166qmx+c2bNy+nMg0ZMsSS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rVuX9O+HHnpo7P3SpUvTfj/VHZDt27eXJG3ZskVlZWVpywEA8B/ia3XEVwBAvoiv1RFfAQBIjWQfgNCIRCLq0aOHJOm1117Tnj17kk5nWZZeeuklSdLRRx+d9HkH+TjppJMkSfPmzUv58PR9+/bp9ddfz3kZtWrVis0nnVatWkna/wyB6PMgEn3xxRdauXJl0s9OPPFEFRXtDyUvv/xyyuX885//TPnZWWedJWn/dn/xxRfTlhcA4D/E1+qIrwCAfBFfqyO+AgCQGsk+AKFyxRVXSNp/cfCHP/wh6TRjxoyJ3Tl51VVXOV6GYcOGSdo/bv/tt9+edJpRo0bpv//9b87LaNq0qaTUdzRGnXDCCZL2X6hMmjSp2ucVFRW64YYbUn6/efPm6tOnjyRp7NixSe84/fbbb3XPPfeknEfHjh31s5/9TJL0+9//PuNdq9u3b9e3336bdhoAgLeIr1URXwEATiC+VkV8BQAgNZJ9AEKlX79+OueccyRJDz/8sC677DJ9/PHHKisr02effaYbb7xRv/3tbyVJxx57rCsXS8cff7yGDBkiSRo3bpwuueQSffzxx9qyZYuWLFmim266Sbfffrt+9KMf5byMrl27SpLeffddTZ06Vdu3b1dFRYUqKipUWVkZm65jx4468cQTJUm33Xab/vrXv+qbb77R5s2bNXPmTJ1xxhmaM2eODjrooJTLevDBB1W7dm3t3r1bp512mp588kl988032rBhgyZPnqwePXpoz549ae8wffzxx9WiRQuVlZXphBNO0O9+9zt9+OGH2rx5s0pLS7Vs2TK98MILGjZsmA4++GC99957OW8bAIDziK/EVwCA84ivxFcAAGyzACCARowYYUmy2rZtW+2zbdu2WaeffrolKeXrmGOOsdatW5d03m3btrUkWSNGjEi5/JUrV8bmNWfOnGqfb9++3TrppJNSLr9Xr17WuHHjLElWjRo1sp7/xo0brWbNmiWd99ChQ6tM+9lnn1lNmjRJOm3t2rWtF154wTr11FOTfjdqypQpVu3atZPOo06dOtarr76acbstX77cOvroo9Pul+jrlVdeSbntAQDuIb4SXwEAziO+El8BAMgXPfsAhE7Dhg01a9YsPfPMMzrnnHPUvHlz1apVSwceeKBOO+00jR07Vh9++GHseQBuaNCggebOnavRo0fr2GOPVb169dSwYUN17dpVY8aM0b/+9a/YMxkaNmyY9fybNWum+fPn67LLLlO7du1Uu3btlNMeeeSR+uijj3TZZZfpoIMOUq1atdS6dWv9/Oc/14cffqgLL7ww4/L69++vTz/9VL/4xS/UqlUrFRcX66CDDtLFF1+sDz74IDbMSTo//vGP9cknn+iZZ57RgAEDdPDBB6t27doqLi5W69atdfrpp2vEiBFatGiR+vXrl9X2AAC4j/haFfEVAOAE4mtVxFcAAJKLWJZlFboQAIDqrr/+eo0ZM0ZHH320/vOf/xS6OAAABALxFQAA5xFfAQAoLHr2AYAPVVZW6tVXX5Uk/fSnPy1waQAACAbiKwAAziO+AgBQeCT7AKAAdu3aFRvmJJn7779fK1eulCQNHjzYq2IBAGA04isAAM4jvgIA4H81C10AAAijpUuXauDAgbr66qt11lln6dBDD1VlZaWWLVumv//973r66aclSSeffLJ69+5d4NICAGAG4isAAM4jvgIA4H88sw8ACuCjjz7Scccdl3aazp0761//+perD1oHACBIiK8AADiP+AoAgP+R7AOAAti5c6eeeeYZvfHGG/rss8+0adMmfffdd2rcuLE6d+6sCy64QJdddpmKi4sLXVQAAIxBfAUAwHnEVwAA/I9kHwAAAAAAAAAAAGCookIXAAAAAAAAAAAAAEBuSPYBAAAAAAAAAAAAhiLZBwAAAAAAAAAAABiKZB8AAAAAAAAAAABgKJJ9AAAAAAAAAAAAgKFI9gEAAAAAAAAAAACGItkHAAAAAAAAAAAAGIpkHwAAAAAAAAAAAGAokn0AAAAAAAAAAACAoUj2AQAAAAAAAAAAAIYi2QcAAAAAAAAAAAAYimQfAAAAAAAAAAAAYCiSfQAAAAAAAAAAAIChSPYBAAAAAAAAAAAAhiLZBwAAAAAAAAAAABiKZB8AAAAAAAAAAABgKJJ9AAAAAAAAAAAAgKH+PxmWnabFH7F4AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "image/png": { + "height": 566, + "width": 893 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "flood_output.plot(col=\"time\", col_wrap=3)" + ] + }, + { + "cell_type": "markdown", + "id": "b3041271", + "metadata": {}, + "source": [ + "In the following graphic we superimpose the data on a map and we can move the slider to see which areas become flooded over time.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "3093fa4e", + "metadata": {}, + "outputs": [ + { + "data": {}, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": {}, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.holoviews_exec.v0+json": "", + "text/html": [ + "
\n", + "
\n", + "
\n", + "" + ], + "text/plain": [ + "Column\n", + " [0] HoloViews(DynamicMap, sizing_mode='fixed', widget_location='bottom')\n", + " [1] WidgetBox(align=('center', 'end'))\n", + " [0] DiscreteSlider(name='time', options={'2022-10-11 05:25:01': np...}, value=np.datetime64('2022-10-11T...)" + ] + }, + "execution_count": 34, + "metadata": { + "application/vnd.holoviews_exec.v0+json": { + "id": "p1011" + } + }, + "output_type": "execute_result" + } + ], + "source": [ + "flood_output.hvplot.quadmesh(x='longitude', y='latitude', geo=True, widget_location='bottom', rasterize=True, \\\n", + " project=True, clim=(0,1), cmap=[\"rgba(0, 0, 1, 0.1)\",\"darkred\"], tiles=True, \\\n", + " clabel=\" non-flood flood\")" + ] + } + ], + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/search.json b/search.json index 442585b..1614422 100644 --- a/search.json +++ b/search.json @@ -8,135 +8,5 @@ "crumbs": [ "Preface" ] - }, - { - "objectID": "notebooks/01_local_dask.html#cube-definitions", - "href": "notebooks/01_local_dask.html#cube-definitions", - "title": "1  Dask Client", - "section": "1.1 Cube Definitions", - "text": "1.1 Cube Definitions\nThe following generic specifications are used for presenting the data.\n\ncrs = \"EPSG:4326\" # Coordinate Reference System - World Geodetic System 1984 (WGS84) in this case \nres = 0.00018 # 20 meter in degree", - "crumbs": [ - "1  Dask Client" - ] - }, - { - "objectID": "notebooks/01_local_dask.html#northern-germany-flood", - "href": "notebooks/01_local_dask.html#northern-germany-flood", - "title": "1  Dask Client", - "section": "1.2 Northern Germany Flood", - "text": "1.2 Northern Germany Flood\nStorm Babet hit the Denmark and Northern coast at the 20th of October 2023 Wikipedia. Here an area around Zingst at the Baltic coast of Northern Germany is selected as the study area.\n\ntime_range = \"2022-10-11/2022-10-25\"\nminlon, maxlon = 12.3, 13.1\nminlat, maxlat = 54.3, 54.6\nbounding_box = [minlon, minlat, maxlon, maxlat]", - "crumbs": [ - "1  Dask Client" - ] - }, - { - "objectID": "notebooks/01_local_dask.html#eodc-stac-catalog", - "href": "notebooks/01_local_dask.html#eodc-stac-catalog", - "title": "1  Dask Client", - "section": "1.3 EODC STAC Catalog", - "text": "1.3 EODC STAC Catalog\nThe pystac_client establishes a connection to the EODC STAC Catalog. This results in a catalog object that can be used to discover collections and items hosted at EODC.\n\neodc_catalog = pystac_client.Client.open(\"https://stac.eodc.eu/api/v1\")", - "crumbs": [ - "1  Dask Client" - ] - }, - { - "objectID": "notebooks/01_local_dask.html#microwave-backscatter-measurements", - "href": "notebooks/01_local_dask.html#microwave-backscatter-measurements", - "title": "1  Dask Client", - "section": "1.4 Microwave Backscatter Measurements", - "text": "1.4 Microwave Backscatter Measurements\nThe basic premise of microwave-based backscattering can be seen in the sketch below, the characteristics of backscattering over land and water differ considerably. With this knowledge we can detect whenever a pixel with a predominant land like signature changes to a water like signature in the event of flooding.\n\nSchematic backscattering over land and water. Image from Geological Survey Ireland\nWe discover Sentinel-1 microwave backscatter (\\(\\sigma_0\\) [1]) at a 20 meter resolution, like so:\n\nsearch = eodc_catalog.search(\n collections=\"SENTINEL1_SIG0_20M\",\n bbox=bounding_box,\n datetime=time_range,\n)\n\nitems_sig0 = search.item_collection()\n\nThe state of the orbit and relative orbit number is also saved, as the water and land likelihoods (which are calculated later on) dependent on the orbital configuration. These variables will be added as additional coordinates to the data cube. For this purpose a small helper function is defined, like so:\n\ndef extract_orbit_names(items):\n return np.array([items[i].properties[\"sat:orbit_state\"][0].upper() + \\\n str(items[i].properties[\"sat:relative_orbit\"]) \\\n for i in range(len(items))])\n\nWe will also save the scaling factor and nodata values of STAC items to correct the loaded data accordingly. Again a helper function will be used to correctly scale and fill no data values of the cube.\n\ndef post_process_eodc_cube(dc: xr.Dataset, items, bands):\n if not isinstance(bands, tuple):\n bands = tuple([bands])\n for i in bands:\n dc[i] = post_process_eodc_cube_(dc[i], items, i)\n return dc\n\ndef post_process_eodc_cube_(dc: xr.Dataset, items, band):\n scale = items[0].assets[band].extra_fields.get('raster:bands')[0]['scale']\n nodata = items[0].assets[band].extra_fields.get('raster:bands')[0]['nodata']\n return dc.where(dc != nodata) / scale\n\nThe VV polarization of the discover items can be loaded with odc-stac and cast in the desired projection and resolution. The data is at this point only lazily loaded, meaning that we only make an instance of the outlines of the datacube with the proper shape and resolution, but without actually loading all the data. This is done by providing the chunks as defined before, which partitions the data in portions which are more easily handled by the setup used for processing the data (in this case my own pc).\n\nbands = \"VV\"\nsig0_dc = odc_stac.load(items_sig0,\n bands=bands,\n crs=crs,\n chunks=chunks,\n resolution=res,\n bbox=bounding_box,\n groupby=None,\n )\n\nNow we can rescale our variable, fill the no data values with np.nan values, and add the orbit names, with the previous defined functions.\n\nsig0_dc = post_process_eodc_cube(sig0_dc, items_sig0, bands).\\\n rename_vars({ \"VV\": \"sig0\"}).\\\n assign_coords(orbit=(\"time\", extract_orbit_names(items_sig0))).\\\n dropna(dim=\"time\", how=\"all\").\\\n sortby(\"time\")\n\nThen we remove duplicate time dimensions from the data cube and extract the orbit names as we will need those for obtaining the correct harmonic parameters and local incidence angles,as explained in the next section. Also, note, that we call dask.persist to materialize the object but retain it as a delayed object in the workers memory.\n\n__, indices = np.unique(sig0_dc.time, return_index=True)\nindices.sort()\norbit_sig0 = sig0_dc.orbit[indices].data\nsig0_dc = sig0_dc.groupby(\"time\").mean(skipna=True)\nsig0_dc = sig0_dc.assign_coords(orbit=(\"time\", orbit_sig0))\nsig0_dc = sig0_dc.persist()\nwait(sig0_dc)\nsig0_dc\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset> Size: 237MB\nDimensions: (time: 8, latitude: 1668, longitude: 4445)\nCoordinates:\n * latitude (latitude) float64 13kB 54.6 54.6 54.6 54.6 ... 54.3 54.3 54.3\n * longitude (longitude) float64 36kB 12.3 12.3 12.3 12.3 ... 13.1 13.1 13.1\n spatial_ref int32 4B 4326\n * time (time) datetime64[ns] 64B 2022-10-11T05:25:01 ... 2022-10-23...\n orbit (time) <U4 128B 'D168' 'A44' 'A44' ... 'A146' 'A146' 'D168'\nData variables:\n sig0 (time, latitude, longitude) float32 237MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>xarray.DatasetDimensions:time: 8latitude: 1668longitude: 4445Coordinates: (5)latitude(latitude)float6454.6 54.6 54.6 ... 54.3 54.3 54.3units :degrees_northresolution :-0.00018crs :EPSG:4326array([54.60003, 54.59985, 54.59967, ..., 54.30033, 54.30015, 54.29997])longitude(longitude)float6412.3 12.3 12.3 ... 13.1 13.1 13.1units :degrees_eastresolution :0.00018crs :EPSG:4326array([12.30003, 12.30021, 12.30039, ..., 13.09959, 13.09977, 13.09995])spatial_ref()int324326spatial_ref :GEOGCRS[\"WGS 84\",ENSEMBLE[\"World Geodetic System 1984 ensemble\",MEMBER[\"World Geodetic System 1984 (Transit)\"],MEMBER[\"World Geodetic System 1984 (G730)\"],MEMBER[\"World Geodetic System 1984 (G873)\"],MEMBER[\"World Geodetic System 1984 (G1150)\"],MEMBER[\"World Geodetic System 1984 (G1674)\"],MEMBER[\"World Geodetic System 1984 (G1762)\"],MEMBER[\"World Geodetic System 1984 (G2139)\"],ELLIPSOID[\"WGS 84\",6378137,298.257223563,LENGTHUNIT[\"metre\",1]],ENSEMBLEACCURACY[2.0]],PRIMEM[\"Greenwich\",0,ANGLEUNIT[\"degree\",0.0174532925199433]],CS[ellipsoidal,2],AXIS[\"geodetic latitude (Lat)\",north,ORDER[1],ANGLEUNIT[\"degree\",0.0174532925199433]],AXIS[\"geodetic longitude (Lon)\",east,ORDER[2],ANGLEUNIT[\"degree\",0.0174532925199433]],USAGE[SCOPE[\"Horizontal component of 3D system.\"],AREA[\"World.\"],BBOX[-90,-180,90,180]],ID[\"EPSG\",4326]]crs_wkt :GEOGCRS[\"WGS 84\",ENSEMBLE[\"World Geodetic System 1984 ensemble\",MEMBER[\"World Geodetic System 1984 (Transit)\"],MEMBER[\"World Geodetic System 1984 (G730)\"],MEMBER[\"World Geodetic System 1984 (G873)\"],MEMBER[\"World Geodetic System 1984 (G1150)\"],MEMBER[\"World Geodetic System 1984 (G1674)\"],MEMBER[\"World Geodetic System 1984 (G1762)\"],MEMBER[\"World Geodetic System 1984 (G2139)\"],ELLIPSOID[\"WGS 84\",6378137,298.257223563,LENGTHUNIT[\"metre\",1]],ENSEMBLEACCURACY[2.0]],PRIMEM[\"Greenwich\",0,ANGLEUNIT[\"degree\",0.0174532925199433]],CS[ellipsoidal,2],AXIS[\"geodetic latitude (Lat)\",north,ORDER[1],ANGLEUNIT[\"degree\",0.0174532925199433]],AXIS[\"geodetic longitude (Lon)\",east,ORDER[2],ANGLEUNIT[\"degree\",0.0174532925199433]],USAGE[SCOPE[\"Horizontal component of 3D system.\"],AREA[\"World.\"],BBOX[-90,-180,90,180]],ID[\"EPSG\",4326]]semi_major_axis :6378137.0semi_minor_axis :6356752.314245179inverse_flattening :298.257223563reference_ellipsoid_name :WGS 84longitude_of_prime_meridian :0.0prime_meridian_name :Greenwichgeographic_crs_name :WGS 84horizontal_datum_name :World Geodetic System 1984 ensemblegrid_mapping_name :latitude_longitudeGeoTransform :12.299940000000001205648914 0.000180000000000000011336 0 54.600120000000003983586794 0 -0.000180000000000000011336array(4326, dtype=int32)time(time)datetime64[ns]2022-10-11T05:25:01 ... 2022-10-...array(['2022-10-11T05:25:01.000000000', '2022-10-14T17:01:09.000000000',\n '2022-10-14T17:01:34.000000000', '2022-10-16T05:33:14.000000000',\n '2022-10-18T05:16:52.000000000', '2022-10-21T16:52:59.000000000',\n '2022-10-21T16:53:24.000000000', '2022-10-23T05:25:01.000000000'],\n dtype='datetime64[ns]')orbit(time)<U4'D168' 'A44' ... 'A146' 'D168'array(['D168', 'A44', 'A44', 'D66', 'D95', 'A146', 'A146', 'D168'],\n dtype='<U4')Data variables: (1)sig0(time, latitude, longitude)float32dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n226.27 MiB\n6.45 MiB\n\n\nShape\n(8, 1668, 4445)\n(1, 1300, 1300)\n\n\nDask graph\n64 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668 8\n\n\n\n\nIndexes: (3)latitudePandasIndexPandasIndex(Index([54.600030000000004, 54.59985, 54.59967,\n 54.59949, 54.59931, 54.59913,\n 54.59895, 54.59877, 54.59859,\n 54.59841,\n ...\n 54.301590000000004, 54.301410000000004, 54.301230000000004,\n 54.301050000000004, 54.30087, 54.30069,\n 54.30051, 54.30033, 54.30015,\n 54.29997],\n dtype='float64', name='latitude', length=1668))longitudePandasIndexPandasIndex(Index([12.300030000000001, 12.300210000000002, 12.300390000000002,\n 12.300570000000002, 12.30075, 12.300930000000001,\n 12.301110000000001, 12.301290000000002, 12.301470000000002,\n 12.301650000000002,\n ...\n 13.09833, 13.098510000000001, 13.098690000000001,\n 13.098870000000002, 13.099050000000002, 13.099230000000002,\n 13.09941, 13.099590000000001, 13.099770000000001,\n 13.099950000000002],\n dtype='float64', name='longitude', length=4445))timePandasIndexPandasIndex(DatetimeIndex(['2022-10-11 05:25:01', '2022-10-14 17:01:09',\n '2022-10-14 17:01:34', '2022-10-16 05:33:14',\n '2022-10-18 05:16:52', '2022-10-21 16:52:59',\n '2022-10-21 16:53:24', '2022-10-23 05:25:01'],\n dtype='datetime64[ns]', name='time', freq=None))Attributes: (0)", - "crumbs": [ - "1  Dask Client" - ] - }, - { - "objectID": "notebooks/01_local_dask.html#harmonic-parameters", - "href": "notebooks/01_local_dask.html#harmonic-parameters", - "title": "1  Dask Client", - "section": "1.5 Harmonic Parameters", - "text": "1.5 Harmonic Parameters\nThe so-called likelihoods of \\(P(\\sigma^0|flood)\\) and \\(P(\\sigma^0|nonflood)\\) can be calculated from past backscattering information. To be able to this we load the harmonic parameters we can model the expected variations in land back scattering based on seasonal changes in vegetation. The procedure is similar to the backscattering routine.\nWe discover items.\n\nsearch = eodc_catalog.search(\n collections=\"SENTINEL1_HPAR\",\n bbox=bounding_box\n)\n\nitems_hpar = search.item_collection()\n\nLoad the data as a lazy object.\n\nbands = (\"C1\", \"C2\", \"C3\", \"M0\", \"S1\", \"S2\", \"S3\", \"STD\")\nhpar_dc = odc_stac.load(items_hpar,\n bands=bands,\n crs=crs,\n chunks=chunks,\n resolution=res,\n bbox=bounding_box,\n groupby=None,\n )\n\nhpar_dc = post_process_eodc_cube(hpar_dc, items_hpar, bands).\\\n rename({\"time\": \"orbit\"})\nhpar_dc[\"orbit\"] = extract_orbit_names(items_hpar)\nhpar_dc = hpar_dc.groupby(\"orbit\").mean(skipna=True)\n\nWe expand the variables along the orbits of sigma naught to be able to calculate the correct land reference backscatter signatures.\n\nhpar_dc = hpar_dc.sel(orbit = orbit_sig0)\nhpar_dc = hpar_dc.persist()\nwait(hpar_dc)\nhpar_dc\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset> Size: 2GB\nDimensions: (orbit: 8, latitude: 1668, longitude: 4445)\nCoordinates:\n * latitude (latitude) float64 13kB 54.6 54.6 54.6 54.6 ... 54.3 54.3 54.3\n * longitude (longitude) float64 36kB 12.3 12.3 12.3 12.3 ... 13.1 13.1 13.1\n spatial_ref int32 4B 4326\n * orbit (orbit) object 64B 'D168' 'A44' 'A44' ... 'A146' 'A146' 'D168'\nData variables:\n C1 (orbit, latitude, longitude) float32 237MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n C2 (orbit, latitude, longitude) float32 237MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n C3 (orbit, latitude, longitude) float32 237MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n M0 (orbit, latitude, longitude) float32 237MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n S1 (orbit, latitude, longitude) float32 237MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n S2 (orbit, latitude, longitude) float32 237MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n S3 (orbit, latitude, longitude) float32 237MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n STD (orbit, latitude, longitude) float32 237MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>xarray.DatasetDimensions:orbit: 8latitude: 1668longitude: 4445Coordinates: (4)latitude(latitude)float6454.6 54.6 54.6 ... 54.3 54.3 54.3units :degrees_northresolution :-0.00018crs :EPSG:4326array([54.60003, 54.59985, 54.59967, ..., 54.30033, 54.30015, 54.29997])longitude(longitude)float6412.3 12.3 12.3 ... 13.1 13.1 13.1units :degrees_eastresolution :0.00018crs :EPSG:4326array([12.30003, 12.30021, 12.30039, ..., 13.09959, 13.09977, 13.09995])spatial_ref()int324326spatial_ref :GEOGCRS[\"WGS 84\",ENSEMBLE[\"World Geodetic System 1984 ensemble\",MEMBER[\"World Geodetic System 1984 (Transit)\"],MEMBER[\"World Geodetic System 1984 (G730)\"],MEMBER[\"World Geodetic System 1984 (G873)\"],MEMBER[\"World Geodetic System 1984 (G1150)\"],MEMBER[\"World Geodetic System 1984 (G1674)\"],MEMBER[\"World Geodetic System 1984 (G1762)\"],MEMBER[\"World Geodetic System 1984 (G2139)\"],ELLIPSOID[\"WGS 84\",6378137,298.257223563,LENGTHUNIT[\"metre\",1]],ENSEMBLEACCURACY[2.0]],PRIMEM[\"Greenwich\",0,ANGLEUNIT[\"degree\",0.0174532925199433]],CS[ellipsoidal,2],AXIS[\"geodetic latitude (Lat)\",north,ORDER[1],ANGLEUNIT[\"degree\",0.0174532925199433]],AXIS[\"geodetic longitude (Lon)\",east,ORDER[2],ANGLEUNIT[\"degree\",0.0174532925199433]],USAGE[SCOPE[\"Horizontal component of 3D system.\"],AREA[\"World.\"],BBOX[-90,-180,90,180]],ID[\"EPSG\",4326]]crs_wkt :GEOGCRS[\"WGS 84\",ENSEMBLE[\"World Geodetic System 1984 ensemble\",MEMBER[\"World Geodetic System 1984 (Transit)\"],MEMBER[\"World Geodetic System 1984 (G730)\"],MEMBER[\"World Geodetic System 1984 (G873)\"],MEMBER[\"World Geodetic System 1984 (G1150)\"],MEMBER[\"World Geodetic System 1984 (G1674)\"],MEMBER[\"World Geodetic System 1984 (G1762)\"],MEMBER[\"World Geodetic System 1984 (G2139)\"],ELLIPSOID[\"WGS 84\",6378137,298.257223563,LENGTHUNIT[\"metre\",1]],ENSEMBLEACCURACY[2.0]],PRIMEM[\"Greenwich\",0,ANGLEUNIT[\"degree\",0.0174532925199433]],CS[ellipsoidal,2],AXIS[\"geodetic latitude (Lat)\",north,ORDER[1],ANGLEUNIT[\"degree\",0.0174532925199433]],AXIS[\"geodetic longitude (Lon)\",east,ORDER[2],ANGLEUNIT[\"degree\",0.0174532925199433]],USAGE[SCOPE[\"Horizontal component of 3D system.\"],AREA[\"World.\"],BBOX[-90,-180,90,180]],ID[\"EPSG\",4326]]semi_major_axis :6378137.0semi_minor_axis :6356752.314245179inverse_flattening :298.257223563reference_ellipsoid_name :WGS 84longitude_of_prime_meridian :0.0prime_meridian_name :Greenwichgeographic_crs_name :WGS 84horizontal_datum_name :World Geodetic System 1984 ensemblegrid_mapping_name :latitude_longitudeGeoTransform :12.299940000000001205648914 0.000180000000000000011336 0 54.600120000000003983586794 0 -0.000180000000000000011336array(4326, dtype=int32)orbit(orbit)object'D168' 'A44' ... 'A146' 'D168'array(['D168', 'A44', 'A44', 'D66', 'D95', 'A146', 'A146', 'D168'],\n dtype=object)Data variables: (8)C1(orbit, latitude, longitude)float32dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n226.27 MiB\n6.45 MiB\n\n\nShape\n(8, 1668, 4445)\n(1, 1300, 1300)\n\n\nDask graph\n64 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668 8\n\n\n\n\n\n\n\n\nC2\n\n\n(orbit, latitude, longitude)\n\n\nfloat32\n\n\ndask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n226.27 MiB\n6.45 MiB\n\n\nShape\n(8, 1668, 4445)\n(1, 1300, 1300)\n\n\nDask graph\n64 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668 8\n\n\n\n\n\n\n\n\nC3\n\n\n(orbit, latitude, longitude)\n\n\nfloat32\n\n\ndask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n226.27 MiB\n6.45 MiB\n\n\nShape\n(8, 1668, 4445)\n(1, 1300, 1300)\n\n\nDask graph\n64 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668 8\n\n\n\n\n\n\n\n\nM0\n\n\n(orbit, latitude, longitude)\n\n\nfloat32\n\n\ndask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n226.27 MiB\n6.45 MiB\n\n\nShape\n(8, 1668, 4445)\n(1, 1300, 1300)\n\n\nDask graph\n64 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668 8\n\n\n\n\n\n\n\n\nS1\n\n\n(orbit, latitude, longitude)\n\n\nfloat32\n\n\ndask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n226.27 MiB\n6.45 MiB\n\n\nShape\n(8, 1668, 4445)\n(1, 1300, 1300)\n\n\nDask graph\n64 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668 8\n\n\n\n\n\n\n\n\nS2\n\n\n(orbit, latitude, longitude)\n\n\nfloat32\n\n\ndask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n226.27 MiB\n6.45 MiB\n\n\nShape\n(8, 1668, 4445)\n(1, 1300, 1300)\n\n\nDask graph\n64 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668 8\n\n\n\n\n\n\n\n\nS3\n\n\n(orbit, latitude, longitude)\n\n\nfloat32\n\n\ndask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n226.27 MiB\n6.45 MiB\n\n\nShape\n(8, 1668, 4445)\n(1, 1300, 1300)\n\n\nDask graph\n64 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668 8\n\n\n\n\n\n\n\n\nSTD\n\n\n(orbit, latitude, longitude)\n\n\nfloat32\n\n\ndask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n226.27 MiB\n6.45 MiB\n\n\nShape\n(8, 1668, 4445)\n(1, 1300, 1300)\n\n\nDask graph\n64 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668 8\n\n\n\n\n\nIndexes: (3)latitudePandasIndexPandasIndex(Index([54.600030000000004, 54.59985, 54.59967,\n 54.59949, 54.59931, 54.59913,\n 54.59895, 54.59877, 54.59859,\n 54.59841,\n ...\n 54.301590000000004, 54.301410000000004, 54.301230000000004,\n 54.301050000000004, 54.30087, 54.30069,\n 54.30051, 54.30033, 54.30015,\n 54.29997],\n dtype='float64', name='latitude', length=1668))longitudePandasIndexPandasIndex(Index([12.300030000000001, 12.300210000000002, 12.300390000000002,\n 12.300570000000002, 12.30075, 12.300930000000001,\n 12.301110000000001, 12.301290000000002, 12.301470000000002,\n 12.301650000000002,\n ...\n 13.09833, 13.098510000000001, 13.098690000000001,\n 13.098870000000002, 13.099050000000002, 13.099230000000002,\n 13.09941, 13.099590000000001, 13.099770000000001,\n 13.099950000000002],\n dtype='float64', name='longitude', length=4445))orbitPandasIndexPandasIndex(Index(['D168', 'A44', 'A44', 'D66', 'D95', 'A146', 'A146', 'D168'], dtype='object', name='orbit'))Attributes: (0)", - "crumbs": [ - "1  Dask Client" - ] - }, - { - "objectID": "notebooks/01_local_dask.html#local-incidence-angles", - "href": "notebooks/01_local_dask.html#local-incidence-angles", - "title": "1  Dask Client", - "section": "1.6 Local Incidence Angles", - "text": "1.6 Local Incidence Angles\nLocal incidence angles of measured microwave backscattering is as well important for calculating reference backscatter values, but now for water bodies. The procedure is much the same as for the harmonic parameters.\n\nsearch = eodc_catalog.search(\n collections=\"SENTINEL1_MPLIA\",\n bbox=bounding_box\n)\n\nitems_plia = search.item_collection()\n\nLoad the lazy object and preprocess.\n\nbands = \"MPLIA\"\nplia_dc = odc_stac.load(items_plia,\n bands=bands,\n crs=crs,\n chunks=chunks,\n resolution=res,\n bbox=bounding_box,\n groupby=None,\n )\n\nplia_dc = post_process_eodc_cube(plia_dc, items_plia, bands).\\\n rename({\"time\": \"orbit\"})\nplia_dc[\"orbit\"] = extract_orbit_names(items_plia)\nplia_dc = plia_dc.groupby(\"orbit\").mean(skipna=True)\n\nWe expand the variables along the orbits of sigma naught to be able to calculate the correct land reference backscatter signatures.\n\nplia_dc = plia_dc.sel(orbit = orbit_sig0)\nplia_dc = plia_dc.persist()\nwait(plia_dc)\nplia_dc\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset> Size: 237MB\nDimensions: (orbit: 8, latitude: 1668, longitude: 4445)\nCoordinates:\n * latitude (latitude) float64 13kB 54.6 54.6 54.6 54.6 ... 54.3 54.3 54.3\n * longitude (longitude) float64 36kB 12.3 12.3 12.3 12.3 ... 13.1 13.1 13.1\n spatial_ref int32 4B 4326\n * orbit (orbit) object 64B 'D168' 'A44' 'A44' ... 'A146' 'A146' 'D168'\nData variables:\n MPLIA (orbit, latitude, longitude) float32 237MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>xarray.DatasetDimensions:orbit: 8latitude: 1668longitude: 4445Coordinates: (4)latitude(latitude)float6454.6 54.6 54.6 ... 54.3 54.3 54.3units :degrees_northresolution :-0.00018crs :EPSG:4326array([54.60003, 54.59985, 54.59967, ..., 54.30033, 54.30015, 54.29997])longitude(longitude)float6412.3 12.3 12.3 ... 13.1 13.1 13.1units :degrees_eastresolution :0.00018crs :EPSG:4326array([12.30003, 12.30021, 12.30039, ..., 13.09959, 13.09977, 13.09995])spatial_ref()int324326spatial_ref :GEOGCRS[\"WGS 84\",ENSEMBLE[\"World Geodetic System 1984 ensemble\",MEMBER[\"World Geodetic System 1984 (Transit)\"],MEMBER[\"World Geodetic System 1984 (G730)\"],MEMBER[\"World Geodetic System 1984 (G873)\"],MEMBER[\"World Geodetic System 1984 (G1150)\"],MEMBER[\"World Geodetic System 1984 (G1674)\"],MEMBER[\"World Geodetic System 1984 (G1762)\"],MEMBER[\"World Geodetic System 1984 (G2139)\"],ELLIPSOID[\"WGS 84\",6378137,298.257223563,LENGTHUNIT[\"metre\",1]],ENSEMBLEACCURACY[2.0]],PRIMEM[\"Greenwich\",0,ANGLEUNIT[\"degree\",0.0174532925199433]],CS[ellipsoidal,2],AXIS[\"geodetic latitude (Lat)\",north,ORDER[1],ANGLEUNIT[\"degree\",0.0174532925199433]],AXIS[\"geodetic longitude (Lon)\",east,ORDER[2],ANGLEUNIT[\"degree\",0.0174532925199433]],USAGE[SCOPE[\"Horizontal component of 3D system.\"],AREA[\"World.\"],BBOX[-90,-180,90,180]],ID[\"EPSG\",4326]]crs_wkt :GEOGCRS[\"WGS 84\",ENSEMBLE[\"World Geodetic System 1984 ensemble\",MEMBER[\"World Geodetic System 1984 (Transit)\"],MEMBER[\"World Geodetic System 1984 (G730)\"],MEMBER[\"World Geodetic System 1984 (G873)\"],MEMBER[\"World Geodetic System 1984 (G1150)\"],MEMBER[\"World Geodetic System 1984 (G1674)\"],MEMBER[\"World Geodetic System 1984 (G1762)\"],MEMBER[\"World Geodetic System 1984 (G2139)\"],ELLIPSOID[\"WGS 84\",6378137,298.257223563,LENGTHUNIT[\"metre\",1]],ENSEMBLEACCURACY[2.0]],PRIMEM[\"Greenwich\",0,ANGLEUNIT[\"degree\",0.0174532925199433]],CS[ellipsoidal,2],AXIS[\"geodetic latitude (Lat)\",north,ORDER[1],ANGLEUNIT[\"degree\",0.0174532925199433]],AXIS[\"geodetic longitude (Lon)\",east,ORDER[2],ANGLEUNIT[\"degree\",0.0174532925199433]],USAGE[SCOPE[\"Horizontal component of 3D system.\"],AREA[\"World.\"],BBOX[-90,-180,90,180]],ID[\"EPSG\",4326]]semi_major_axis :6378137.0semi_minor_axis :6356752.314245179inverse_flattening :298.257223563reference_ellipsoid_name :WGS 84longitude_of_prime_meridian :0.0prime_meridian_name :Greenwichgeographic_crs_name :WGS 84horizontal_datum_name :World Geodetic System 1984 ensemblegrid_mapping_name :latitude_longitudeGeoTransform :12.299940000000001205648914 0.000180000000000000011336 0 54.600120000000003983586794 0 -0.000180000000000000011336array(4326, dtype=int32)orbit(orbit)object'D168' 'A44' ... 'A146' 'D168'array(['D168', 'A44', 'A44', 'D66', 'D95', 'A146', 'A146', 'D168'],\n dtype=object)Data variables: (1)MPLIA(orbit, latitude, longitude)float32dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n226.27 MiB\n6.45 MiB\n\n\nShape\n(8, 1668, 4445)\n(1, 1300, 1300)\n\n\nDask graph\n64 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668 8\n\n\n\n\nIndexes: (3)latitudePandasIndexPandasIndex(Index([54.600030000000004, 54.59985, 54.59967,\n 54.59949, 54.59931, 54.59913,\n 54.59895, 54.59877, 54.59859,\n 54.59841,\n ...\n 54.301590000000004, 54.301410000000004, 54.301230000000004,\n 54.301050000000004, 54.30087, 54.30069,\n 54.30051, 54.30033, 54.30015,\n 54.29997],\n dtype='float64', name='latitude', length=1668))longitudePandasIndexPandasIndex(Index([12.300030000000001, 12.300210000000002, 12.300390000000002,\n 12.300570000000002, 12.30075, 12.300930000000001,\n 12.301110000000001, 12.301290000000002, 12.301470000000002,\n 12.301650000000002,\n ...\n 13.09833, 13.098510000000001, 13.098690000000001,\n 13.098870000000002, 13.099050000000002, 13.099230000000002,\n 13.09941, 13.099590000000001, 13.099770000000001,\n 13.099950000000002],\n dtype='float64', name='longitude', length=4445))orbitPandasIndexPandasIndex(Index(['D168', 'A44', 'A44', 'D66', 'D95', 'A146', 'A146', 'D168'], dtype='object', name='orbit'))Attributes: (0)", - "crumbs": [ - "1  Dask Client" - ] - }, - { - "objectID": "notebooks/01_local_dask.html#esa-world-cover-from-terrascope", - "href": "notebooks/01_local_dask.html#esa-world-cover-from-terrascope", - "title": "1  Dask Client", - "section": "1.7 ESA World Cover from Terrascope", - "text": "1.7 ESA World Cover from Terrascope\nFor flood mapping we are only interested in microwave backscattering over what used to be land, as such, we need a way to mask water bodies. For this we use the ESA World Cover data from the following STAC catalog.\n\nimport os\nos.environ['AWS_NO_SIGN_REQUEST'] = 'YES'\nwcover_catalog = pystac_client.Client.open('https://services.terrascope.be/stac/')\n\nSimilarly, we discover the required items.\n\nsearch = wcover_catalog.search(\n collections= \"urn:eop:VITO:ESA_WorldCover_10m_2021_AWS_V2\",\n bbox=bounding_box\n)\n\nitems_wcover = search.item_collection()\n\nLoad the data lazily.\n\nwcover_dc = odc_stac.load(items_wcover,\n crs=crs,\n chunks=chunks,\n resolution=res,\n bbox=bounding_box,\n ).\\\n squeeze(\"time\").\\\n drop_vars(\"time\").\\\n rename_vars({\"ESA_WORLDCOVER_10M_MAP\": \"wcover\"})\nwcover_dc = wcover_dc.persist()\nwait(wcover_dc)\nwcover_dc\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset> Size: 30MB\nDimensions: (latitude: 1668, longitude: 4445)\nCoordinates:\n * latitude (latitude) float64 13kB 54.6 54.6 54.6 54.6 ... 54.3 54.3 54.3\n * longitude (longitude) float64 36kB 12.3 12.3 12.3 12.3 ... 13.1 13.1 13.1\n spatial_ref int32 4B 4326\nData variables:\n wcover (latitude, longitude) float32 30MB dask.array<chunksize=(1300, 1300), meta=np.ndarray>xarray.DatasetDimensions:latitude: 1668longitude: 4445Coordinates: (3)latitude(latitude)float6454.6 54.6 54.6 ... 54.3 54.3 54.3units :degrees_northresolution :-0.00018crs :EPSG:4326array([54.60003, 54.59985, 54.59967, ..., 54.30033, 54.30015, 54.29997])longitude(longitude)float6412.3 12.3 12.3 ... 13.1 13.1 13.1units :degrees_eastresolution :0.00018crs :EPSG:4326array([12.30003, 12.30021, 12.30039, ..., 13.09959, 13.09977, 13.09995])spatial_ref()int324326spatial_ref :GEOGCRS[\"WGS 84\",ENSEMBLE[\"World Geodetic System 1984 ensemble\",MEMBER[\"World Geodetic System 1984 (Transit)\"],MEMBER[\"World Geodetic System 1984 (G730)\"],MEMBER[\"World Geodetic System 1984 (G873)\"],MEMBER[\"World Geodetic System 1984 (G1150)\"],MEMBER[\"World Geodetic System 1984 (G1674)\"],MEMBER[\"World Geodetic System 1984 (G1762)\"],MEMBER[\"World Geodetic System 1984 (G2139)\"],ELLIPSOID[\"WGS 84\",6378137,298.257223563,LENGTHUNIT[\"metre\",1]],ENSEMBLEACCURACY[2.0]],PRIMEM[\"Greenwich\",0,ANGLEUNIT[\"degree\",0.0174532925199433]],CS[ellipsoidal,2],AXIS[\"geodetic latitude (Lat)\",north,ORDER[1],ANGLEUNIT[\"degree\",0.0174532925199433]],AXIS[\"geodetic longitude (Lon)\",east,ORDER[2],ANGLEUNIT[\"degree\",0.0174532925199433]],USAGE[SCOPE[\"Horizontal component of 3D system.\"],AREA[\"World.\"],BBOX[-90,-180,90,180]],ID[\"EPSG\",4326]]crs_wkt :GEOGCRS[\"WGS 84\",ENSEMBLE[\"World Geodetic System 1984 ensemble\",MEMBER[\"World Geodetic System 1984 (Transit)\"],MEMBER[\"World Geodetic System 1984 (G730)\"],MEMBER[\"World Geodetic System 1984 (G873)\"],MEMBER[\"World Geodetic System 1984 (G1150)\"],MEMBER[\"World Geodetic System 1984 (G1674)\"],MEMBER[\"World Geodetic System 1984 (G1762)\"],MEMBER[\"World Geodetic System 1984 (G2139)\"],ELLIPSOID[\"WGS 84\",6378137,298.257223563,LENGTHUNIT[\"metre\",1]],ENSEMBLEACCURACY[2.0]],PRIMEM[\"Greenwich\",0,ANGLEUNIT[\"degree\",0.0174532925199433]],CS[ellipsoidal,2],AXIS[\"geodetic latitude (Lat)\",north,ORDER[1],ANGLEUNIT[\"degree\",0.0174532925199433]],AXIS[\"geodetic longitude (Lon)\",east,ORDER[2],ANGLEUNIT[\"degree\",0.0174532925199433]],USAGE[SCOPE[\"Horizontal component of 3D system.\"],AREA[\"World.\"],BBOX[-90,-180,90,180]],ID[\"EPSG\",4326]]semi_major_axis :6378137.0semi_minor_axis :6356752.314245179inverse_flattening :298.257223563reference_ellipsoid_name :WGS 84longitude_of_prime_meridian :0.0prime_meridian_name :Greenwichgeographic_crs_name :WGS 84horizontal_datum_name :World Geodetic System 1984 ensemblegrid_mapping_name :latitude_longitudeGeoTransform :12.299940000000001205648914 0.000180000000000000011336 0 54.600120000000003983586794 0 -0.000180000000000000011336array(4326, dtype=int32)Data variables: (1)wcover(latitude, longitude)float32dask.array<chunksize=(1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n28.28 MiB\n6.45 MiB\n\n\nShape\n(1668, 4445)\n(1300, 1300)\n\n\nDask graph\n8 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668\n\n\n\n\nIndexes: (2)latitudePandasIndexPandasIndex(Index([54.600030000000004, 54.59985, 54.59967,\n 54.59949, 54.59931, 54.59913,\n 54.59895, 54.59877, 54.59859,\n 54.59841,\n ...\n 54.301590000000004, 54.301410000000004, 54.301230000000004,\n 54.301050000000004, 54.30087, 54.30069,\n 54.30051, 54.30033, 54.30015,\n 54.29997],\n dtype='float64', name='latitude', length=1668))longitudePandasIndexPandasIndex(Index([12.300030000000001, 12.300210000000002, 12.300390000000002,\n 12.300570000000002, 12.30075, 12.300930000000001,\n 12.301110000000001, 12.301290000000002, 12.301470000000002,\n 12.301650000000002,\n ...\n 13.09833, 13.098510000000001, 13.098690000000001,\n 13.098870000000002, 13.099050000000002, 13.099230000000002,\n 13.09941, 13.099590000000001, 13.099770000000001,\n 13.099950000000002],\n dtype='float64', name='longitude', length=4445))Attributes: (0)", - "crumbs": [ - "1  Dask Client" - ] - }, - { - "objectID": "notebooks/01_local_dask.html#fuse-cube", - "href": "notebooks/01_local_dask.html#fuse-cube", - "title": "1  Dask Client", - "section": "1.8 Fuse cube", - "text": "1.8 Fuse cube\nHere we fuse the four data cubes together and filter for the values that have a HAND value of above zero. We can now drop the obit coordinates as well as time slices which contain no land backscattering data.\n\nflood_dc = xr.merge([sig0_dc, plia_dc, hpar_dc, wcover_dc])\nflood_dc = flood_dc.where(flood_dc.wcover != 80)\nflood_dc = flood_dc.\\\n reset_index(\"orbit\", drop=True).\\\n rename({\"orbit\": \"time\"}).\\\n dropna(dim=\"time\", how=\"all\", subset=[\"sig0\"])\nflood_dc = flood_dc.persist()\nwait(flood_dc)\nflood_dc\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset> Size: 2GB\nDimensions: (time: 6, latitude: 1668, longitude: 4445)\nCoordinates:\n * latitude (latitude) float64 13kB 54.6 54.6 54.6 54.6 ... 54.3 54.3 54.3\n * longitude (longitude) float64 36kB 12.3 12.3 12.3 12.3 ... 13.1 13.1 13.1\n spatial_ref int32 4B 4326\n * time (time) datetime64[ns] 48B 2022-10-11T05:25:01 ... 2022-10-23...\nData variables:\n sig0 (time, latitude, longitude) float32 178MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n MPLIA (time, latitude, longitude) float32 178MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n C1 (time, latitude, longitude) float32 178MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n C2 (time, latitude, longitude) float32 178MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n C3 (time, latitude, longitude) float32 178MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n M0 (time, latitude, longitude) float32 178MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n S1 (time, latitude, longitude) float32 178MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n S2 (time, latitude, longitude) float32 178MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n S3 (time, latitude, longitude) float32 178MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n STD (time, latitude, longitude) float32 178MB dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n wcover (latitude, longitude) float32 30MB dask.array<chunksize=(1300, 1300), meta=np.ndarray>xarray.DatasetDimensions:time: 6latitude: 1668longitude: 4445Coordinates: (4)latitude(latitude)float6454.6 54.6 54.6 ... 54.3 54.3 54.3units :degrees_northresolution :-0.00018crs :EPSG:4326array([54.60003, 54.59985, 54.59967, ..., 54.30033, 54.30015, 54.29997])longitude(longitude)float6412.3 12.3 12.3 ... 13.1 13.1 13.1units :degrees_eastresolution :0.00018crs :EPSG:4326array([12.30003, 12.30021, 12.30039, ..., 13.09959, 13.09977, 13.09995])spatial_ref()int324326spatial_ref :GEOGCRS[\"WGS 84\",ENSEMBLE[\"World Geodetic System 1984 ensemble\",MEMBER[\"World Geodetic System 1984 (Transit)\"],MEMBER[\"World Geodetic System 1984 (G730)\"],MEMBER[\"World Geodetic System 1984 (G873)\"],MEMBER[\"World Geodetic System 1984 (G1150)\"],MEMBER[\"World Geodetic System 1984 (G1674)\"],MEMBER[\"World Geodetic System 1984 (G1762)\"],MEMBER[\"World Geodetic System 1984 (G2139)\"],ELLIPSOID[\"WGS 84\",6378137,298.257223563,LENGTHUNIT[\"metre\",1]],ENSEMBLEACCURACY[2.0]],PRIMEM[\"Greenwich\",0,ANGLEUNIT[\"degree\",0.0174532925199433]],CS[ellipsoidal,2],AXIS[\"geodetic latitude (Lat)\",north,ORDER[1],ANGLEUNIT[\"degree\",0.0174532925199433]],AXIS[\"geodetic longitude (Lon)\",east,ORDER[2],ANGLEUNIT[\"degree\",0.0174532925199433]],USAGE[SCOPE[\"Horizontal component of 3D system.\"],AREA[\"World.\"],BBOX[-90,-180,90,180]],ID[\"EPSG\",4326]]crs_wkt :GEOGCRS[\"WGS 84\",ENSEMBLE[\"World Geodetic System 1984 ensemble\",MEMBER[\"World Geodetic System 1984 (Transit)\"],MEMBER[\"World Geodetic System 1984 (G730)\"],MEMBER[\"World Geodetic System 1984 (G873)\"],MEMBER[\"World Geodetic System 1984 (G1150)\"],MEMBER[\"World Geodetic System 1984 (G1674)\"],MEMBER[\"World Geodetic System 1984 (G1762)\"],MEMBER[\"World Geodetic System 1984 (G2139)\"],ELLIPSOID[\"WGS 84\",6378137,298.257223563,LENGTHUNIT[\"metre\",1]],ENSEMBLEACCURACY[2.0]],PRIMEM[\"Greenwich\",0,ANGLEUNIT[\"degree\",0.0174532925199433]],CS[ellipsoidal,2],AXIS[\"geodetic latitude (Lat)\",north,ORDER[1],ANGLEUNIT[\"degree\",0.0174532925199433]],AXIS[\"geodetic longitude (Lon)\",east,ORDER[2],ANGLEUNIT[\"degree\",0.0174532925199433]],USAGE[SCOPE[\"Horizontal component of 3D system.\"],AREA[\"World.\"],BBOX[-90,-180,90,180]],ID[\"EPSG\",4326]]semi_major_axis :6378137.0semi_minor_axis :6356752.314245179inverse_flattening :298.257223563reference_ellipsoid_name :WGS 84longitude_of_prime_meridian :0.0prime_meridian_name :Greenwichgeographic_crs_name :WGS 84horizontal_datum_name :World Geodetic System 1984 ensemblegrid_mapping_name :latitude_longitudeGeoTransform :12.299940000000001205648914 0.000180000000000000011336 0 54.600120000000003983586794 0 -0.000180000000000000011336array(4326, dtype=int32)time(time)datetime64[ns]2022-10-11T05:25:01 ... 2022-10-...array(['2022-10-11T05:25:01.000000000', '2022-10-14T17:01:09.000000000',\n '2022-10-16T05:33:14.000000000', '2022-10-18T05:16:52.000000000',\n '2022-10-21T16:52:59.000000000', '2022-10-23T05:25:01.000000000'],\n dtype='datetime64[ns]')Data variables: (11)sig0(time, latitude, longitude)float32dask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n169.70 MiB\n6.45 MiB\n\n\nShape\n(6, 1668, 4445)\n(1, 1300, 1300)\n\n\nDask graph\n48 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668 6\n\n\n\n\n\n\n\n\nMPLIA\n\n\n(time, latitude, longitude)\n\n\nfloat32\n\n\ndask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n169.70 MiB\n6.45 MiB\n\n\nShape\n(6, 1668, 4445)\n(1, 1300, 1300)\n\n\nDask graph\n48 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668 6\n\n\n\n\n\n\n\n\nC1\n\n\n(time, latitude, longitude)\n\n\nfloat32\n\n\ndask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n169.70 MiB\n6.45 MiB\n\n\nShape\n(6, 1668, 4445)\n(1, 1300, 1300)\n\n\nDask graph\n48 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668 6\n\n\n\n\n\n\n\n\nC2\n\n\n(time, latitude, longitude)\n\n\nfloat32\n\n\ndask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n169.70 MiB\n6.45 MiB\n\n\nShape\n(6, 1668, 4445)\n(1, 1300, 1300)\n\n\nDask graph\n48 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668 6\n\n\n\n\n\n\n\n\nC3\n\n\n(time, latitude, longitude)\n\n\nfloat32\n\n\ndask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n169.70 MiB\n6.45 MiB\n\n\nShape\n(6, 1668, 4445)\n(1, 1300, 1300)\n\n\nDask graph\n48 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668 6\n\n\n\n\n\n\n\n\nM0\n\n\n(time, latitude, longitude)\n\n\nfloat32\n\n\ndask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n169.70 MiB\n6.45 MiB\n\n\nShape\n(6, 1668, 4445)\n(1, 1300, 1300)\n\n\nDask graph\n48 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668 6\n\n\n\n\n\n\n\n\nS1\n\n\n(time, latitude, longitude)\n\n\nfloat32\n\n\ndask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n169.70 MiB\n6.45 MiB\n\n\nShape\n(6, 1668, 4445)\n(1, 1300, 1300)\n\n\nDask graph\n48 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668 6\n\n\n\n\n\n\n\n\nS2\n\n\n(time, latitude, longitude)\n\n\nfloat32\n\n\ndask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n169.70 MiB\n6.45 MiB\n\n\nShape\n(6, 1668, 4445)\n(1, 1300, 1300)\n\n\nDask graph\n48 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668 6\n\n\n\n\n\n\n\n\nS3\n\n\n(time, latitude, longitude)\n\n\nfloat32\n\n\ndask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n169.70 MiB\n6.45 MiB\n\n\nShape\n(6, 1668, 4445)\n(1, 1300, 1300)\n\n\nDask graph\n48 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668 6\n\n\n\n\n\n\n\n\nSTD\n\n\n(time, latitude, longitude)\n\n\nfloat32\n\n\ndask.array<chunksize=(1, 1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n169.70 MiB\n6.45 MiB\n\n\nShape\n(6, 1668, 4445)\n(1, 1300, 1300)\n\n\nDask graph\n48 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668 6\n\n\n\n\n\n\n\n\nwcover\n\n\n(latitude, longitude)\n\n\nfloat32\n\n\ndask.array<chunksize=(1300, 1300), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n28.28 MiB\n6.45 MiB\n\n\nShape\n(1668, 4445)\n(1300, 1300)\n\n\nDask graph\n8 chunks in 1 graph layer\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4445 1668\n\n\n\n\n\nIndexes: (3)latitudePandasIndexPandasIndex(Index([54.600030000000004, 54.59985, 54.59967,\n 54.59949, 54.59931, 54.59913,\n 54.59895, 54.59877, 54.59859,\n 54.59841,\n ...\n 54.301590000000004, 54.301410000000004, 54.301230000000004,\n 54.301050000000004, 54.30087, 54.30069,\n 54.30051, 54.30033, 54.30015,\n 54.29997],\n dtype='float64', name='latitude', length=1668))longitudePandasIndexPandasIndex(Index([12.300030000000001, 12.300210000000002, 12.300390000000002,\n 12.300570000000002, 12.30075, 12.300930000000001,\n 12.301110000000001, 12.301290000000002, 12.301470000000002,\n 12.301650000000002,\n ...\n 13.09833, 13.098510000000001, 13.098690000000001,\n 13.098870000000002, 13.099050000000002, 13.099230000000002,\n 13.09941, 13.099590000000001, 13.099770000000001,\n 13.099950000000002],\n dtype='float64', name='longitude', length=4445))timePandasIndexPandasIndex(DatetimeIndex(['2022-10-11 05:25:01', '2022-10-14 17:01:09',\n '2022-10-16 05:33:14', '2022-10-18 05:16:52',\n '2022-10-21 16:52:59', '2022-10-23 05:25:01'],\n dtype='datetime64[ns]', name='time', freq=None))Attributes: (0)", - "crumbs": [ - "1  Dask Client" - ] - }, - { - "objectID": "notebooks/01_local_dask.html#likelihoods", - "href": "notebooks/01_local_dask.html#likelihoods", - "title": "1  Dask Client", - "section": "1.9 Likelihoods", - "text": "1.9 Likelihoods\nNow we are ready to calculate the likelihoods of micorwave backscattering given flooding (or non flooding).\n\n1.9.1 Water\nWe start with water which is the simplest calculation, where the hard coded values are coefficients of a regression model fitted to global water backscattering values.\n\ndef calc_water_likelihood(dc):\n return dc.MPLIA * -0.394181 + -4.142015\n\n\nflood_dc[\"wbsc\"] = calc_water_likelihood(flood_dc)\n\n\n\n1.9.2 Land\nFor land backscattering we construct the harmonic model from the parameters as contained in the fused data cube. By doing so, we obtain a reference land backscattering value to which to compare our actual observed sigma naught values.\n\ndef harmonic_expected_backscatter(dc):\n w = np.pi * 2 / 365\n \n t = dc.time.dt.dayofyear\n wt = w * t\n \n M0 = dc.M0\n S1 = dc.S1\n S2 = dc.S2\n S3 = dc.S3\n C1 = dc.C1\n C2 = dc.C2\n C3 = dc.C3\n hm_c1 = (M0 + S1 * np.sin(wt)) + (C1 * np.cos(wt))\n hm_c2 = ((hm_c1 + S2 * np.sin(2 * wt)) + C2 * np.cos(2 * wt))\n hm_c3 = ((hm_c2 + S3 * np.sin(3 * wt)) + C3 * np.cos(3 * wt))\n return hm_c3\n\n\nflood_dc[\"hbsc\"] = harmonic_expected_backscatter(flood_dc)", - "crumbs": [ - "1  Dask Client" - ] - }, - { - "objectID": "notebooks/01_local_dask.html#flood-mapping", - "href": "notebooks/01_local_dask.html#flood-mapping", - "title": "1  Dask Client", - "section": "1.10 Flood mapping", - "text": "1.10 Flood mapping\nHaving calculated the likelihoods, we can now move on to calculate the probability of (non-)flooding given a pixel’s \\(\\sigma^0\\). These so-called posteriors need one more piece of information, as can be seen in the equation above. We need the probability that a pixel is flooded \\(P(F)\\) or not flooded \\(P(NF)\\). Of course, these are the figures we’ve been trying to find this whole time. We don’t actually have them yet, so what can we do? In Bayesian statistics, we can just start with our best guess. These guesses are called our “priors”, because they are the beliefs we hold prior to looking at the data. This subjective prior belief is the foundation Bayesian statistics, and we use the likelihoods we just calculated to update our belief in this particular hypothesis. This updated belief is called the “posterior”.\nLet’s say that our best estimate for the chance of flooding versus non-flooding of a pixel is 50-50: a coin flip. We now can also calculate the probability of backscattering \\(P(\\sigma^0)\\), as the weighted average of the water and land likelihoods, ensuring that our posteriors range between 0 to 1.\nThe following code block shows how we calculate the priors which allow use to predict whether it is likely if a land pixel became flooded.\n\ndef bayesian_flood_decision(dc):\n \n nf_std = 2.754041\n sig0 = dc.sig0\n std = dc.STD\n wbsc = dc.wbsc\n hbsc = dc.hbsc\n\n f_prob = (1.0 / (std * np.sqrt(2 * np.pi))) * np.exp(-0.5 * \\\n (((sig0 - wbsc) / nf_std) ** 2))\n nf_prob = (1.0 / (nf_std * np.sqrt(2 * np.pi))) * np.exp(-0.5 * \\\n (((sig0 - hbsc) / nf_std) ** 2))\n \n evidence = (nf_prob * 0.5) + (f_prob * 0.5)\n nf_post_prob = (nf_prob * 0.5) / evidence\n f_post_prob = (f_prob * 0.5) / evidence\n decision = xr.where(np.isnan(f_post_prob) | np.isnan(nf_post_prob), np.nan, np.greater(f_post_prob, nf_post_prob))\n return nf_post_prob, f_post_prob, decision\n\n\nflood_dc[[\"nf_post_prob\", \"f_post_prob\", \"decision\"]] = bayesian_flood_decision(flood_dc)", - "crumbs": [ - "1  Dask Client" - ] - }, - { - "objectID": "notebooks/01_local_dask.html#postprocessing", - "href": "notebooks/01_local_dask.html#postprocessing", - "title": "1  Dask Client", - "section": "1.11 Postprocessing", - "text": "1.11 Postprocessing\nWe continue by improving our flood map by filtering out observations that we expect to have low sensitivity to flooding based on a predefined set of criteria.\nThese criteria include: * Masking of Exceeding Incidence Angles * Identification of Conflicting Distributions * Removal of Measurement Outliers * Denial of High Uncertainty on Decision\n\ndef post_processing(dc):\n dc = dc * np.logical_and(dc.MPLIA >= 27, dc.MPLIA <= 48)\n dc = dc * (dc.hbsc > (dc.wbsc + 0.5 * 2.754041))\n land_bsc_lower = dc.hbsc - 3 * dc.STD\n land_bsc_upper = dc.hbsc + 3 * dc.STD\n water_bsc_upper = dc.wbsc + 3 * 2.754041\n mask_land_outliers = np.logical_and(dc.sig0 > land_bsc_lower, dc.sig0 < land_bsc_upper)\n mask_water_outliers = dc.sig0 < water_bsc_upper\n dc = dc * (mask_land_outliers | mask_water_outliers)\n return (dc * (dc.f_post_prob > 0.8)).decision\n\n\nflood_output = post_processing(flood_dc)", - "crumbs": [ - "1  Dask Client" - ] - }, - { - "objectID": "notebooks/01_local_dask.html#removal-of-speckles", - "href": "notebooks/01_local_dask.html#removal-of-speckles", - "title": "1  Dask Client", - "section": "1.12 Removal of Speckles", - "text": "1.12 Removal of Speckles\nThe following step is designed to further improve the clarity of the floodmaps. These filters do not directly relate to prior knowledge on backscattering, but consists of contextual evidence that supports, or oppose, a flood classification. This mainly targets so-called speckles. These speckles are areas of one or a few pixels, and which are likely the result of the diversity of scattering surfaces at a sub-pixel level. In this approach it is argued that small, solitary flood surfaces are unlikely. Hence speckles are removed by applying a smoothing filter which consists of a rolling window median along the x and y-axis simultaneously.\n\nflood_output = flood_output.rolling({\"longitude\": 5, \"latitude\": 5}, center=True).median(skipna=True).persist()\nwait(flood_output)\nflood_output\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'decision' (time: 6, latitude: 1668, longitude: 4445)> Size: 356MB\ndask.array<where, shape=(6, 1668, 4445), dtype=float64, chunksize=(1, 1302, 1302), chunktype=numpy.ndarray>\nCoordinates:\n * latitude (latitude) float64 13kB 54.6 54.6 54.6 54.6 ... 54.3 54.3 54.3\n * longitude (longitude) float64 36kB 12.3 12.3 12.3 12.3 ... 13.1 13.1 13.1\n spatial_ref int32 4B 4326\n * time (time) datetime64[ns] 48B 2022-10-11T05:25:01 ... 2022-10-23...xarray.DataArray'decision'time: 6latitude: 1668longitude: 4445dask.array<chunksize=(1, 1302, 1302), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n339.40 MiB\n12.93 MiB\n\n\nShape\n(6, 1668, 4445)\n(1, 1302, 1302)\n\n\nDask graph\n90 chunks in 1 graph layer\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 4445 1668 6\n\n\n\n\nCoordinates: (4)latitude(latitude)float6454.6 54.6 54.6 ... 54.3 54.3 54.3units :degrees_northresolution :-0.00018crs :EPSG:4326array([54.60003, 54.59985, 54.59967, ..., 54.30033, 54.30015, 54.29997])longitude(longitude)float6412.3 12.3 12.3 ... 13.1 13.1 13.1units :degrees_eastresolution :0.00018crs :EPSG:4326array([12.30003, 12.30021, 12.30039, ..., 13.09959, 13.09977, 13.09995])spatial_ref()int324326spatial_ref :GEOGCRS[\"WGS 84\",ENSEMBLE[\"World Geodetic System 1984 ensemble\",MEMBER[\"World Geodetic System 1984 (Transit)\"],MEMBER[\"World Geodetic System 1984 (G730)\"],MEMBER[\"World Geodetic System 1984 (G873)\"],MEMBER[\"World Geodetic System 1984 (G1150)\"],MEMBER[\"World Geodetic System 1984 (G1674)\"],MEMBER[\"World Geodetic System 1984 (G1762)\"],MEMBER[\"World Geodetic System 1984 (G2139)\"],ELLIPSOID[\"WGS 84\",6378137,298.257223563,LENGTHUNIT[\"metre\",1]],ENSEMBLEACCURACY[2.0]],PRIMEM[\"Greenwich\",0,ANGLEUNIT[\"degree\",0.0174532925199433]],CS[ellipsoidal,2],AXIS[\"geodetic latitude (Lat)\",north,ORDER[1],ANGLEUNIT[\"degree\",0.0174532925199433]],AXIS[\"geodetic longitude (Lon)\",east,ORDER[2],ANGLEUNIT[\"degree\",0.0174532925199433]],USAGE[SCOPE[\"Horizontal component of 3D system.\"],AREA[\"World.\"],BBOX[-90,-180,90,180]],ID[\"EPSG\",4326]]crs_wkt :GEOGCRS[\"WGS 84\",ENSEMBLE[\"World Geodetic System 1984 ensemble\",MEMBER[\"World Geodetic System 1984 (Transit)\"],MEMBER[\"World Geodetic System 1984 (G730)\"],MEMBER[\"World Geodetic System 1984 (G873)\"],MEMBER[\"World Geodetic System 1984 (G1150)\"],MEMBER[\"World Geodetic System 1984 (G1674)\"],MEMBER[\"World Geodetic System 1984 (G1762)\"],MEMBER[\"World Geodetic System 1984 (G2139)\"],ELLIPSOID[\"WGS 84\",6378137,298.257223563,LENGTHUNIT[\"metre\",1]],ENSEMBLEACCURACY[2.0]],PRIMEM[\"Greenwich\",0,ANGLEUNIT[\"degree\",0.0174532925199433]],CS[ellipsoidal,2],AXIS[\"geodetic latitude (Lat)\",north,ORDER[1],ANGLEUNIT[\"degree\",0.0174532925199433]],AXIS[\"geodetic longitude (Lon)\",east,ORDER[2],ANGLEUNIT[\"degree\",0.0174532925199433]],USAGE[SCOPE[\"Horizontal component of 3D system.\"],AREA[\"World.\"],BBOX[-90,-180,90,180]],ID[\"EPSG\",4326]]semi_major_axis :6378137.0semi_minor_axis :6356752.314245179inverse_flattening :298.257223563reference_ellipsoid_name :WGS 84longitude_of_prime_meridian :0.0prime_meridian_name :Greenwichgeographic_crs_name :WGS 84horizontal_datum_name :World Geodetic System 1984 ensemblegrid_mapping_name :latitude_longitudeGeoTransform :12.299940000000001205648914 0.000180000000000000011336 0 54.600120000000003983586794 0 -0.000180000000000000011336array(4326, dtype=int32)time(time)datetime64[ns]2022-10-11T05:25:01 ... 2022-10-...array(['2022-10-11T05:25:01.000000000', '2022-10-14T17:01:09.000000000',\n '2022-10-16T05:33:14.000000000', '2022-10-18T05:16:52.000000000',\n '2022-10-21T16:52:59.000000000', '2022-10-23T05:25:01.000000000'],\n dtype='datetime64[ns]')Indexes: (3)latitudePandasIndexPandasIndex(Index([54.600030000000004, 54.59985, 54.59967,\n 54.59949, 54.59931, 54.59913,\n 54.59895, 54.59877, 54.59859,\n 54.59841,\n ...\n 54.301590000000004, 54.301410000000004, 54.301230000000004,\n 54.301050000000004, 54.30087, 54.30069,\n 54.30051, 54.30033, 54.30015,\n 54.29997],\n dtype='float64', name='latitude', length=1668))longitudePandasIndexPandasIndex(Index([12.300030000000001, 12.300210000000002, 12.300390000000002,\n 12.300570000000002, 12.30075, 12.300930000000001,\n 12.301110000000001, 12.301290000000002, 12.301470000000002,\n 12.301650000000002,\n ...\n 13.09833, 13.098510000000001, 13.098690000000001,\n 13.098870000000002, 13.099050000000002, 13.099230000000002,\n 13.09941, 13.099590000000001, 13.099770000000001,\n 13.099950000000002],\n dtype='float64', name='longitude', length=4445))timePandasIndexPandasIndex(DatetimeIndex(['2022-10-11 05:25:01', '2022-10-14 17:01:09',\n '2022-10-16 05:33:14', '2022-10-18 05:16:52',\n '2022-10-21 16:52:59', '2022-10-23 05:25:01'],\n dtype='datetime64[ns]', name='time', freq=None))Attributes: (0)", - "crumbs": [ - "1  Dask Client" - ] - }, - { - "objectID": "notebooks/01_local_dask.html#results", - "href": "notebooks/01_local_dask.html#results", - "title": "1  Dask Client", - "section": "1.13 Results", - "text": "1.13 Results\nWe are now ready to visualize our results.\n\nflood_output.plot(col=\"time\", col_wrap=3)\n\n\n\n\n\n\n\n\nIn the following graphic we superimpose the data on a map and we can move the slider to see which areas become flooded over time.\n\nflood_output.hvplot.quadmesh(x='longitude', y='latitude', geo=True, widget_location='bottom', rasterize=True, \\\n project=True, clim=(0,1), cmap=[\"rgba(0, 0, 1, 0.1)\",\"darkred\"], tiles=True, \\\n clabel=\" non-flood flood\")", - "crumbs": [ - "1  Dask Client" - ] } ] \ No newline at end of file