From d07f0c82fd6f6a34fff2cba4eaa88950941eadd4 Mon Sep 17 00:00:00 2001 From: Andres Chamorro Date: Fri, 23 Feb 2024 18:58:44 -0500 Subject: [PATCH] trasnfer from bpstewar:gostrocks --- README.md | 253 +- build_commands.txt | 8 + notebooks/AWS_Summarize.ipynb | 346 +++ notebooks/CREAT_FATHOM_VRTs.ipynb | 2142 +++++++++++++++++ notebooks/FATHOM/Extract_flood_tiles.ipynb | 245 ++ notebooks/FATHOM/Generate_footprints.ipynb | 1188 +++++++++ notebooks/FATHOM/Transfer_Data_AWS.ipynb | 755 ++++++ notebooks/FATHOM/Vizualize_Flood_types.ipynb | 160 ++ notebooks/TUT_DECAT_B_GeocodingExamples.ipynb | 274 +++ notebooks/TUT_GeoBoundaries.ipynb | 536 +++++ notebooks/Untitled.ipynb | 143 ++ .../ZON_DECAT_B_ZonalStatsNTLHarmonized.ipynb | 219 ++ notebooks/ZON_DECAT_NTL_from_AWS.ipynb | 570 +++++ notebooks/bibliography.ipynb | 173 -- notebooks/environment.yml | 10 - ...TA_DECAT_ExploringMetadataGeneration.ipynb | 491 ++++ notebooks/nasa-apod.ipynb | 282 --- notebooks/world-bank-api.ipynb | 721 ------ notebooks/world-bank-package.ipynb | 524 ---- pyproject.toml | 28 +- requirements.txt | 22 + src/{template => GOSTrocks}/__init__.py | 2 +- src/GOSTrocks/covid/DataDictionary_v2.json | 348 +++ src/GOSTrocks/covid/covid_data_extraction.py | 484 ++++ src/GOSTrocks/covid/vulnerability_mapping.py | 84 + src/GOSTrocks/dataMisc.py | 70 + src/GOSTrocks/ghslMisc.py | 67 + src/GOSTrocks/infra/aggregator.py | 174 ++ src/GOSTrocks/infra/gsm_rasterizer.py | 97 + src/GOSTrocks/infra/infra_helper.py | 20 + src/GOSTrocks/infra/mapbox_helper.py | 214 ++ src/GOSTrocks/infra/process_flows.py | 196 ++ src/GOSTrocks/infra/rai_calculator.py | 82 + src/GOSTrocks/mapMisc.py | 144 ++ src/GOSTrocks/metadataMisc.py | 287 +++ src/GOSTrocks/misc.py | 215 ++ src/GOSTrocks/ntlMisc.py | 153 ++ src/GOSTrocks/osmMisc.py | 324 +++ src/GOSTrocks/rasterMisc.py | 552 +++++ src/template/indicators.py | 83 - 40 files changed, 10639 insertions(+), 2047 deletions(-) create mode 100644 build_commands.txt create mode 100644 notebooks/AWS_Summarize.ipynb create mode 100644 notebooks/CREAT_FATHOM_VRTs.ipynb create mode 100644 notebooks/FATHOM/Extract_flood_tiles.ipynb create mode 100644 notebooks/FATHOM/Generate_footprints.ipynb create mode 100644 notebooks/FATHOM/Transfer_Data_AWS.ipynb create mode 100644 notebooks/FATHOM/Vizualize_Flood_types.ipynb create mode 100644 notebooks/TUT_DECAT_B_GeocodingExamples.ipynb create mode 100644 notebooks/TUT_GeoBoundaries.ipynb create mode 100644 notebooks/Untitled.ipynb create mode 100644 notebooks/ZON_DECAT_B_ZonalStatsNTLHarmonized.ipynb create mode 100644 notebooks/ZON_DECAT_NTL_from_AWS.ipynb delete mode 100644 notebooks/bibliography.ipynb delete mode 100644 notebooks/environment.yml create mode 100644 notebooks/metadata/META_DECAT_ExploringMetadataGeneration.ipynb delete mode 100644 notebooks/nasa-apod.ipynb delete mode 100644 notebooks/world-bank-api.ipynb delete mode 100644 notebooks/world-bank-package.ipynb create mode 100644 requirements.txt rename src/{template => GOSTrocks}/__init__.py (77%) create mode 100644 src/GOSTrocks/covid/DataDictionary_v2.json create mode 100644 src/GOSTrocks/covid/covid_data_extraction.py create mode 100644 src/GOSTrocks/covid/vulnerability_mapping.py create mode 100644 src/GOSTrocks/dataMisc.py create mode 100644 src/GOSTrocks/ghslMisc.py create mode 100644 src/GOSTrocks/infra/aggregator.py create mode 100644 src/GOSTrocks/infra/gsm_rasterizer.py create mode 100644 src/GOSTrocks/infra/infra_helper.py create mode 100644 src/GOSTrocks/infra/mapbox_helper.py create mode 100644 src/GOSTrocks/infra/process_flows.py create mode 100644 src/GOSTrocks/infra/rai_calculator.py create mode 100644 src/GOSTrocks/mapMisc.py create mode 100644 src/GOSTrocks/metadataMisc.py create mode 100644 src/GOSTrocks/misc.py create mode 100644 src/GOSTrocks/ntlMisc.py create mode 100644 src/GOSTrocks/osmMisc.py create mode 100644 src/GOSTrocks/rasterMisc.py delete mode 100644 src/template/indicators.py diff --git a/README.md b/README.md index 7c741c1..34836eb 100644 --- a/README.md +++ b/README.md @@ -1,257 +1,22 @@ -# Project Template +# GOSTrocks [![CalVer](https://img.shields.io/badge/calver-YY.0M.MICRO-22bfda.svg)](https://calver.org) [![GitHub Release](https://img.shields.io/github/v/release/worldbank/template)](https://github.com/worldbank/template/releases) [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/worldbank/template/main.svg)](https://results.pre-commit.ci/latest/github/worldbank/template/main) -The template is a standardized, but flexible *project* and *documentation* structure of folders and files for sharing your data science work. +This repository includes support functions for a number of geospatial tools used by the Geospatial Operations Support Team (GOST) in the World Bank Data Group. The Notebooks folder contains examples using the various functions. -Inspired by [literate programming](http://literateprogramming.com), maintained by the [Development Data Group](https://www.worldbank.org/en/about/unit/unit-dec/dev) and built as [GitHub template repository](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-repository-from-a-template), the template contains: +## Installation -- [**README**](README), [**CODE_OF_CONDUCT**](docs/CODE_OF_CONDUCT.md), [**CONTRIBUTING**](docs/CONTRIBUTING.md) templates - > README files are important and often neglected. The files should inform anyone about the first steps to use, learn and contribute to your project. - -- [**CITATION.cff**](CITATION.cff) - > Embracing [CFF](https://citation-file-format.github.io) aligns with best practices for reproducible research and software development. By adhering to established standards for documenting project dependencies and citations, we demonstrate our commitment to quality, transparency, and integrity in our work. - -- [**LICENSE**](LICENSE) - > The LICENSE is a document that determines what others can and cannot do with contents of the repository. If no license is present, no one has permission to use and/or modify your code. The template is licensed under the [**Mozilla Public License**](https://www.mozilla.org/en-US/MPL/). And so will projects generated from it. - -- **docs/** - - > Documentation is often never prioritized until last minute. The template aims to revert the malpractice by setting up the documentation as an integral part, inspired by [literate programming](http://literateprogramming.com). With the power of [Jupyter Book](https://jupyterbook.org), data practitioners have a way to share [Jupyter notebooks](https://jupyter.org) on [GitHub Pages](https://pages.github.com) in a standardized and effortless way. - -- **docs/bibliography.bib** - > A `bibliography` using the [BibTeX](https://www.bibtex.org/Format/) format. - -- **data/** - > Placeholder folder for data. Data is immutable. By default, the data folder is present but ignored from version control, in order to prevent files of being mistakenly versioned in the code repository. - -- **src/** - > Placeholder folder for source code. If Python, it is recommended the package is made pip-installable. - -- **notebooks/** - > Placeholder folder for [Jupyter notebooks](https://jupyter.org). Markdown files and Jupyter notebooks can be added to `docs/_toc.yml` (Table of Contents) to compose the *documentation*. - -- [Issues and Pull Requests GitHub templates](https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository) - > GitHub allows to customize how issues and pull requests are presented to the public. Custom templates encourage collaboration and maintainability. - -```{important} -*With flexibility comes great responsibility*. The template makes a few opiniated choices for the structure and code/documentation management of a project for what we envision to be most cases. However, even the best of the templates would never be perfect for the universe of cases out there. All in all, the template aims to encourage teams to start thinking and assimilate **collaborative coding**, **documentation**โ€‹, **enginerring**, **reproducibilityโ€‹** and **best practices** as an integral part of the project. *In a standardized way*. - -In this spirit, if the template is not for you or in case you have feedback, please consider [opening an issue](https://github.com/worldbank/template/issues) or [submitting a pull request](https://github.com/worldbank/template/pulls) to share your ideas and suggestions. Your contributions would be appreciated immensely. +```{shell} +pip install GOSTRocks ``` -## Benefits - -Project templates on GitHub are essential for streamlining the data science and collaboration processes, and they offer several key benefits: - -- ๐Ÿ› ๏ธ **Consistency and Best Practices:** Project templates encourage consistency in project structure, coding standards, and best practices. They provide a standardized starting point, ensuring that all team members follow the same guidelines and reduce the risk of introducing errors. - -- โณ **Time and Effort Savings:** Templates save time by eliminating the need to set up a project from scratch. Developers can quickly start working on their projects without the overhead of configuring the initial project structure, dependencies, or workflows. - -- ๐Ÿš€ **Faster Onboarding:** New team members or contributors can easily get up to speed by using project templates. It simplifies the onboarding process, allowing them to understand the project structure and development practices more quickly. - -- ๐ŸŽจ **Customization and Adaptability:** GitHub project templates can be customized to suit the specific needs of different types of projects or organizations. They serve as a foundation that can be adapted to meet unique requirements. - -- ๐Ÿค **Community Engagement:** Open-source projects can attract more contributors when they provide accessible project templates. These templates facilitate contributions by reducing the barriers to entry for potential collaborators. - -- ๐Ÿ”„ **Version Control Integration:** GitHub project templates are tightly integrated with Git version control. This makes it easier to manage changes, collaborate, and track the history of project configurations. - -- ๐Ÿ“– **Documentation and Guidance:** Templates often include documentation and guidance to help developers understand the project's structure and how to get started. This can include README files, code comments, and links to relevant resources. - -- ๐Ÿ” **Discoverability:** Templates are discoverable on GitHub, making it easy for developers to find and use project templates for their preferred programming languages, frameworks, and tools. This helps build a supportive ecosystem. - -- โœ๏ธ **Continual Improvement:** Project templates can evolve and improve over time as best practices, technology, and requirements change. This ensures that projects remain up to date and maintainable. - -In summary, GitHub project templates are valuable resources that enhance project management, development practices, and collaboration. They promote consistency, efficiency, and quality in software development, whether for individual projects, open-source contributions, or within organizational contexts. - -## Usage - -### Getting Started - -```{margin} โœจ Can't see the template ? -Please ensure you are logged in on [GitHub](https://github.com) and have permissions to create a repository. -``` - -1. **Create new repository from template** - - The template is a [GitHub template repository](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-repository-from-a-template); in other words, you can generate a new GitHub repository with the same files and folders to use as the starting point for your project. - - > ๐ŸŒŸ [Create new repository from **template**](https://github.com/worldbank/template/generate) - - ```{figure} docs/images/github-template.png - --- - --- - ``` - - Now, give your repository a name, choose the **visibility** (Public or Private) and click **Create repository from template**. - - ```{figure} docs/images/github-template-create.png - --- - --- - ``` - - *Voilร !* The repository has been created with the same files and folders of the template. - - ```{seealso} - For additional information, see the [GitHub documentation](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-repository-from-a-template) - ``` - -2. **Enable [GitHub Actions](https://github.com/features/actions) and [GitHub Pages](https://pages.github.com)** - - After creating the repository from the template, you will have to enable [GitHub Actions](https://github.com/features/actions) and [GitHub Pages](https://pages.github.com) to allow the [Jupyter Book](https://jupyterbook.org) to be built and published. - - To activate the workflow, please enable [GitHub Actions](https://github.com/features/actions) by going to the repository's settings (`Settings > Actions > General`), and selecting **read and write permissions** as shown below. - - ```{figure} docs/images/github-template-action-enable.png - --- - --- - ``` - - To publish, please enable [GitHub Pages](https://pages.github.com) by going to the repository's settings (`Settings > Pages`), and selecting to deploy from the `gh-pages` branch. - - ```{figure} docs/images/github-template-pages.png - --- - --- - ``` - - On the next push to `main`, the [Jupyter Book](https://jupyterbook.org) will be automatically built and published. You can check the progress on the `Actions` tab. - - ```{figure} docs/images/github-template-action.png - --- - --- - ``` - - ```{caution} - The *documentation* can be published from either *public* and *private* repositories. If publishing private content, please remember to carefully select the content to be made public and to abide by your organization's Data Privacy Policy. - ``` - -3. **Update configurations** - - The template comes with a default `docs/_config.yml` Jupyter Book configuration file. Remember to update it to reflect your project's name and details. +Future releases can be built from source, but pip will contain the most recent stable version (to be updated). - ```yaml - repository: - url: https://github.com/worldbank/template - branch: main - ``` +## Contributing - ```{seealso} - [Jupyter Book Configuration Reference](https://jupyterbook.org/en/stable/customize/config.html) - ``` - -4. **Review and update README files** - - The template comes with README files - including [this **README**](README) - that should provide anyone with the information about the first steps to use, learn and contribute to your project. Please **replace** and/or **repurpose** the files with instructions and detailed information about your project. - - > - **CODE_OF_CONDUCT** - > - **CONTRIBUTING** - > - **README** - > - Issues and Pull Requests GitHub templates - - ```{seealso} - [Awesome README](https://github.com/matiassingers/awesome-readme) - ``` - -5. **Choose a license** - - The template is licensed under the [**Mozilla Public License**](https://www.mozilla.org/en-US/MPL). A LICENSE is the document that guarantees the repository can be shared, modified and receive contributions. Otherwise, if no license is present, all rights are reserved. - -
- -**Congratulations!** You just created a beautiful home for your project. To access your project page, use (and share) the link as shown below. - -> ๐ŸŒŸ `https://.github.io/` - -For example, see this template as a live demo. - -> ๐ŸŒŸ [worldbank.github.io/template](http://worldbank.github.io/template) (Live Demo) - -### Adding Content - -The template is created as a [Jupyter Book](https://jupyterbook.org/intro.html) - an open-source project to build beautiful, publication-quality books and documents from computational content. Let's see below how to add, execute and publish new content for your project. - -#### Table of Contents - -When ready to publish the *documentation* on [GitHub Pages](https://pages.github.com/), all you need to do is edit the [table of contents](#table-of-contents) and add and/or update content you would like to display. [Jupyter Book](https://jupyterbook.org) supports content written as [Markdown](https://daringfireball.net/projects/markdown/), [Jupyter](https://jupyter.org) notebooks and [reStructuredText](https://docutils.sourceforge.io/rst.html) files and the `docs/_toc.yml` file controls the [table of contents](#table-of-contents) of your book. - -The template comes with the [table of contents](#table-of-contents) below as an example. - -```yaml - -format: jb-book -root: README - -parts: - -- caption: Documentation - numbered: True - chapters: - - file: notebooks/world-bank-api.ipynb -- caption: Additional Resources - chapters: - - url: - title: Development Data Partnership - - url: - title: World Bank DEC - - url: - title: World Bank DIME - -``` - -```{seealso} -[Jupyter Book Structure and organize content](https://jupyterbook.org/en/stable/basics/organize.html) -``` - -#### Dependencies - -The next step is ensure your code is maintainable, reliable and reproducible by including -any dependencies and requirements, such as packages, configurations, secrets (template) and additional instructions. - -The template suggests to use [conda](https://docs.conda.io/) (or [mamba](https://mamba.readthedocs.io/en/latest/)) as environment manager and, as [conventional](https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html), the environment is controlled by the `environment.yml` file. - -The `environment.yml` file is where you specify any packages available on the [Anaconda repository](https://anaconda.org) as well as from the Anaconda Cloud (including [conda-forge](https://conda-forge.org)) to install for your project. Ensure to include the pinned version of packages required by your project (including by Jupyter notebooks). - -```yaml -channels: - - conda-forge - - defaults -dependencies: - - python=3.9 - - bokeh=2.4.3 - - pandas=1.4.3 - - pip: - - requests==2.28.1 -``` - -To (re)create the environment on your installation of [conda](https://conda.io) via [anaconda](https://docs.anaconda.com/anaconda/install/), [miniconda](https://docs.conda.io/projects/continuumio-conda/en/latest/user-guide/install/) or preferably [miniforge](https://github.com/conda-forge/miniforge), you only need to pass the `environment.yml` file, which will install requirements and guarantee that whoever uses your code has the necessary packages (and correct versions). By default, the template uses [Python 3.9](https://www.python.org). - -```shell -conda env create -n -f environment.yml -``` - -In case your project uses Python, it is *strongly* recommended to distribute it as a [package](https://packaging.python.org/). - -```{important} -The template contains an example - the [datalab](https://github.com/worldbank/template/tree/main/src/datalab) Python package - and will automatically find and install any `src` packages as long as `pyproject.yml` is kept up-to-date. -``` - -```{seealso} -[Conda Managing Environments](https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html) -``` - -#### Jupyter Notebooks - -[Jupyter Notebooks](https://jupyter.org) can be beautifully rendered and downloaded from your book. By default, the template will render any files listed on the [table of contents](#table-of-contents) that have a notebook structure. The template comes with a Jupyter notebook example, `notebooks/world-bank-api.ipynb`, to illustrate. - -```{important} -Optionally, [Jupyter Book](https://jupyterbook.org) can execute notebooks during the build (on GitHub) and display **code outputs** and **interactive visualizations** as part of the *documentation* on the fly. In this case, Jupyter notebooks will be executed by [GitHub Actions](https://github.com/features/actions) during build on each commit to the `main` branch. Thus, it is important to include all [requirements and dependencies](#dependencies) in the repository. In case you would like to ignore a notebook, you can [exclude files from execution](https://jupyterbook.org/en/stable/content/execute.html#exclude-files-from-execution). -``` - -```{seealso} -[Jupyter Book Write executable content](https://jupyterbook.org/en/stable/content/executable/index.html) -``` +Please refer to the World Bank's Github [Contributing](docs/Contributing.md) guidelines. ## Code of Conduct @@ -259,4 +24,4 @@ The template maintains a [Code of Conduct](do ## License -The template is licensed under the [**Mozilla Public License**](https://www.mozilla.org/en-US/MPL). Remember to replace the [license](LICENSE) if necessary. If open source, [choose an open source license](https://choosealicense.com). +This project is licensed under the [**Mozilla Public License**](https://www.mozilla.org/en-US/MPL). diff --git a/build_commands.txt b/build_commands.txt new file mode 100644 index 0000000..574ae59 --- /dev/null +++ b/build_commands.txt @@ -0,0 +1,8 @@ +# Commit to github + +# Installation testing +conda create -n urban_test --file .\requirements.txt -c conda-forge +conda activate urban_test +conda install ipykernel +python -m ipykernel install --user --name=urban_test +pip install --no-build-isolation --no-deps . diff --git a/notebooks/AWS_Summarize.ipynb b/notebooks/AWS_Summarize.ipynb new file mode 100644 index 0000000..4114006 --- /dev/null +++ b/notebooks/AWS_Summarize.ipynb @@ -0,0 +1,346 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Summarize files and folders in AWS\n", + "\n", + "This notebook provides an example of how to list files in an AWS bucket (including a prefix search) and group according to folder definitions" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import sys, os, importlib\n", + "import rasterio, geojson, h3, boto3\n", + "\n", + "import pandas as pd\n", + "import geopandas as gpd\n", + "\n", + "from botocore.config import Config\n", + "from botocore import UNSIGNED" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Completed loop: 0\n", + "Completed loop: 1\n", + "Completed loop: 2\n", + "Completed loop: 3\n", + "Completed loop: 4\n", + "Completed loop: 5\n", + "Completed loop: 6\n", + "Completed loop: 7\n", + "Completed loop: 8\n", + "Completed loop: 9\n", + "Completed loop: 10\n", + "Completed loop: 11\n", + "Completed loop: 12\n", + "Completed loop: 13\n", + "Completed loop: 14\n", + "Completed loop: 15\n", + "Completed loop: 16\n", + "Completed loop: 17\n", + "Completed loop: 18\n", + "Completed loop: 19\n", + "Completed loop: 20\n", + "Completed loop: 21\n", + "Completed loop: 22\n", + "Completed loop: 23\n", + "Completed loop: 24\n", + "Completed loop: 25\n", + "Completed loop: 26\n", + "Completed loop: 27\n", + "Completed loop: 28\n", + "Completed loop: 29\n", + "Completed loop: 30\n", + "Completed loop: 31\n", + "Completed loop: 32\n", + "Completed loop: 33\n", + "Completed loop: 34\n", + "Completed loop: 35\n", + "Completed loop: 36\n", + "Completed loop: 37\n", + "Completed loop: 38\n", + "Completed loop: 39\n", + "Completed loop: 40\n", + "Completed loop: 41\n", + "Completed loop: 42\n", + "Completed loop: 43\n", + "Completed loop: 44\n", + "Completed loop: 45\n", + "Completed loop: 46\n", + "Completed loop: 47\n", + "Completed loop: 48\n", + "Completed loop: 49\n", + "Completed loop: 50\n", + "Completed loop: 51\n", + "Completed loop: 52\n", + "Completed loop: 53\n", + "Completed loop: 54\n", + "Completed loop: 55\n", + "Completed loop: 56\n", + "Completed loop: 57\n", + "Completed loop: 58\n", + "Completed loop: 59\n", + "Completed loop: 60\n", + "Completed loop: 61\n", + "Completed loop: 62\n", + "Completed loop: 63\n", + "Completed loop: 64\n", + "Completed loop: 65\n" + ] + } + ], + "source": [ + "bucket = 'wbg-geography01' \n", + "prefix = 'sylvera'\n", + "region = 'us-east-1'\n", + "s3client = boto3.client('s3', region_name=region)\n", + "\n", + "# Loop through the S3 bucket and get all the file keys\n", + "more_results = True\n", + "try:\n", + " del(token)\n", + "except:\n", + " pass\n", + "loops = 0\n", + "\n", + "all_res = []\n", + "while more_results:\n", + " print(f\"Completed loop: {loops}\")\n", + " if loops > 0:\n", + " objects = s3client.list_objects_v2(Bucket=bucket, ContinuationToken=token, Prefix=prefix)\n", + " else:\n", + " objects = s3client.list_objects_v2(Bucket=bucket)\n", + " more_results = objects['IsTruncated']\n", + " if more_results:\n", + " token = objects['NextContinuationToken']\n", + " loops += 1\n", + " for res in objects['Contents']:\n", + " all_res.append(res)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
KeyLastModifiedETagSizeStorageClass
0.DS_Store2020-09-24 18:15:42+00:00\"098b7ee247e2688d3c110358e95be940\"24580STANDARD
1AIS/2021-06-17 16:09:49+00:00\"bd752504006b667e1139c9383472e928\"0INTELLIGENT_TIERING
2AIS_outputs/205762000.geojson2021-11-30 23:13:40+00:00\"36406a0f5b1d20b5f734ef775feb8b39\"630475STANDARD
3AIS_outputs/219833000.geojson2021-11-30 23:13:40+00:00\"e049985ba5d6327f1aafb33e8e92707a\"355694STANDARD
4AIS_outputs/229380000.geojson2021-11-30 23:13:40+00:00\"fb6c2da55db0cf1e7022d7d04c8de236\"539934STANDARD
..................
65246sylvera/MSL/0007MZ/UAV-LS/GIL06/L3A/0007MZ_GIL...2022-12-27 12:13:45+00:00\"cc1d2ab954a43f1fda2902eb547703aa-4\"28143740STANDARD
65247sylvera/MSL/0007MZ/UAV-LS/GIL06/L3A/0007MZ_GIL...2022-12-27 12:13:44+00:00\"9fbaf7579c5c7ec7cc263bc161da743c-2\"14073598STANDARD
65248sylvera/MSL/0007MZ/UAV-LS/GIL06/L3A/0007MZ_GIL...2022-12-27 12:13:46+00:00\"9dfcc537eabdc7c09ea4fd687c024787\"1972843STANDARD
65249sylvera/MSL/0007MZ/UAV-LS/GIL06/L3B/0007MZ_GIL...2022-12-27 13:16:38+00:00\"0c2ad1ebb1ed02bf783a042d6bcc3308-84\"703036683STANDARD
65250sylvera/MSL/0007MZ/UAV-LS/GIL06/L4/0007MZ_GIL0...2022-12-27 18:16:51+00:00\"44a8c09c25d43c499568b28b85b1c0fe\"564814STANDARD
\n", + "

65251 rows ร— 5 columns

\n", + "
" + ], + "text/plain": [ + " Key \\\n", + "0 .DS_Store \n", + "1 AIS/ \n", + "2 AIS_outputs/205762000.geojson \n", + "3 AIS_outputs/219833000.geojson \n", + "4 AIS_outputs/229380000.geojson \n", + "... ... \n", + "65246 sylvera/MSL/0007MZ/UAV-LS/GIL06/L3A/0007MZ_GIL... \n", + "65247 sylvera/MSL/0007MZ/UAV-LS/GIL06/L3A/0007MZ_GIL... \n", + "65248 sylvera/MSL/0007MZ/UAV-LS/GIL06/L3A/0007MZ_GIL... \n", + "65249 sylvera/MSL/0007MZ/UAV-LS/GIL06/L3B/0007MZ_GIL... \n", + "65250 sylvera/MSL/0007MZ/UAV-LS/GIL06/L4/0007MZ_GIL0... \n", + "\n", + " LastModified ETag \\\n", + "0 2020-09-24 18:15:42+00:00 \"098b7ee247e2688d3c110358e95be940\" \n", + "1 2021-06-17 16:09:49+00:00 \"bd752504006b667e1139c9383472e928\" \n", + "2 2021-11-30 23:13:40+00:00 \"36406a0f5b1d20b5f734ef775feb8b39\" \n", + "3 2021-11-30 23:13:40+00:00 \"e049985ba5d6327f1aafb33e8e92707a\" \n", + "4 2021-11-30 23:13:40+00:00 \"fb6c2da55db0cf1e7022d7d04c8de236\" \n", + "... ... ... \n", + "65246 2022-12-27 12:13:45+00:00 \"cc1d2ab954a43f1fda2902eb547703aa-4\" \n", + "65247 2022-12-27 12:13:44+00:00 \"9fbaf7579c5c7ec7cc263bc161da743c-2\" \n", + "65248 2022-12-27 12:13:46+00:00 \"9dfcc537eabdc7c09ea4fd687c024787\" \n", + "65249 2022-12-27 13:16:38+00:00 \"0c2ad1ebb1ed02bf783a042d6bcc3308-84\" \n", + "65250 2022-12-27 18:16:51+00:00 \"44a8c09c25d43c499568b28b85b1c0fe\" \n", + "\n", + " Size StorageClass \n", + "0 24580 STANDARD \n", + "1 0 INTELLIGENT_TIERING \n", + "2 630475 STANDARD \n", + "3 355694 STANDARD \n", + "4 539934 STANDARD \n", + "... ... ... \n", + "65246 28143740 STANDARD \n", + "65247 14073598 STANDARD \n", + "65248 1972843 STANDARD \n", + "65249 703036683 STANDARD \n", + "65250 564814 STANDARD \n", + "\n", + "[65251 rows x 5 columns]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inD = pd.DataFrame(all_res)\n", + "inD['folder'] = inD['Key'].apply(lambda x: \"_\".join(x.split(\"/\")[:])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Earth Engine", + "language": "python", + "name": "ee" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/CREAT_FATHOM_VRTs.ipynb b/notebooks/CREAT_FATHOM_VRTs.ipynb new file mode 100644 index 0000000..6cb91fa --- /dev/null +++ b/notebooks/CREAT_FATHOM_VRTs.ipynb @@ -0,0 +1,2142 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "5a156f61", + "metadata": {}, + "outputs": [], + "source": [ + "import sys, os, boto3\n", + "from tqdm.notebooks import tqdm\n", + "\n", + "import pandas as pd\n", + "from osgeo import gdal" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "5d327aec", + "metadata": {}, + "outputs": [], + "source": [ + "in_file_list = '/home/wb411133/temp/fathom_files.csv'\n", + "\n", + "s3_bucket = 'wbg-geography01'\n", + "s3_prefix = 'FATHOM/v2023/'\n", + "out_prefix = 'FATHOM/vrts/'\n", + "\n", + "in_files = pd.read_csv(in_file_list)\n", + "s3 = boto3.resource('s3')\n", + "my_bucket = s3.Bucket(s3_bucket)\n", + "\n", + "return_period = '1000'\n", + "defended = 'DEFENDED'\n", + "\n", + "coastal_folder = f'GLOBAL-1ARCSEC-NW_OFFSET-1in{return_period}-COASTAL-{defended}-DEPTH-2020-PERCENTILE50-v3.0'\n", + "fluvial_folder = f'GLOBAL-1ARCSEC-NW_OFFSET-1in{return_period}-FLUVIAL-{defended}-DEPTH-2020-PERCENTILE50-v3.0'\n", + "pluvial_folder = f'GLOBAL-1ARCSEC-NW_OFFSET-1in{return_period}-PLUVIAL-{defended}-DEPTH-2020-PERCENTILE50-v3.0'" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "321e542a", + "metadata": {}, + "outputs": [], + "source": [ + "obj_count = 0\n", + "all_vals = []\n", + "\n", + "for obj in my_bucket.objects.filter(Prefix=os.path.join(s3_prefix, pluvial_folder)):\n", + " all_vals.append(os.path.join('s3://', s3_bucket, obj.key))\n", + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "af0c5ab2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['n00e135.tif',\n", + " 'n00w065.tif',\n", + " 'n00e007.tif',\n", + " 'n00e006.tif',\n", + " 'n00w082.tif',\n", + " 'n00e008.tif',\n", + " 'n00w078.tif',\n", + " 'n00e117.tif',\n", + " 'n00w074.tif',\n", + " 'n00e112.tif',\n", + " 'n00e111.tif',\n", + " 'n00e110.tif',\n", + " 'n00e012.tif',\n", + " 'n00w080.tif',\n", + " 'n00e123.tif',\n", + " 'n00e124.tif',\n", + " 'n00w071.tif',\n", + " 'n00w092.tif',\n", + " 'n00e009.tif',\n", + " 'n00e011.tif',\n", + " 'n00e010.tif',\n", + " 'n00e013.tif',\n", + " 'n00e014.tif',\n", + " 'n00e015.tif',\n", + " 'n00e113.tif',\n", + " 'n00e114.tif',\n", + " 'n00e116.tif',\n", + " 'n00e119.tif',\n", + " 'n00w079.tif',\n", + " 'n00e134.tif',\n", + " 'n00w067.tif',\n", + " 'n00e022.tif',\n", + " 'n00e017.tif',\n", + " 'n00e025.tif',\n", + " 'n00e018.tif',\n", + " 'n00e016.tif',\n", + " 'n00e024.tif',\n", + " 'n00e021.tif',\n", + " 'n00e128.tif',\n", + " 'n01e010.tif',\n", + " 'n00e019.tif',\n", + " 'n00e029.tif',\n", + " 'n00e126.tif',\n", + " 'n00w070.tif',\n", + " 'n00e027.tif',\n", + " 'n00e023.tif',\n", + " 'n00w178.tif',\n", + " 'n00e028.tif',\n", + " 'n00e020.tif',\n", + " 'n00w089.tif',\n", + " 'n00e030.tif',\n", + " 'n03e096.tif',\n", + " 'n00e026.tif',\n", + " 'n00e032.tif',\n", + " 'n00e127.tif',\n", + " 'n00w069.tif',\n", + " 'n00e034.tif',\n", + " 'n00e033.tif',\n", + " 'n00e129.tif',\n", + " 'n00w066.tif',\n", + " 'n00e035.tif',\n", + " 'n00w090.tif',\n", + " 'n00e037.tif',\n", + " 'n00e031.tif',\n", + " 'n00w053.tif',\n", + " 'n00w064.tif',\n", + " 'n00e038.tif',\n", + " 'n00e036.tif',\n", + " 'n00w081.tif',\n", + " 'n00e039.tif',\n", + " 'n00w076.tif',\n", + " 'n00e045.tif',\n", + " 'n00w068.tif',\n", + " 'n00e044.tif',\n", + " 'n00w158.tif',\n", + " 'n00e072.tif',\n", + " 'n00w177.tif',\n", + " 'n00e097.tif',\n", + " 'n00w157.tif',\n", + " 'n00e043.tif',\n", + " 'n00w077.tif',\n", + " 'n00e098.tif',\n", + " 'n00e122.tif',\n", + " 'n00e121.tif',\n", + " 'n00e130.tif',\n", + " 'n00w060.tif',\n", + " 'n01e008.tif',\n", + " 'n00e099.tif',\n", + " 'n00w075.tif',\n", + " 'n00e096.tif',\n", + " 'n01e006.tif',\n", + " 'n00e073.tif',\n", + " 'n00w091.tif',\n", + " 'n00e100.tif',\n", + " 'n01e007.tif',\n", + " 'n00e102.tif',\n", + " 'n00w049.tif',\n", + " 'n00w063.tif',\n", + " 'n00e105.tif',\n", + " 'n00e042.tif',\n", + " 'n01e009.tif',\n", + " 'n00e104.tif',\n", + " 'n01e012.tif',\n", + " 'n00e106.tif',\n", + " 'n00e041.tif',\n", + " 'n01e015.tif',\n", + " 'n00e103.tif',\n", + " 'n00e101.tif',\n", + " 'n00e040.tif',\n", + " 'n01e011.tif',\n", + " 'n00e107.tif',\n", + " 'n01e014.tif',\n", + " 'n00e109.tif',\n", + " 'n01e013.tif',\n", + " 'n00e108.tif',\n", + " 'n01e016.tif',\n", + " 'n00e115.tif',\n", + " 'n00w057.tif',\n", + " 'n00w072.tif',\n", + " 'n00e118.tif',\n", + " 'n01e019.tif',\n", + " 'n00e120.tif',\n", + " 'n00e125.tif',\n", + " 'n00e172.tif',\n", + " 'n01e018.tif',\n", + " 'n00e154.tif',\n", + " 'n01e022.tif',\n", + " 'n00e173.tif',\n", + " 'n00w061.tif',\n", + " 'n00w073.tif',\n", + " 'n00w051.tif',\n", + " 'n00e155.tif',\n", + " 'n01e020.tif',\n", + " 'n00w050.tif',\n", + " 'n01e023.tif',\n", + " 'n00e131.tif',\n", + " 'n01e021.tif',\n", + " 'n00w054.tif',\n", + " 'n01e027.tif',\n", + " 'n00w052.tif',\n", + " 'n01e026.tif',\n", + " 'n00w055.tif',\n", + " 'n01e024.tif',\n", + " 'n00w056.tif',\n", + " 'n00w058.tif',\n", + " 'n00w059.tif',\n", + " 'n01e017.tif',\n", + " 'n01e025.tif',\n", + " 'n01w062.tif',\n", + " 'n01e029.tif',\n", + " 'n01w082.tif',\n", + " 'n01e028.tif',\n", + " 'n01w078.tif',\n", + " 'n01e031.tif',\n", + " 'n01w089.tif',\n", + " 'n01e033.tif',\n", + " 'n01w091.tif',\n", + " 'n01e034.tif',\n", + " 'n01w092.tif',\n", + " 'n01e030.tif',\n", + " 'n01w177.tif',\n", + " 'n01e035.tif',\n", + " 'n01w090.tif',\n", + " 'n01e036.tif',\n", + " 'n01w076.tif',\n", + " 'n01e040.tif',\n", + " 'n01w157.tif',\n", + " 'n01e032.tif',\n", + " 'n01w063.tif',\n", + " 'n01w071.tif',\n", + " 'n01e039.tif',\n", + " 'n02e008.tif',\n", + " 'n01e037.tif',\n", + " 'n01w158.tif',\n", + " 'n01e042.tif',\n", + " 'n01w054.tif',\n", + " 'n01w081.tif',\n", + " 'n01e072.tif',\n", + " 'n01w058.tif',\n", + " 'n01w060.tif',\n", + " 'n01w053.tif',\n", + " 'n02e047.tif',\n", + " 'n01e045.tif',\n", + " 'n01e038.tif',\n", + " 'n01w178.tif',\n", + " 'n01e096.tif',\n", + " 'n01e043.tif',\n", + " 'n01w079.tif',\n", + " 'n01e044.tif',\n", + " 'n02e009.tif',\n", + " 'n01e098.tif',\n", + " 'n01e073.tif',\n", + " 'n01e041.tif',\n", + " 'n02e010.tif',\n", + " 'n01e099.tif',\n", + " 'n01w064.tif',\n", + " 'n01w072.tif',\n", + " 'n01e102.tif',\n", + " 'n01e106.tif',\n", + " 'n01w069.tif',\n", + " 'n02e019.tif',\n", + " 'n01e105.tif',\n", + " 'n02e012.tif',\n", + " 'n01e101.tif',\n", + " 'n02e013.tif',\n", + " 'n01e104.tif',\n", + " 'n01e108.tif',\n", + " 'n02e014.tif',\n", + " 'n01e097.tif',\n", + " 'n02e015.tif',\n", + " 'n01e103.tif',\n", + " 'n01w066.tif',\n", + " 'n01w080.tif',\n", + " 'n01e107.tif',\n", + " 'n02e016.tif',\n", + " 'n01e110.tif',\n", + " 'n02e022.tif',\n", + " 'n01e111.tif',\n", + " 'n02e011.tif',\n", + " 'n01e114.tif',\n", + " 'n02e017.tif',\n", + " 'n01e115.tif',\n", + " 'n01w065.tif',\n", + " 'n01w073.tif',\n", + " 'n01e109.tif',\n", + " 'n01e116.tif',\n", + " 'n01e100.tif',\n", + " 'n02e020.tif',\n", + " 'n01e117.tif',\n", + " 'n02e025.tif',\n", + " 'n01e119.tif',\n", + " 'n02e024.tif',\n", + " 'n01e118.tif',\n", + " 'n02e023.tif',\n", + " 'n01e122.tif',\n", + " 'n02e021.tif',\n", + " 'n01e120.tif',\n", + " 'n02e018.tif',\n", + " 'n01w068.tif',\n", + " 'n01w067.tif',\n", + " 'n01e123.tif',\n", + " 'n01e124.tif',\n", + " 'n01e125.tif',\n", + " 'n01w070.tif',\n", + " 'n01w075.tif',\n", + " 'n01e113.tif',\n", + " 'n01e121.tif',\n", + " 'n02e029.tif',\n", + " 'n01e112.tif',\n", + " 'n02e026.tif',\n", + " 'n01e130.tif',\n", + " 'n02e030.tif',\n", + " 'n01e127.tif',\n", + " 'n02e032.tif',\n", + " 'n01e128.tif',\n", + " 'n02e036.tif',\n", + " 'n01e129.tif',\n", + " 'n02e027.tif',\n", + " 'n01e135.tif',\n", + " 'n02e034.tif',\n", + " 'n01e134.tif',\n", + " 'n02e033.tif',\n", + " 'n01e154.tif',\n", + " 'n02e031.tif',\n", + " 'n01e131.tif',\n", + " 'n02e035.tif',\n", + " 'n01e126.tif',\n", + " 'n02e040.tif',\n", + " 'n01e172.tif',\n", + " 'n02e037.tif',\n", + " 'n01e155.tif',\n", + " 'n02e038.tif',\n", + " 'n01w049.tif',\n", + " 'n02e039.tif',\n", + " 'n01e173.tif',\n", + " 'n02e042.tif',\n", + " 'n01w050.tif',\n", + " 'n02e043.tif',\n", + " 'n01w051.tif',\n", + " 'n02e028.tif',\n", + " 'n01w055.tif',\n", + " 'n02e046.tif',\n", + " 'n01w052.tif',\n", + " 'n02e112.tif',\n", + " 'n01w056.tif',\n", + " 'n02e072.tif',\n", + " 'n01w057.tif',\n", + " 'n02e044.tif',\n", + " 'n01w059.tif',\n", + " 'n01w061.tif',\n", + " 'n01w074.tif',\n", + " 'n01w077.tif',\n", + " 'n02e073.tif',\n", + " 'n02e094.tif',\n", + " 'n02e041.tif',\n", + " 'n02e095.tif',\n", + " 'n02e096.tif',\n", + " 'n03e041.tif',\n", + " 'n02e097.tif',\n", + " 'n03e042.tif',\n", + " 'n02e099.tif',\n", + " 'n03e043.tif',\n", + " 'n02e100.tif',\n", + " 'n03e017.tif',\n", + " 'n03e030.tif',\n", + " 'n02e104.tif',\n", + " 'n02e098.tif',\n", + " 'n03e072.tif',\n", + " 'n02e105.tif',\n", + " 'n02e045.tif',\n", + " 'n02e106.tif',\n", + " 'n02e103.tif',\n", + " 'n02e107.tif',\n", + " 'n02e108.tif',\n", + " 'n02e109.tif',\n", + " 'n02e110.tif',\n", + " 'n03e044.tif',\n", + " 'n02e113.tif',\n", + " 'n03e016.tif',\n", + " 'n03e031.tif',\n", + " 'n02e101.tif',\n", + " 'n02e114.tif',\n", + " 'n03e047.tif',\n", + " 'n02e115.tif',\n", + " 'n03e095.tif',\n", + " 'n02e118.tif',\n", + " 'n03e073.tif',\n", + " 'n02e116.tif',\n", + " 'n03e046.tif',\n", + " 'n02e119.tif',\n", + " 'n03e019.tif',\n", + " 'n03e032.tif',\n", + " 'n02e125.tif',\n", + " 'n02e126.tif',\n", + " 'n03e021.tif',\n", + " 'n03e033.tif',\n", + " 'n02e127.tif',\n", + " 'n03e094.tif',\n", + " 'n02e124.tif',\n", + " 'n03e040.tif',\n", + " 'n02e128.tif',\n", + " 'n03e097.tif',\n", + " 'n02e102.tif',\n", + " 'n03e101.tif',\n", + " 'n02e117.tif',\n", + " 'n02e131.tif',\n", + " 'n03e045.tif',\n", + " 'n02e130.tif',\n", + " 'n03e103.tif',\n", + " 'n02e155.tif',\n", + " 'n03e023.tif',\n", + " 'n03e034.tif',\n", + " 'n02e173.tif',\n", + " 'n02e172.tif',\n", + " 'n03e099.tif',\n", + " 'n02e129.tif',\n", + " 'n03e105.tif',\n", + " 'n02w051.tif',\n", + " 'n03e106.tif',\n", + " 'n02e154.tif',\n", + " 'n03e107.tif',\n", + " 'n02w052.tif',\n", + " 'n03e100.tif',\n", + " 'n02w054.tif',\n", + " 'n03w075.tif',\n", + " 'n02w055.tif',\n", + " 'n03e108.tif',\n", + " 'n02w057.tif',\n", + " 'n03e110.tif',\n", + " 'n02w058.tif',\n", + " 'n03e104.tif',\n", + " 'n02w059.tif',\n", + " 'n03e102.tif',\n", + " 'n02w053.tif',\n", + " 'n03e020.tif',\n", + " 'n03e035.tif',\n", + " 'n02w061.tif',\n", + " 'n02w060.tif',\n", + " 'n03e024.tif',\n", + " 'n03e037.tif',\n", + " 'n02w056.tif',\n", + " 'n02w063.tif',\n", + " 'n03e022.tif',\n", + " 'n03e036.tif',\n", + " 'n02w064.tif',\n", + " 'n03e109.tif',\n", + " 'n02w065.tif',\n", + " 'n02e111.tif',\n", + " 'n02w160.tif',\n", + " 'n02w079.tif',\n", + " 'n03e018.tif',\n", + " 'n03e027.tif',\n", + " 'n03e112.tif',\n", + " 'n02w062.tif',\n", + " 'n02w069.tif',\n", + " 'n03e113.tif',\n", + " 'n02w068.tif',\n", + " 'n03e118.tif',\n", + " 'n02w070.tif',\n", + " 'n02w067.tif',\n", + " 'n02w066.tif',\n", + " 'n03e172.tif',\n", + " 'n02w072.tif',\n", + " 'n03e119.tif',\n", + " 'n02w071.tif',\n", + " 'n03e025.tif',\n", + " 'n03e039.tif',\n", + " 'n02w082.tif',\n", + " 'n03e116.tif',\n", + " 'n02w077.tif',\n", + " 'n02w076.tif',\n", + " 'n03e114.tif',\n", + " 'n02w075.tif',\n", + " 'n03e015.tif',\n", + " 'n03e038.tif',\n", + " 'n02w157.tif',\n", + " 'n03e115.tif',\n", + " 'n02w078.tif',\n", + " 'n03e125.tif',\n", + " 'n02w081.tif',\n", + " 'n02w073.tif',\n", + " 'n03e111.tif',\n", + " 'n03e014.tif',\n", + " 'n03e013.tif',\n", + " 'n03e028.tif',\n", + " 'n03e127.tif',\n", + " 'n02w158.tif',\n", + " 'n03e008.tif',\n", + " 'n02w159.tif',\n", + " 'n03e124.tif',\n", + " 'n02w074.tif',\n", + " 'n03e010.tif',\n", + " 'n03e026.tif',\n", + " 'n00w062.tif',\n", + " 'n03e009.tif',\n", + " 'n02w080.tif',\n", + " 'n03e011.tif',\n", + " 'n03e012.tif',\n", + " 'n03e029.tif',\n", + " 'n03e117.tif',\n", + " 'n03e126.tif',\n", + " 'n03e128.tif',\n", + " 'n03e129.tif',\n", + " 'n04e107.tif',\n", + " 'n03e154.tif',\n", + " 'n04e103.tif',\n", + " 'n03e130.tif',\n", + " 'n04e038.tif',\n", + " 'n04e081.tif',\n", + " 'n03e131.tif',\n", + " 'n03w051.tif',\n", + " 'n04e108.tif',\n", + " 'n03w052.tif',\n", + " 'n04e109.tif',\n", + " 'n03e155.tif',\n", + " 'n04e112.tif',\n", + " 'n03e173.tif',\n", + " 'n04e115.tif',\n", + " 'n03w056.tif',\n", + " 'n04e040.tif',\n", + " 'n04e080.tif',\n", + " 'n03w054.tif',\n", + " 'n03w053.tif',\n", + " 'n04e113.tif',\n", + " 'n03w055.tif',\n", + " 'n04e120.tif',\n", + " 'n03w057.tif',\n", + " 'n04e117.tif',\n", + " 'n03w059.tif',\n", + " 'n04e121.tif',\n", + " 'n03w058.tif',\n", + " 'n04e036.tif',\n", + " 'n04e094.tif',\n", + " 'n03w061.tif',\n", + " 'n04e116.tif',\n", + " 'n03w060.tif',\n", + " 'n03w062.tif',\n", + " 'n04e118.tif',\n", + " 'n03w064.tif',\n", + " 'n04e119.tif',\n", + " 'n03w063.tif',\n", + " 'n04e044.tif',\n", + " 'n04e095.tif',\n", + " 'n03w065.tif',\n", + " 'n04e114.tif',\n", + " 'n03w066.tif',\n", + " 'n03w067.tif',\n", + " 'n03e098.tif',\n", + " 'n04e124.tif',\n", + " 'n03w071.tif',\n", + " 'n04e042.tif',\n", + " 'n04e097.tif',\n", + " 'n03w074.tif',\n", + " 'n04e126.tif',\n", + " 'n03w076.tif',\n", + " 'n04e127.tif',\n", + " 'n03w070.tif',\n", + " 'n04e152.tif',\n", + " 'n03w079.tif',\n", + " 'n03w068.tif',\n", + " 'n04e043.tif',\n", + " 'n04e099.tif',\n", + " 'n03w080.tif',\n", + " 'n03w077.tif',\n", + " 'n04e130.tif',\n", + " 'n03w072.tif',\n", + " 'n04e048.tif',\n", + " 'n04e106.tif',\n", + " 'n03w082.tif',\n", + " 'n04e132.tif',\n", + " 'n03w158.tif',\n", + " 'n04e045.tif',\n", + " 'n04e100.tif',\n", + " 'n03w081.tif',\n", + " 'n03w157.tif',\n", + " 'n04e131.tif',\n", + " 'n03w078.tif',\n", + " 'n04e133.tif',\n", + " 'n03w159.tif',\n", + " 'n04e156.tif',\n", + " 'n04e000.tif',\n", + " 'n03w069.tif',\n", + " 'n04e157.tif',\n", + " 'n03w160.tif',\n", + " 'n04e169.tif',\n", + " 'n04e001.tif',\n", + " 'n04e041.tif',\n", + " 'n04e006.tif',\n", + " 'n03w073.tif',\n", + " 'n04e004.tif',\n", + " 'n04e162.tif',\n", + " 'n04e008.tif',\n", + " 'n04e153.tif',\n", + " 'n04e009.tif',\n", + " 'n04e168.tif',\n", + " 'n04e005.tif',\n", + " 'n04e096.tif',\n", + " 'n04e102.tif',\n", + " 'n04e010.tif',\n", + " 'n04e007.tif',\n", + " 'n04e172.tif',\n", + " 'n04e017.tif',\n", + " 'n04e173.tif',\n", + " 'n04e011.tif',\n", + " 'n04e125.tif',\n", + " 'n04w064.tif',\n", + " 'n04e013.tif',\n", + " 'n04w001.tif',\n", + " 'n04e015.tif',\n", + " 'n04e163.tif',\n", + " 'n04e012.tif',\n", + " 'n04e072.tif',\n", + " 'n04e101.tif',\n", + " 'n04e019.tif',\n", + " 'n04e018.tif',\n", + " 'n04e030.tif',\n", + " 'n04w005.tif',\n", + " 'n04e027.tif',\n", + " 'n04e032.tif',\n", + " 'n04e029.tif',\n", + " 'n04w004.tif',\n", + " 'n04e037.tif',\n", + " 'n04e034.tif',\n", + " 'n04e047.tif',\n", + " 'n04w002.tif',\n", + " 'n04e016.tif',\n", + " 'n04e024.tif',\n", + " 'n04e020.tif',\n", + " 'n04e025.tif',\n", + " 'n04e021.tif',\n", + " 'n04e023.tif',\n", + " 'n04e014.tif',\n", + " 'n04e022.tif',\n", + " 'n04w007.tif',\n", + " 'n04e026.tif',\n", + " 'n04e073.tif',\n", + " 'n04e098.tif',\n", + " 'n04e028.tif',\n", + " 'n04e031.tif',\n", + " 'n04e033.tif',\n", + " 'n04w006.tif',\n", + " 'n04e035.tif',\n", + " 'n04w003.tif',\n", + " 'n04e039.tif',\n", + " 'n04e049.tif',\n", + " 'n04e046.tif',\n", + " 'n04w010.tif',\n", + " 'n04w008.tif',\n", + " 'n04w009.tif',\n", + " 'n04w011.tif',\n", + " 'n04w051.tif',\n", + " 'n04w012.tif',\n", + " 'n05e119.tif',\n", + " 'n04w054.tif',\n", + " 'n05e125.tif',\n", + " 'n04w056.tif',\n", + " 'n05e124.tif',\n", + " 'n04w055.tif',\n", + " 'n05e046.tif',\n", + " 'n05e100.tif',\n", + " 'n04w059.tif',\n", + " 'n04w057.tif',\n", + " 'n05e114.tif',\n", + " 'n04w053.tif',\n", + " 'n05e102.tif',\n", + " 'n04w058.tif',\n", + " 'n05e116.tif',\n", + " 'n04w061.tif',\n", + " 'n05e115.tif',\n", + " 'n04w060.tif',\n", + " 'n04w052.tif',\n", + " 'n05e121.tif',\n", + " 'n04w062.tif',\n", + " 'n05e127.tif',\n", + " 'n04w063.tif',\n", + " 'n05e130.tif',\n", + " 'n04w065.tif',\n", + " 'n05e133.tif',\n", + " 'n04w066.tif',\n", + " 'n05e131.tif',\n", + " 'n04w070.tif',\n", + " 'n05e042.tif',\n", + " 'n05e132.tif',\n", + " 'n05e041.tif',\n", + " 'n05e030.tif',\n", + " 'n05w055.tif',\n", + " 'n04w076.tif',\n", + " 'n05e048.tif',\n", + " 'n05e101.tif',\n", + " 'n04w075.tif',\n", + " 'n05e072.tif',\n", + " 'n05e106.tif',\n", + " 'n04w074.tif',\n", + " 'n04w069.tif',\n", + " 'n05e152.tif',\n", + " 'n04w078.tif',\n", + " 'n04w067.tif',\n", + " 'n04w068.tif',\n", + " 'n05e043.tif',\n", + " 'n05e094.tif',\n", + " 'n04w081.tif',\n", + " 'n05e157.tif',\n", + " 'n04w082.tif',\n", + " 'n04w073.tif',\n", + " 'n05e120.tif',\n", + " 'n04w161.tif',\n", + " 'n05e081.tif',\n", + " 'n05e108.tif',\n", + " 'n04w162.tif',\n", + " 'n04w077.tif',\n", + " 'n04w072.tif',\n", + " 'n05e153.tif',\n", + " 'n04w164.tif',\n", + " 'n05e162.tif',\n", + " 'n04w163.tif',\n", + " 'n05e168.tif',\n", + " 'n05e008.tif',\n", + " 'n05e163.tif',\n", + " 'n05e000.tif',\n", + " 'n04w071.tif',\n", + " 'n05e173.tif',\n", + " 'n05e007.tif',\n", + " 'n05w001.tif',\n", + " 'n05e004.tif',\n", + " 'n05e044.tif',\n", + " 'n05e029.tif',\n", + " 'n05e009.tif',\n", + " 'n05e126.tif',\n", + " 'n05e001.tif',\n", + " 'n05e013.tif',\n", + " 'n05e169.tif',\n", + " 'n05e012.tif',\n", + " 'n05e073.tif',\n", + " 'n05e109.tif',\n", + " 'n05e010.tif',\n", + " 'n05e080.tif',\n", + " 'n05e103.tif',\n", + " 'n05e016.tif',\n", + " 'n05e019.tif',\n", + " 'n05w004.tif',\n", + " 'n05e018.tif',\n", + " 'n05e172.tif',\n", + " 'n05e020.tif',\n", + " 'n05e045.tif',\n", + " 'n05e112.tif',\n", + " 'n05w008.tif',\n", + " 'n05w058.tif',\n", + " 'n05e022.tif',\n", + " 'n05e021.tif',\n", + " 'n05e096.tif',\n", + " 'n05e011.tif',\n", + " 'n05e006.tif',\n", + " 'n05w002.tif',\n", + " 'n05e024.tif',\n", + " 'n05w006.tif',\n", + " 'n05e026.tif',\n", + " 'n05w009.tif',\n", + " 'n05e027.tif',\n", + " 'n05w005.tif',\n", + " 'n05e015.tif',\n", + " 'n05e095.tif',\n", + " 'n05e113.tif',\n", + " 'n05e023.tif',\n", + " 'n05e028.tif',\n", + " 'n05e156.tif',\n", + " 'n05e025.tif',\n", + " 'n05e117.tif',\n", + " 'n05e031.tif',\n", + " 'n05w012.tif',\n", + " 'n05e034.tif',\n", + " 'n05e098.tif',\n", + " 'n05e107.tif',\n", + " 'n05e035.tif',\n", + " 'n05w010.tif',\n", + " 'n05e037.tif',\n", + " 'n05e099.tif',\n", + " 'n05e047.tif',\n", + " 'n05e036.tif',\n", + " 'n05w051.tif',\n", + " 'n05e039.tif',\n", + " 'n05e118.tif',\n", + " 'n05e038.tif',\n", + " 'n05e032.tif',\n", + " 'n05w003.tif',\n", + " 'n05e040.tif',\n", + " 'n05w053.tif',\n", + " 'n05e017.tif',\n", + " 'n05e033.tif',\n", + " 'n05w011.tif',\n", + " 'n05e005.tif',\n", + " 'n05e014.tif',\n", + " 'n05e049.tif',\n", + " 'n05e097.tif',\n", + " 'n05w060.tif',\n", + " 'n06e035.tif',\n", + " 'n06e047.tif',\n", + " 'n05w059.tif',\n", + " 'n06e119.tif',\n", + " 'n05w052.tif',\n", + " 'n06e116.tif',\n", + " 'n05w063.tif',\n", + " 'n06e123.tif',\n", + " 'n05w062.tif',\n", + " 'n06e078.tif',\n", + " 'n06e094.tif',\n", + " 'n05w007.tif',\n", + " 'n06e125.tif',\n", + " 'n05w066.tif',\n", + " 'n06e072.tif',\n", + " 'n06e103.tif',\n", + " 'n05w069.tif',\n", + " 'n05w068.tif',\n", + " 'n06e101.tif',\n", + " 'n05w064.tif',\n", + " 'n06e124.tif',\n", + " 'n05w070.tif',\n", + " 'n06e134.tif',\n", + " 'n05w054.tif',\n", + " 'n05w057.tif',\n", + " 'n06e046.tif',\n", + " 'n06e112.tif',\n", + " 'n05w061.tif',\n", + " 'n06e092.tif',\n", + " 'n06e113.tif',\n", + " 'n05w081.tif',\n", + " 'n06e135.tif',\n", + " 'n05w077.tif',\n", + " 'n06e143.tif',\n", + " 'n05w078.tif',\n", + " 'n05w071.tif',\n", + " 'n06e127.tif',\n", + " 'n05w065.tif',\n", + " 'n06e142.tif',\n", + " 'n05w161.tif',\n", + " 'n06e045.tif',\n", + " 'n06e102.tif',\n", + " 'n05w067.tif',\n", + " 'n05w074.tif',\n", + " 'n06e145.tif',\n", + " 'n05w056.tif',\n", + " 'n05w162.tif',\n", + " 'n05w072.tif',\n", + " 'n06e118.tif',\n", + " 'n06e000.tif',\n", + " 'n06e043.tif',\n", + " 'n06e114.tif',\n", + " 'n05w076.tif',\n", + " 'n05w075.tif',\n", + " 'n06e144.tif',\n", + " 'n06e001.tif',\n", + " 'n06e079.tif',\n", + " 'n06e099.tif',\n", + " 'n06e002.tif',\n", + " 'n05w163.tif',\n", + " 'n06e147.tif',\n", + " 'n06e003.tif',\n", + " 'n06e122.tif',\n", + " 'n06e004.tif',\n", + " 'n06e146.tif',\n", + " 'n06e005.tif',\n", + " 'n06e049.tif',\n", + " 'n06e115.tif',\n", + " 'n05w082.tif',\n", + " 'n06e007.tif',\n", + " 'n06e148.tif',\n", + " 'n05w073.tif',\n", + " 'n06e153.tif',\n", + " 'n06e009.tif',\n", + " 'n06e044.tif',\n", + " 'n06e048.tif',\n", + " 'n06e080.tif',\n", + " 'n06w008.tif',\n", + " 'n06e011.tif',\n", + " 'n06e033.tif',\n", + " 'n06e117.tif',\n", + " 'n06e014.tif',\n", + " 'n06e008.tif',\n", + " 'n06e151.tif',\n", + " 'n06e016.tif',\n", + " 'n06e149.tif',\n", + " 'n06e018.tif',\n", + " 'n06e012.tif',\n", + " 'n06e150.tif',\n", + " 'n06e010.tif',\n", + " 'n06e006.tif',\n", + " 'n06e154.tif',\n", + " 'n06e019.tif',\n", + " 'n06e155.tif',\n", + " 'n06e017.tif',\n", + " 'n06e152.tif',\n", + " 'n06e021.tif',\n", + " 'n06e073.tif',\n", + " 'n06e015.tif',\n", + " 'n06e156.tif',\n", + " 'n06e023.tif',\n", + " 'n06e161.tif',\n", + " 'n06e025.tif',\n", + " 'n06e168.tif',\n", + " 'n06e020.tif',\n", + " 'n06e158.tif',\n", + " 'n06e028.tif',\n", + " 'n06e081.tif',\n", + " 'n06e100.tif',\n", + " 'n06e027.tif',\n", + " 'n06e171.tif',\n", + " 'n06e029.tif',\n", + " 'n06e013.tif',\n", + " 'n06e126.tif',\n", + " 'n06e095.tif',\n", + " 'n06e120.tif',\n", + " 'n06e022.tif',\n", + " 'n06e098.tif',\n", + " 'n06e121.tif',\n", + " 'n06e026.tif',\n", + " 'n06e170.tif',\n", + " 'n06e037.tif',\n", + " 'n06e030.tif',\n", + " 'n06e159.tif',\n", + " 'n06e036.tif',\n", + " 'n06e157.tif',\n", + " 'n06e034.tif',\n", + " 'n06w002.tif',\n", + " 'n06e038.tif',\n", + " 'n06e032.tif',\n", + " 'n06w004.tif',\n", + " 'n06e039.tif',\n", + " 'n06e031.tif',\n", + " 'n06w056.tif',\n", + " 'n05w164.tif',\n", + " 'n06w003.tif',\n", + " 'n06e041.tif',\n", + " 'n06w009.tif',\n", + " 'n06e042.tif',\n", + " 'n06w060.tif',\n", + " 'n06e040.tif',\n", + " 'n06w006.tif',\n", + " 'n06e024.tif',\n", + " 'n06e093.tif',\n", + " 'n06w007.tif',\n", + " 'n06w001.tif',\n", + " 'n07e115.tif',\n", + " 'n06w012.tif',\n", + " 'n07e112.tif',\n", + " 'n06e169.tif',\n", + " 'n06w005.tif',\n", + " 'n07e046.tif',\n", + " 'n06w057.tif',\n", + " 'n07e121.tif',\n", + " 'n07e032.tif',\n", + " 'n07e025.tif',\n", + " 'n06w055.tif',\n", + " 'n06e160.tif',\n", + " 'n07e113.tif',\n", + " 'n06w014.tif',\n", + " 'n06w013.tif',\n", + " 'n06w011.tif',\n", + " 'n07e116.tif',\n", + " 'n06w058.tif',\n", + " 'n07e118.tif',\n", + " 'n06w059.tif',\n", + " 'n06e173.tif',\n", + " 'n07e120.tif',\n", + " 'n06w062.tif',\n", + " 'n07e094.tif',\n", + " 'n06w064.tif',\n", + " 'n07e049.tif',\n", + " 'n07e030.tif',\n", + " 'n06w067.tif',\n", + " 'n06w065.tif',\n", + " 'n06w061.tif',\n", + " 'n07e098.tif',\n", + " 'n06e172.tif',\n", + " 'n07e043.tif',\n", + " 'n07e041.tif',\n", + " 'n07e028.tif',\n", + " 'n07e173.tif',\n", + " 'n06w010.tif',\n", + " 'n06w073.tif',\n", + " 'n07e124.tif',\n", + " 'n06w068.tif',\n", + " 'n06w076.tif',\n", + " 'n06w074.tif',\n", + " 'n06w069.tif',\n", + " 'n07e114.tif',\n", + " 'n06w075.tif',\n", + " 'n06w079.tif',\n", + " 'n07e134.tif',\n", + " 'n06w080.tif',\n", + " 'n07e135.tif',\n", + " 'n06w077.tif',\n", + " 'n06w072.tif',\n", + " 'n07e072.tif',\n", + " 'n07e031.tif',\n", + " 'n06w078.tif',\n", + " 'n07e125.tif',\n", + " 'n06w082.tif',\n", + " 'n07e142.tif',\n", + " 'n06w063.tif',\n", + " 'n07e126.tif',\n", + " 'n06w084.tif',\n", + " 'n07e145.tif',\n", + " 'n06w081.tif',\n", + " 'n07e149.tif',\n", + " 'n07e000.tif',\n", + " 'n07e144.tif',\n", + " 'n07e002.tif',\n", + " 'n07e143.tif',\n", + " 'n06w083.tif',\n", + " 'n07e150.tif',\n", + " 'n07e003.tif',\n", + " 'n07e122.tif',\n", + " 'n07e004.tif',\n", + " 'n07e151.tif',\n", + " 'n06w066.tif',\n", + " 'n06w071.tif',\n", + " 'n07e079.tif',\n", + " 'n07e103.tif',\n", + " 'n07e010.tif',\n", + " 'n07e007.tif',\n", + " 'n07e146.tif',\n", + " 'n07e013.tif',\n", + " 'n07e048.tif',\n", + " 'n07e099.tif',\n", + " 'n07e012.tif',\n", + " 'n07e045.tif',\n", + " 'n07e080.tif',\n", + " 'n07e005.tif',\n", + " 'n07e117.tif',\n", + " 'n07e018.tif',\n", + " 'n07e078.tif',\n", + " 'n07e102.tif',\n", + " 'n07e020.tif',\n", + " 'n07e019.tif',\n", + " 'n07e006.tif',\n", + " 'n07e008.tif',\n", + " 'n07e152.tif',\n", + " 'n07e021.tif',\n", + " 'n07e148.tif',\n", + " 'n07e014.tif',\n", + " 'n07e155.tif',\n", + " 'n07e026.tif',\n", + " 'n07e073.tif',\n", + " 'n07e044.tif',\n", + " 'n07e023.tif',\n", + " 'n07e009.tif',\n", + " 'n07e154.tif',\n", + " 'n07e016.tif',\n", + " 'n07e040.tif',\n", + " 'n07e153.tif',\n", + " 'n07e100.tif',\n", + " 'n07e017.tif',\n", + " 'n07e047.tif',\n", + " 'n07e081.tif',\n", + " 'n07e011.tif',\n", + " 'n07e156.tif',\n", + " 'n07e029.tif',\n", + " 'n07e001.tif',\n", + " 'n07e157.tif',\n", + " 'n07e027.tif',\n", + " 'n07e127.tif',\n", + " ...]" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "1b91c1bf", + "metadata": {}, + "outputs": [], + "source": [ + "#out_vrt = os.path.join('s3://', s3_bucket, out_prefix, f'{pluvial_folder}.vrt')\n", + "out_vrt = f'{pluvial_folder}.vrt'\n", + "vrt_options = gdal.BuildVRTOptions(resampleAlg='cubic', addAlpha=True)\n", + "my_vrt = gdal.BuildVRT(out_vrt, all_vals, options=vrt_options)\n", + "my_vrt = None\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "e2acf1d8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['s3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e006.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e007.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e008.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e009.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e010.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e011.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e012.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e013.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e014.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e015.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e016.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e017.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e018.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e019.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e020.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e021.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e022.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e023.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e024.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e025.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e026.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e027.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e028.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e029.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e030.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e031.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e032.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e033.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e034.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e035.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e036.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e037.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e038.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e039.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e040.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e041.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e042.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e043.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e044.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e045.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e072.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e073.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e096.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e097.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e098.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e099.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e100.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e101.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e102.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e103.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e104.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e105.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e106.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e107.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e108.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e109.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e110.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e111.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e112.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e113.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e114.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e115.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e116.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e117.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e118.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e119.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e120.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e121.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e122.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e123.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e124.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e125.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e126.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e127.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e128.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e129.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e130.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e131.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e134.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e135.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e154.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e155.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e172.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00e173.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w049.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w050.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w051.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w052.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w053.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w054.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w055.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w056.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w057.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w058.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w059.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w060.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w061.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w062.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w063.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w064.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w065.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w066.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w067.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w068.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w069.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w070.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w071.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w072.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w073.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w074.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w075.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w076.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w077.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w078.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w079.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w080.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w081.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w082.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w089.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w090.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w091.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w092.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w157.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w158.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w177.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n00w178.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e006.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e007.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e008.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e009.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e010.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e011.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e012.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e013.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e014.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e015.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e016.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e017.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e018.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e019.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e020.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e021.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e022.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e023.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e024.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e025.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e026.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e027.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e028.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e029.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e030.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e031.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e032.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e033.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e034.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e035.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e036.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e037.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e038.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e039.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e040.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e041.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e042.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e043.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e044.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e045.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e072.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e073.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e096.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e097.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e098.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e099.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e100.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e101.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e102.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e103.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e104.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e105.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e106.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e107.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e108.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e109.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e110.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e111.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e112.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e113.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e114.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e115.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e116.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e117.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e118.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e119.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e120.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e121.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e122.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e123.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e124.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e125.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e126.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e127.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e128.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e129.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e130.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e131.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e134.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e135.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e154.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e155.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e172.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01e173.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w049.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w050.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w051.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w052.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w053.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w054.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w055.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w056.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w057.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w058.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w059.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w060.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w061.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w062.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w063.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w064.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w065.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w066.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w067.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w068.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w069.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w070.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w071.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w072.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w073.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w074.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w075.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w076.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w077.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w078.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w079.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w080.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w081.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w082.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w089.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w090.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w091.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w092.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w157.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w158.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w177.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w178.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e008.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e009.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e010.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e011.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e012.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e013.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e014.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e015.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e016.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e017.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e018.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e019.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e020.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e021.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e022.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e023.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e024.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e025.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e026.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e027.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e028.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e029.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e030.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e031.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e032.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e033.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e034.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e035.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e036.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e037.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e038.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e039.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e040.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e041.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e042.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e043.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e044.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e045.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e046.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e047.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e072.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e073.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e094.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e095.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e096.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e097.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e098.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e099.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e100.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e101.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e102.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e103.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e104.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e105.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e106.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e107.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e108.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e109.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e110.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e111.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e112.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e113.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e114.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e115.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e116.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e117.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e118.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e119.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e124.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e125.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e126.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e127.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e128.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e129.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e130.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e131.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e154.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e155.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e172.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02e173.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w051.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w052.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w053.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w054.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w055.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w056.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w057.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w058.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w059.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w060.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w061.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w062.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w063.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w064.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w065.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w066.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w067.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w068.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w069.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w070.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w071.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w072.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w073.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w074.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w075.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w076.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w077.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w078.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w079.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w080.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w081.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w082.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w157.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w158.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w159.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n02w160.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e008.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e009.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e010.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e011.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e012.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e013.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e014.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e015.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e016.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e017.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e018.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e019.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e020.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e021.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e022.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e023.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e024.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e025.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e026.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e027.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e028.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e029.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e030.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e031.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e032.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e033.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e034.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e035.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e036.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e037.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e038.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e039.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e040.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e041.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e042.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e043.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e044.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e045.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e046.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e047.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e072.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e073.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e094.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e095.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e096.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e097.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e098.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e099.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e100.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e101.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e102.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e103.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e104.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e105.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e106.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e107.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e108.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e109.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e110.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e111.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e112.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e113.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e114.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e115.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e116.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e117.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e118.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e119.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e124.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e125.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e126.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e127.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e128.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e129.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e130.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e131.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e154.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e155.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e172.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03e173.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w051.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w052.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w053.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w054.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w055.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w056.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w057.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w058.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w059.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w060.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w061.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w062.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w063.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w064.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w065.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w066.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w067.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w068.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w069.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w070.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w071.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w072.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w073.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w074.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w075.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w076.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w077.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w078.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w079.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w080.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w081.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w082.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w157.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w158.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w159.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n03w160.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e000.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e001.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e004.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e005.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e006.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e007.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e008.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e009.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e010.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e011.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e012.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e013.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e014.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e015.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e016.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e017.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e018.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e019.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e020.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e021.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e022.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e023.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e024.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e025.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e026.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e027.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e028.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e029.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e030.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e031.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e032.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e033.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e034.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e035.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e036.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e037.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e038.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e039.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e040.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e041.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e042.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e043.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e044.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e045.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e046.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e047.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e048.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e049.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e072.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e073.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e080.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e081.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e094.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e095.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e096.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e097.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e098.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e099.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e100.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e101.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e102.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e103.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e106.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e107.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e108.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e109.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e112.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e113.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e114.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e115.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e116.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e117.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e118.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e119.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e120.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e121.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e124.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e125.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e126.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e127.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e130.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e131.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e132.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e133.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e152.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e153.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e156.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e157.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e162.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e163.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e168.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e169.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e172.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04e173.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w001.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w002.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w003.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w004.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w005.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w006.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w007.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w008.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w009.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w010.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w011.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w012.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w051.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w052.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w053.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w054.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w055.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w056.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w057.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w058.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w059.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w060.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w061.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w062.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w063.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w064.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w065.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w066.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w067.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w068.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w069.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w070.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w071.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w072.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w073.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w074.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w075.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w076.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w077.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w078.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w081.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w082.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w161.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w162.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w163.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n04w164.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e000.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e001.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e004.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e005.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e006.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e007.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e008.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e009.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e010.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e011.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e012.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e013.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e014.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e015.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e016.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e017.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e018.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e019.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e020.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e021.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e022.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e023.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e024.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e025.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e026.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e027.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e028.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e029.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e030.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e031.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e032.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e033.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e034.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e035.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e036.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e037.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e038.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e039.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e040.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e041.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e042.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e043.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e044.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e045.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e046.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e047.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e048.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e049.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e072.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e073.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e080.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e081.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e094.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e095.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e096.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e097.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e098.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e099.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e100.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e101.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e102.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e103.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e106.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e107.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e108.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e109.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e112.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e113.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e114.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e115.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e116.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e117.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e118.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e119.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e120.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e121.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e124.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e125.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e126.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e127.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e130.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e131.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e132.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e133.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e152.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e153.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e156.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e157.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e162.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e163.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e168.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e169.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e172.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05e173.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w001.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w002.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w003.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w004.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w005.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w006.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w007.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w008.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w009.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w010.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w011.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w012.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w051.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w052.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w053.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w054.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w055.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w056.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w057.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w058.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w059.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w060.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w061.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w062.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w063.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w064.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w065.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w066.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w067.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w068.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w069.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w070.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w071.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w072.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w073.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w074.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w075.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w076.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w077.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w078.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w081.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w082.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w161.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w162.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w163.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n05w164.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e000.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e001.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e002.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e003.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e004.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e005.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e006.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e007.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e008.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e009.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e010.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e011.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e012.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e013.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e014.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e015.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e016.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e017.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e018.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e019.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e020.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e021.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e022.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e023.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e024.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e025.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e026.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e027.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e028.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e029.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e030.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e031.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e032.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e033.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e034.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e035.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e036.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e037.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e038.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e039.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e040.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e041.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e042.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e043.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e044.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e045.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e046.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e047.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e048.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e049.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e072.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e073.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e078.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e079.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e080.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e081.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e092.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e093.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e094.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e095.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e098.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e099.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e100.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e101.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e102.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e103.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e112.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e113.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e114.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e115.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e116.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e117.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e118.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e119.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e120.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e121.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e122.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e123.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e124.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e125.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e126.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e127.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e134.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e135.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e142.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e143.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e144.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e145.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e146.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e147.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e148.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e149.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e150.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e151.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e152.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e153.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e154.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e155.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e156.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e157.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e158.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e159.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e160.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e161.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e168.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e169.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e170.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e171.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e172.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06e173.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w001.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w002.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w003.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w004.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w005.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w006.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w007.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w008.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w009.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w010.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w011.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w012.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w013.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w014.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w055.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w056.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w057.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w058.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w059.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w060.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w061.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w062.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w063.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w064.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w065.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w066.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w067.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w068.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w069.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w070.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w071.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w072.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w073.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w074.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w075.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w076.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w077.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w078.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w079.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w080.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w081.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w082.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w083.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n06w084.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e000.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e001.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e002.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e003.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e004.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e005.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e006.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e007.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e008.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e009.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e010.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e011.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e012.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e013.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e014.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e015.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e016.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e017.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e018.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e019.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e020.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e021.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e022.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e023.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e024.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e025.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e026.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e027.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e028.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e029.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e030.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e031.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e032.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e033.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e034.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e035.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e036.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e037.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e038.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e039.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e040.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e041.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e042.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e043.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e044.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e045.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e046.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e047.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e048.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e049.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e072.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e073.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e078.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e079.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e080.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e081.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e092.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e093.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e094.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e095.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e098.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e099.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e100.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e101.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e102.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e103.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e112.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e113.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e114.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e115.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e116.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e117.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e118.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e119.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e120.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e121.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e122.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e123.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e124.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e125.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e126.tif',\n", + " 's3://wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n07e127.tif',\n", + " ...]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "all_vals" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "42816118", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Earth Engine", + "language": "python", + "name": "ee" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/FATHOM/Extract_flood_tiles.ipynb b/notebooks/FATHOM/Extract_flood_tiles.ipynb new file mode 100644 index 0000000..713de3b --- /dev/null +++ b/notebooks/FATHOM/Extract_flood_tiles.ipynb @@ -0,0 +1,245 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "29e399a7", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/wb411133/.conda/envs/ee/lib/python3.9/site-packages/geopandas/_compat.py:106: UserWarning: The Shapely GEOS version (3.9.1-CAPI-1.14.2) is incompatible with the GEOS version PyGEOS was compiled with (3.10.4-CAPI-1.16.2). Conversions between both will be slow.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "import sys, os, boto3\n", + "import rasterio\n", + "\n", + "import geopandas as gpd\n", + "import pandas as pd\n", + "\n", + "from tqdm.notebook import tqdm\n", + "from shapely.geometry import box\n", + "\n", + "sys.path.insert(0,\"/home/wb411133/Code/gostrocks/src\")\n", + "\n", + "import GOSTRocks.rasterMisc as rMisc\n", + "import GOSTRocks.dataMisc as dataMisc\n", + "import GOSTRocks.mapMisc as mapMisc" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "efa57703", + "metadata": {}, + "outputs": [], + "source": [ + "s3_bucket = 'wbg-geography01'\n", + "s3_prefix = 'FATHOM/v2023/'\n", + "\n", + "s3 = boto3.resource('s3')\n", + "s3_downloader = boto3.client('s3')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "05d3ba17", + "metadata": {}, + "outputs": [], + "source": [ + "fathom_tile_extents = 's3://wbg-geography01/FATHOM/v2023_support_files/fathom_tile_extents.geojson'\n", + "fathom_extents = gpd.read_file(fathom_tile_extents)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "7ba85b89", + "metadata": {}, + "outputs": [], + "source": [ + "# define extent by iso3 code\n", + "sel_iso3 = 'MWI'\n", + "world_filepath = gpd.datasets.get_path('naturalearth_lowres')\n", + "world = gpd.read_file(world_filepath)\n", + "sel_bounds = world.loc[world['iso_a3'] == sel_iso3].unary_union" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "72e10e0a", + "metadata": {}, + "outputs": [], + "source": [ + "# Define extent by bounding box [minx, miny, maxx, maxy]\n", + "#bbox = [176.058746,-10.791870,179.871353,-5.642500]\n", + "#sel_bounds = box(*bbox)" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "457f0702", + "metadata": {}, + "outputs": [], + "source": [ + "# select tiles that intersect the sel_bounds\n", + "sel_tiles = fathom_extents.loc[fathom_extents.intersects(sel_bounds)]" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "2e75e2f2", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sel_tiles.unary_union" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "1a75fa42", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(21, 4)" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sel_tiles.shape" + ] + }, + { + "cell_type": "markdown", + "id": "87d26b8e", + "metadata": {}, + "source": [ + "# Select flooding layer" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "64821e28", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Error downloading s10e034.tif for GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0\n", + "Error downloading s10e032.tif for GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0\n", + "Error downloading s10e033.tif for GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0\n", + "Error downloading s11e034.tif for GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0\n", + "Error downloading s11e033.tif for GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0\n", + "Error downloading s12e034.tif for GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0\n", + "Error downloading s12e033.tif for GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0\n", + "Error downloading s13e033.tif for GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0\n", + "Error downloading s13e034.tif for GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0\n", + "Error downloading s13e032.tif for GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0\n", + "Error downloading s14e032.tif for GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0\n", + "Error downloading s14e033.tif for GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0\n", + "Error downloading s14e035.tif for GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0\n", + "Error downloading s14e034.tif for GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0\n", + "Error downloading s15e035.tif for GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0\n", + "Error downloading s15e033.tif for GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0\n", + "Error downloading s15e034.tif for GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0\n", + "Error downloading s16e035.tif for GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0\n", + "Error downloading s16e034.tif for GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0\n", + "Error downloading s17e035.tif for GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0\n", + "Error downloading s17e034.tif for GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0\n" + ] + } + ], + "source": [ + "### TODO - this section add projections options\n", + "return_period = '1000'\n", + "defended = 'DEFENDED'\n", + "\n", + "coastal_folder = f'GLOBAL-1ARCSEC-NW_OFFSET-1in{return_period}-COASTAL-{defended}-DEPTH-2020-PERCENTILE50-v3.0'\n", + "fluvial_folder = f'GLOBAL-1ARCSEC-NW_OFFSET-1in{return_period}-FLUVIAL-{defended}-DEPTH-2020-PERCENTILE50-v3.0'\n", + "pluvial_folder = f'GLOBAL-1ARCSEC-NW_OFFSET-1in{return_period}-PLUVIAL-{defended}-DEPTH-2020-PERCENTILE50-v3.0'\n", + "\n", + "download_folder = '/home/wb411133/temp/FATHOM/TESTING_Download_Malawi'\n", + "for c_folder in [coastal_folder, fluvial_folder, pluvial_folder]:\n", + " out_folder = os.path.join(download_folder, c_folder)\n", + " try:\n", + " os.makedirs(out_folder)\n", + " except:\n", + " pass\n", + "\n", + "for idx, row in sel_tiles.iterrows(): \n", + " tiff = f'{row[\"ID\"]}.tif'\n", + " for c_folder in [coastal_folder, fluvial_folder, pluvial_folder]:\n", + " try:\n", + " s3_downloader.download_file(s3_bucket, \n", + " os.path.join(s3_prefix, c_folder, tiff), \n", + " os.path.join(download_folder, c_folder, tiff))\n", + " except:\n", + " print(f'Error downloading {tiff} for {c_folder}')\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9ca04504", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Earth Engine", + "language": "python", + "name": "ee" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/FATHOM/Generate_footprints.ipynb b/notebooks/FATHOM/Generate_footprints.ipynb new file mode 100644 index 0000000..aeabfe9 --- /dev/null +++ b/notebooks/FATHOM/Generate_footprints.ipynb @@ -0,0 +1,1188 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "e6f0e73d", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/wb411133/.conda/envs/ee/lib/python3.9/site-packages/geopandas/_compat.py:106: UserWarning: The Shapely GEOS version (3.9.1-CAPI-1.14.2) is incompatible with the GEOS version PyGEOS was compiled with (3.10.4-CAPI-1.16.2). Conversions between both will be slow.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "import sys, os, boto3\n", + "import rasterio\n", + "\n", + "import geopandas as gpd\n", + "import pandas as pd\n", + "\n", + "from tqdm.notebook import tqdm\n", + "from shapely.geometry import box" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "6cc28f09", + "metadata": {}, + "outputs": [], + "source": [ + "in_file_list = '/home/wb411133/temp/fathom_files.csv'\n", + "\n", + "s3_bucket = 'wbg-geography01'\n", + "s3_prefix = 'FATHOM/v2023/'\n", + "s3_folder = 'GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0'\n", + "\n", + "in_files = pd.read_csv(in_file_list)\n", + "s3 = boto3.resource('s3')\n", + "my_bucket = s3.Bucket(s3_bucket)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "ab23d443", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "227787f265d140ec8ce2f03f242fc754", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/20624 [00:00\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
IDgeometryFLUVIALCOASTAL
0n00e135POLYGON ((135.99986 0.00014, 135.99986 1.00014...10
1n00w065POLYGON ((-64.00014 0.00014, -64.00014 1.00014...10
2n00e007POLYGON ((7.99986 0.00014, 7.99986 1.00014, 6....10
3n00e006POLYGON ((6.99986 0.00014, 6.99986 1.00014, 5....11
4n00w082POLYGON ((-81.00014 0.00014, -81.00014 1.00014...10
\n", + "" + ], + "text/plain": [ + " ID geometry FLUVIAL \\\n", + "0 n00e135 POLYGON ((135.99986 0.00014, 135.99986 1.00014... 1 \n", + "1 n00w065 POLYGON ((-64.00014 0.00014, -64.00014 1.00014... 1 \n", + "2 n00e007 POLYGON ((7.99986 0.00014, 7.99986 1.00014, 6.... 1 \n", + "3 n00e006 POLYGON ((6.99986 0.00014, 6.99986 1.00014, 5.... 1 \n", + "4 n00w082 POLYGON ((-81.00014 0.00014, -81.00014 1.00014... 1 \n", + "\n", + " COASTAL \n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 1 \n", + "4 0 " + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "combo_extents.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "544634c8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
IDgeometryFLUVIALCOASTAL
352s57w028POLYGON ((-27.00014 -56.99986, -27.00014 -55.9...01
353s58w027POLYGON ((-26.00014 -57.99986, -26.00014 -56.9...01
354s59w027POLYGON ((-26.00014 -58.99986, -26.00014 -57.9...01
355s60w027POLYGON ((-26.00014 -59.99986, -26.00014 -58.9...01
356s60w028POLYGON ((-27.00014 -59.99986, -27.00014 -58.9...01
\n", + "
" + ], + "text/plain": [ + " ID geometry FLUVIAL \\\n", + "352 s57w028 POLYGON ((-27.00014 -56.99986, -27.00014 -55.9... 0 \n", + "353 s58w027 POLYGON ((-26.00014 -57.99986, -26.00014 -56.9... 0 \n", + "354 s59w027 POLYGON ((-26.00014 -58.99986, -26.00014 -57.9... 0 \n", + "355 s60w027 POLYGON ((-26.00014 -59.99986, -26.00014 -58.9... 0 \n", + "356 s60w028 POLYGON ((-27.00014 -59.99986, -27.00014 -58.9... 0 \n", + "\n", + " COASTAL \n", + "352 1 \n", + "353 1 \n", + "354 1 \n", + "355 1 \n", + "356 1 " + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "combo_extents.tail()" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "57b91eca", + "metadata": {}, + "outputs": [], + "source": [ + "combo_extents.to_file('/home/wb411133/temp/fathom_tile_extents.geojson', driver='GeoJSON')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Earth Engine", + "language": "python", + "name": "ee" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/FATHOM/Transfer_Data_AWS.ipynb b/notebooks/FATHOM/Transfer_Data_AWS.ipynb new file mode 100644 index 0000000..8753396 --- /dev/null +++ b/notebooks/FATHOM/Transfer_Data_AWS.ipynb @@ -0,0 +1,755 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import sys, os\n", + "import boto3\n", + "\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "in_file_list = '/home/wb411133/temp/World_Bank_Global_3_Complete.csv'\n", + "out_folder = os.path.join(os.path.dirname(in_file_list), \"FATHOM\")\n", + "s3_bucket = 'wbg-geography01'\n", + "s3_prefix = 'FATHOM/v2023/'\n", + "s3_out = os.path.join('s3://',s3_bucket, s3_prefix)\n", + "\n", + "in_files = pd.read_csv(in_file_list)\n", + "s3 = boto3.resource('s3')\n", + "my_bucket = s3.Bucket(s3_bucket)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
LayerAWS_Path
0GLOBAL-1ARCSEC-NW_OFFSET-1in10-COASTAL-DEFENDE...s3://fathom-products-global/fathom-global/v3/G...
1GLOBAL-1ARCSEC-NW_OFFSET-1in10-COASTAL-UNDEFEN...s3://fathom-products-global/fathom-global/v3/G...
2GLOBAL-1ARCSEC-NW_OFFSET-1in10-FLUVIAL-DEFENDE...s3://fathom-products-global/fathom-global/v3/G...
3GLOBAL-1ARCSEC-NW_OFFSET-1in10-FLUVIAL-UNDEFEN...s3://fathom-products-global/fathom-global/v3/G...
4GLOBAL-1ARCSEC-NW_OFFSET-1in10-PLUVIAL-DEFENDE...s3://fathom-products-global/fathom-global/v3/G...
\n", + "
" + ], + "text/plain": [ + " Layer \\\n", + "0 GLOBAL-1ARCSEC-NW_OFFSET-1in10-COASTAL-DEFENDE... \n", + "1 GLOBAL-1ARCSEC-NW_OFFSET-1in10-COASTAL-UNDEFEN... \n", + "2 GLOBAL-1ARCSEC-NW_OFFSET-1in10-FLUVIAL-DEFENDE... \n", + "3 GLOBAL-1ARCSEC-NW_OFFSET-1in10-FLUVIAL-UNDEFEN... \n", + "4 GLOBAL-1ARCSEC-NW_OFFSET-1in10-PLUVIAL-DEFENDE... \n", + "\n", + " AWS_Path \n", + "0 s3://fathom-products-global/fathom-global/v3/G... \n", + "1 s3://fathom-products-global/fathom-global/v3/G... \n", + "2 s3://fathom-products-global/fathom-global/v3/G... \n", + "3 s3://fathom-products-global/fathom-global/v3/G... \n", + "4 s3://fathom-products-global/fathom-global/v3/G... " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "in_files.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Find all files already copied\n", + "all_folders = []\n", + "for obj in my_bucket.objects.filter(Prefix=s3_prefix):\n", + " all_folders.append(obj.key.split(\"/\")[-2])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
LayerAWS_Path
\n", + "
" + ], + "text/plain": [ + "Empty DataFrame\n", + "Columns: [Layer, AWS_Path]\n", + "Index: []" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "processed_folders = list(set(all_folders))\n", + "delivered_folders = in_files['Layer'].values\n", + "sel_folders = [x for x in delivered_folders if not x in processed_folders]\n", + "sel_files = in_files.loc[in_files['Layer'].isin(sel_folders)].copy()\n", + "sel_files" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-COASTAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 2567\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-COASTAL-UNDEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-FLUVIAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-FLUVIAL-UNDEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-PLUVIAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-COASTAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-COASTAL-UNDEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-FLUVIAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-FLUVIAL-UNDEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-PLUVIAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-UNDEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-FLUVIAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-FLUVIAL-UNDEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-COASTAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-COASTAL-UNDEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-FLUVIAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-FLUVIAL-UNDEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-PLUVIAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-COASTAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-COASTAL-UNDEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-FLUVIAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-FLUVIAL-UNDEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-PLUVIAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-COASTAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-COASTAL-UNDEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-FLUVIAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-FLUVIAL-UNDEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-PLUVIAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-COASTAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-COASTAL-UNDEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-FLUVIAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-FLUVIAL-UNDEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-PLUVIAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-COASTAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-COASTAL-UNDEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-FLUVIAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-FLUVIAL-UNDEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-PLUVIAL-DEFENDED-DEPTH-2030-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-COASTAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-COASTAL-UNDEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-FLUVIAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-FLUVIAL-UNDEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-PLUVIAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-COASTAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-COASTAL-UNDEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-FLUVIAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-FLUVIAL-UNDEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-PLUVIAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-UNDEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-FLUVIAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-FLUVIAL-UNDEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-COASTAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-COASTAL-UNDEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-FLUVIAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-FLUVIAL-UNDEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-PLUVIAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-COASTAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-COASTAL-UNDEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-FLUVIAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-FLUVIAL-UNDEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-PLUVIAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-COASTAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-COASTAL-UNDEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-FLUVIAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-FLUVIAL-UNDEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-PLUVIAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-COASTAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-COASTAL-UNDEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-FLUVIAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-FLUVIAL-UNDEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-PLUVIAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-COASTAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-COASTAL-UNDEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-FLUVIAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-FLUVIAL-UNDEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-PLUVIAL-DEFENDED-DEPTH-2050-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-COASTAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-COASTAL-UNDEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-FLUVIAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-PLUVIAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-COASTAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-COASTAL-UNDEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-FLUVIAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-PLUVIAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-UNDEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-FLUVIAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-COASTAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-COASTAL-UNDEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-FLUVIAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-PLUVIAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-COASTAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-COASTAL-UNDEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-FLUVIAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-PLUVIAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-COASTAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-COASTAL-UNDEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-FLUVIAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-PLUVIAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-COASTAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-COASTAL-UNDEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-FLUVIAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-PLUVIAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-COASTAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-COASTAL-UNDEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-FLUVIAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-PLUVIAL-DEFENDED-DEPTH-2080-SSP1_2.6-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-COASTAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-COASTAL-UNDEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-FLUVIAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-PLUVIAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-COASTAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-COASTAL-UNDEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-FLUVIAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-PLUVIAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-UNDEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-FLUVIAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-COASTAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-COASTAL-UNDEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-FLUVIAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-PLUVIAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-COASTAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-COASTAL-UNDEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-FLUVIAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-PLUVIAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-COASTAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-COASTAL-UNDEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-FLUVIAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-PLUVIAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-COASTAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-COASTAL-UNDEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-FLUVIAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-PLUVIAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-COASTAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-COASTAL-UNDEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-FLUVIAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-PLUVIAL-DEFENDED-DEPTH-2080-SSP2_4.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-COASTAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-COASTAL-UNDEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-FLUVIAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-PLUVIAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-COASTAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-COASTAL-UNDEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-FLUVIAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-PLUVIAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-UNDEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-FLUVIAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-COASTAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-COASTAL-UNDEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-FLUVIAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-PLUVIAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-COASTAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-COASTAL-UNDEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-FLUVIAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-PLUVIAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-COASTAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-COASTAL-UNDEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-FLUVIAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-PLUVIAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-COASTAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-COASTAL-UNDEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-FLUVIAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-PLUVIAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-COASTAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-COASTAL-UNDEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-FLUVIAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-PLUVIAL-DEFENDED-DEPTH-2080-SSP3_7.0-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-COASTAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-COASTAL-UNDEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-FLUVIAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in10-PLUVIAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-COASTAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-COASTAL-UNDEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-FLUVIAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in100-PLUVIAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-COASTAL-UNDEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-FLUVIAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in1000-PLUVIAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-COASTAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-COASTAL-UNDEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-FLUVIAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in20-PLUVIAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-COASTAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-COASTAL-UNDEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-FLUVIAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in200-PLUVIAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-COASTAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-COASTAL-UNDEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-FLUVIAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in5-PLUVIAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-COASTAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-COASTAL-UNDEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-FLUVIAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in50-PLUVIAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-COASTAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-COASTAL-UNDEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-FLUVIAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-FLUVIAL-UNDEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n", + "GLOBAL-1ARCSEC-NW_OFFSET-1in500-PLUVIAL-DEFENDED-DEPTH-2080-SSP5_8.5-PERCENTILE50-v3.0: 0\n" + ] + } + ], + "source": [ + "with open(os.path.join(out_folder, \"aaa_download_upload_2.sh\"), 'w') as out_file:\n", + " out_file.write('#!/bin/bash\\n')\n", + " for idx, row in sel_files.iterrows():\n", + " fathom_path = row['AWS_Path']\n", + " local_folder = os.path.join(out_folder, row['Layer'])\n", + " gost_folder = os.path.join(s3_out, row['Layer'])\n", + " if not os.path.exists(local_folder):\n", + " os.makedirs(local_folder)\n", + " \n", + " cur_out_folder = os.path.join(s3_prefix, row['Layer'])\n", + " obj_count = 0\n", + " for obj in my_bucket.objects.filter(Prefix=cur_out_folder):\n", + " obj_count += 1\n", + " print(f\"{row['Layer']}: {obj_count}\")\n", + " if obj_count == 0:\n", + " download_command = f'aws s3 sync --profile fathom {fathom_path} {local_folder}'\n", + " upload_command = f'aws s3 sync {local_folder} {gost_folder}'\n", + " remove_command = f'rm -R {local_folder}'\n", + "\n", + " out_file.write(download_command)\n", + " out_file.write('\\n')\n", + " out_file.write(upload_command)\n", + " out_file.write('\\n')\n", + " out_file.write(remove_command)\n", + " out_file.write('\\n')" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "all_vals = []\n", + "for idx, row in in_files.iterrows():\n", + " all_vals.append(row['Layer'].split('-'))" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + "
GLOBALSizeOffsetreturntypedefensedepthyearprojectionv1v2
0GLOBAL1ARCSECNW_OFFSET1in1000COASTALDEFENDEDDEPTH2020PERCENTILE50v3.0/None
1GLOBAL1ARCSECNW_OFFSET1in1000COASTALUNDEFENDEDDEPTH2020PERCENTILE50v3.0/None
2GLOBAL1ARCSECNW_OFFSET1in1000FLUVIALDEFENDEDDEPTH2020PERCENTILE50v3.0/None
3GLOBAL1ARCSECNW_OFFSET1in1000FLUVIALUNDEFENDEDDEPTH2020PERCENTILE50v3.0/None
4GLOBAL1ARCSECNW_OFFSET1in1000PLUVIALDEFENDEDDEPTH2020PERCENTILE50v3.0/None
\n", + "
" + ], + "text/plain": [ + " GLOBAL Size Offset return type defense depth year \\\n", + "0 GLOBAL 1ARCSEC NW_OFFSET 1in1000 COASTAL DEFENDED DEPTH 2020 \n", + "1 GLOBAL 1ARCSEC NW_OFFSET 1in1000 COASTAL UNDEFENDED DEPTH 2020 \n", + "2 GLOBAL 1ARCSEC NW_OFFSET 1in1000 FLUVIAL DEFENDED DEPTH 2020 \n", + "3 GLOBAL 1ARCSEC NW_OFFSET 1in1000 FLUVIAL UNDEFENDED DEPTH 2020 \n", + "4 GLOBAL 1ARCSEC NW_OFFSET 1in1000 PLUVIAL DEFENDED DEPTH 2020 \n", + "\n", + " projection v1 v2 \n", + "0 PERCENTILE50 v3.0/ None \n", + "1 PERCENTILE50 v3.0/ None \n", + "2 PERCENTILE50 v3.0/ None \n", + "3 PERCENTILE50 v3.0/ None \n", + "4 PERCENTILE50 v3.0/ None " + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "xx = pd.DataFrame(all_vals, columns=['GLOBAL', \"Size\",'Offset','return','type','defense','depth','year','projection','v1','v2'])\n", + "xx.head()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "SSP1_2.6 80\n", + "SSP2_4.5 80\n", + "SSP5_8.5 80\n", + "PERCENTILE50 40\n", + "Name: projection, dtype: int64" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "xx['projection'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2030 40\n", + "2050 40\n", + "Name: year, dtype: int64" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "xx.loc[xx['projection'] == 'SSP1_2.6']['year'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "ename": "RasterioIOError", + "evalue": "Range downloading not supported by this server!", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mCPLE_AppDefinedError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32mrasterio/_base.pyx\u001b[0m in \u001b[0;36mrasterio._base.DatasetBase.__init__\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mrasterio/_shim.pyx\u001b[0m in \u001b[0;36mrasterio._shim.open_dataset\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mrasterio/_err.pyx\u001b[0m in \u001b[0;36mrasterio._err.exc_wrap_pointer\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mCPLE_AppDefinedError\u001b[0m: Range downloading not supported by this server!", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mRasterioIOError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mxx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrasterio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'https://data.worldpop.org/GIS/Population/Global_2000_2020_Constrained/2020/BSGM/DZA/dza_ppp_2020_constrained.tif'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/.conda/envs/ee/lib/python3.9/site-packages/rasterio/env.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwds)\u001b[0m\n\u001b[1;32m 433\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 434\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0menv_ctor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 435\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 436\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 437\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/ee/lib/python3.9/site-packages/rasterio/__init__.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(fp, mode, driver, width, height, count, crs, transform, dtype, nodata, sharing, **kwargs)\u001b[0m\n\u001b[1;32m 218\u001b[0m \u001b[0;31m# None.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 219\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmode\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'r'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 220\u001b[0;31m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mDatasetReader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdriver\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdriver\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msharing\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msharing\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 221\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mmode\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"r+\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 222\u001b[0m s = get_writer_for_path(path, driver=driver)(\n", + "\u001b[0;32mrasterio/_base.pyx\u001b[0m in \u001b[0;36mrasterio._base.DatasetBase.__init__\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mRasterioIOError\u001b[0m: Range downloading not supported by this server!" + ] + } + ], + "source": [ + "xx = rasterio.open('https://data.worldpop.org/GIS/Population/Global_2000_2020_Constrained/2020/BSGM/DZA/dza_ppp_2020_constrained.tif')" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4.776613235473633" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "5008642/1024/1024" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Earth Engine", + "language": "python", + "name": "ee" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/FATHOM/Vizualize_Flood_types.ipynb b/notebooks/FATHOM/Vizualize_Flood_types.ipynb new file mode 100644 index 0000000..91c8517 --- /dev/null +++ b/notebooks/FATHOM/Vizualize_Flood_types.ipynb @@ -0,0 +1,160 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "53f91b00", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/wb411133/.conda/envs/ee/lib/python3.9/site-packages/geopandas/_compat.py:106: UserWarning: The Shapely GEOS version (3.9.1-CAPI-1.14.2) is incompatible with the GEOS version PyGEOS was compiled with (3.10.4-CAPI-1.16.2). Conversions between both will be slow.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "import sys, os, boto3\n", + "import rasterio\n", + "\n", + "import geopandas as gpd\n", + "import pandas as pd\n", + "\n", + "from tqdm.notebook import tqdm\n", + "from shapely.geometry import box\n", + "\n", + "sys.path.insert(0,\"/home/wb411133/Code/gostrocks/src\")\n", + "\n", + "import GOSTRocks.rasterMisc as rMisc\n", + "import GOSTRocks.dataMisc as dataMisc\n", + "import GOSTRocks.mapMisc as mapMisc" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "e25b9b4d", + "metadata": {}, + "outputs": [], + "source": [ + "in_file_list = '/home/wb411133/temp/fathom_files.csv'\n", + "\n", + "s3_bucket = 'wbg-geography01'\n", + "s3_prefix = 'FATHOM/v2023/'\n", + "\n", + "in_files = pd.read_csv(in_file_list)\n", + "s3 = boto3.resource('s3')\n", + "my_bucket = s3.Bucket(s3_bucket)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "f0947351", + "metadata": {}, + "outputs": [], + "source": [ + "tile = 'n01w028.tif'\n", + "return_period = '1000'\n", + "defended = 'DEFENDED'\n", + "\n", + "coastal_folder = f'GLOBAL-1ARCSEC-NW_OFFSET-1in{return_period}-COASTAL-{defended}-DEPTH-2020-PERCENTILE50-v3.0'\n", + "fluvial_folder = f'GLOBAL-1ARCSEC-NW_OFFSET-1in{return_period}-FLUVIAL-{defended}-DEPTH-2020-PERCENTILE50-v3.0'\n", + "pluvial_folder = f'GLOBAL-1ARCSEC-NW_OFFSET-1in{return_period}-PLUVIAL-{defended}-DEPTH-2020-PERCENTILE50-v3.0'\n", + "\n", + "coastal_file = os.path.join('s3://', s3_bucket, s3_prefix, coastal_folder, tile)\n", + "fluvial_file = os.path.join('s3://', s3_bucket, s3_prefix, fluvial_folder, tile)\n", + "pluvial_file = os.path.join('s3://', s3_bucket, s3_prefix, pluvial_folder, tile)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "11401dea", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "ename": "RasterioIOError", + "evalue": "'/vsis3/wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-FLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w028.tif' does not exist in the file system, and is not recognized as a supported dataset name.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mCPLE_OpenFailedError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32mrasterio/_base.pyx\u001b[0m in \u001b[0;36mrasterio._base.DatasetBase.__init__\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mrasterio/_shim.pyx\u001b[0m in \u001b[0;36mrasterio._shim.open_dataset\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mrasterio/_err.pyx\u001b[0m in \u001b[0;36mrasterio._err.exc_wrap_pointer\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mCPLE_OpenFailedError\u001b[0m: '/vsis3/wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-FLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w028.tif' does not exist in the file system, and is not recognized as a supported dataset name.", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mRasterioIOError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mfluvialR\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrasterio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfluvial_file\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mmapMisc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstatic_map_raster\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfluvialR\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcolormap\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Blues'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mthresh\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0.01\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0.1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0.2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0.5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/ee/lib/python3.9/site-packages/rasterio/env.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwds)\u001b[0m\n\u001b[1;32m 433\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 434\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0menv_ctor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 435\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 436\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 437\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/ee/lib/python3.9/site-packages/rasterio/__init__.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(fp, mode, driver, width, height, count, crs, transform, dtype, nodata, sharing, **kwargs)\u001b[0m\n\u001b[1;32m 218\u001b[0m \u001b[0;31m# None.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 219\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmode\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'r'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 220\u001b[0;31m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mDatasetReader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdriver\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdriver\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msharing\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msharing\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 221\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mmode\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"r+\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 222\u001b[0m s = get_writer_for_path(path, driver=driver)(\n", + "\u001b[0;32mrasterio/_base.pyx\u001b[0m in \u001b[0;36mrasterio._base.DatasetBase.__init__\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mRasterioIOError\u001b[0m: '/vsis3/wbg-geography01/FATHOM/v2023/GLOBAL-1ARCSEC-NW_OFFSET-1in1000-FLUVIAL-DEFENDED-DEPTH-2020-PERCENTILE50-v3.0/n01w028.tif' does not exist in the file system, and is not recognized as a supported dataset name." + ] + } + ], + "source": [ + "fluvialR = rasterio.open(fluvial_file)\n", + "mapMisc.static_map_raster(fluvialR, colormap='Blues', thresh=[0,0.01,0.1,0.2,0.5,1,5])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7d0e285f", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "pluvialR = rasterio.open(pluvial_file)\n", + "mapMisc.static_map_raster(pluvialR, colormap='Blues', thresh=[0,0.01,0.1,0.2,0.5,1,5])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1a2fbfc7", + "metadata": {}, + "outputs": [], + "source": [ + "coastalR = rasterio.open(coastal_file)\n", + "mapMisc.static_map_raster(coastalR, colormap='Blues', thresh=[0,0.01,0.1,0.2,0.5,1,5])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fcc9f41d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Earth Engine", + "language": "python", + "name": "ee" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/TUT_DECAT_B_GeocodingExamples.ipynb b/notebooks/TUT_DECAT_B_GeocodingExamples.ipynb new file mode 100644 index 0000000..15223ba --- /dev/null +++ b/notebooks/TUT_DECAT_B_GeocodingExamples.ipynb @@ -0,0 +1,274 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Geocode locations\n", + "\n", + "This script leverages geonames.org and google.com to map locations with latitudes and longitudes. There are limitations on the usage rate of the geonames search [see here](https://www.geonames.org/export/), and there are technical limits on what can be done with the google results [see here](https://developers.google.com/maps/documentation/geocoding/usage-and-billing)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "import sys, os, importlib\n", + "\n", + "import pandas as pd\n", + "import geopandas as gpd\n", + "\n", + "sys.path.append(\"../src\")\n", + "\n", + "import GOSTRocks.geocode as geocode" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "input_csv = r\"J:\\Data\\GLOBAL\\INFRA\\IXPS\\ixps_global_0813.csv\"\n", + "inD = pd.read_csv(input_csv)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + "
countrytotal_by_countrycityixpnamealternatenamesprefixessourcesurlparticipants_pchpeak_pchavg_pchstatus_pchonly_inregionyearlmic
0Afghanistan1KabulNational Internet Exchange['NIXA']{'ipv4': ['103.104.146.0/24']}['pdb']http://www.nixa.af16NaNNaNactivepdbSouth Asia20181
1Albania1TiranaAlbanian Neutral Internet eXchange['ANIX', 'Albanian Neutral Internet eXchange']{'ipv4': ['185.1.100.0/24'], 'ipv6': ['2001:7f...['pdb', 'pch', 'he']http://www.anix.al890M33MactiveNaNEurope & Central Asia20180
2Angola2LuandaANGONIX['Angola Internet Exchange Point']{'ipv4': ['196.11.234.0/24'], 'ipv6': ['2001:4...['pdb', 'he']http://angonix.net/2113.6GNaNactiveNaNSub-Saharan Africa20151
3Angola2LuandaAngola Internet Exchange[]{'ipv4': ['196.223.1.0/24'], 'ipv6': []}['pch']NaN211.6GNaNactiveNaNSub-Saharan Africa20061
4Argentina29Bahia BlancaCABASE IXP Bahia Blanca['CABASE IXP Bah?a Blanca']{'ipv4': ['200.14.37.0/24'], 'ipv6': ['2001:13...['pdb', 'pch']http://www.cabase.org.ar/15713MNaNactiveNaNLatin America & Caribbean20130
\n", + "
" + ], + "text/plain": [ + " country total_by_country city \\\n", + "0 Afghanistan 1 Kabul \n", + "1 Albania 1 Tirana \n", + "2 Angola 2 Luanda \n", + "3 Angola 2 Luanda \n", + "4 Argentina 29 Bahia Blanca \n", + "\n", + " ixpname \\\n", + "0 National Internet Exchange \n", + "1 Albanian Neutral Internet eXchange \n", + "2 ANGONIX \n", + "3 Angola Internet Exchange \n", + "4 CABASE IXP Bahia Blanca \n", + "\n", + " alternatenames \\\n", + "0 ['NIXA'] \n", + "1 ['ANIX', 'Albanian Neutral Internet eXchange'] \n", + "2 ['Angola Internet Exchange Point'] \n", + "3 [] \n", + "4 ['CABASE IXP Bah?a Blanca'] \n", + "\n", + " prefixes sources \\\n", + "0 {'ipv4': ['103.104.146.0/24']} ['pdb'] \n", + "1 {'ipv4': ['185.1.100.0/24'], 'ipv6': ['2001:7f... ['pdb', 'pch', 'he'] \n", + "2 {'ipv4': ['196.11.234.0/24'], 'ipv6': ['2001:4... ['pdb', 'he'] \n", + "3 {'ipv4': ['196.223.1.0/24'], 'ipv6': []} ['pch'] \n", + "4 {'ipv4': ['200.14.37.0/24'], 'ipv6': ['2001:13... ['pdb', 'pch'] \n", + "\n", + " url participants_pch peak_pch avg_pch status_pch \\\n", + "0 http://www.nixa.af 16 NaN NaN active \n", + "1 http://www.anix.al 8 90M 33M active \n", + "2 http://angonix.net/ 21 13.6G NaN active \n", + "3 NaN 21 1.6G NaN active \n", + "4 http://www.cabase.org.ar/ 15 713M NaN active \n", + "\n", + " only_in region year lmic \n", + "0 pdb South Asia 2018 1 \n", + "1 NaN Europe & Central Asia 2018 0 \n", + "2 NaN Sub-Saharan Africa 2015 1 \n", + "3 NaN Sub-Saharan Africa 2006 1 \n", + "4 NaN Latin America & Caribbean 2013 0 " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inD.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "importlib.reload(geocode)\n", + "xx = geocode.geocodeDF(inD, [2,0], 'YOUR_USERNAME_GOES_HERE', verbose=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python (geog)", + "language": "python", + "name": "geog" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/TUT_GeoBoundaries.ipynb b/notebooks/TUT_GeoBoundaries.ipynb new file mode 100644 index 0000000..0837140 --- /dev/null +++ b/notebooks/TUT_GeoBoundaries.ipynb @@ -0,0 +1,536 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Extract and map admin boundaries from GeoBoundaries" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/wb411133/.conda/envs/ee/lib/python3.9/site-packages/geopandas/_compat.py:106: UserWarning: The Shapely GEOS version (3.9.1-CAPI-1.14.2) is incompatible with the GEOS version PyGEOS was compiled with (3.10.4-CAPI-1.16.2). Conversions between both will be slow.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "import sys, os, importlib\n", + "\n", + "import pandas as pd\n", + "import geopandas as gpd\n", + "\n", + "sys.path.insert(0, \"../src\")\n", + "\n", + "import GOSTRocks.mapMisc as mapMisc\n", + "import GOSTRocks.dataMisc as dataMisc\n", + "\n", + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Config',\n", + " 'UNSIGNED',\n", + " '__builtins__',\n", + " '__cached__',\n", + " '__doc__',\n", + " '__file__',\n", + " '__loader__',\n", + " '__name__',\n", + " '__package__',\n", + " '__spec__',\n", + " 'aws_search_ntl',\n", + " 'boto3',\n", + " 'get_geoboundaries',\n", + " 'gpd',\n", + " 'json',\n", + " 'pd',\n", + " 'urllib']" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(dataMisc)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "dataMisc.get_geoboundaries?" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \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", + "
shapeNameshapeISOshapeIDshapeGroupshapeTypegeometry
0Abim29229248B2720911975926UGAADM2POLYGON ((33.96576 2.61670, 33.95916 2.62089, ...
1Adjumani29229248B5864304727943UGAADM2POLYGON ((32.06201 3.57961, 32.06209 3.57970, ...
2Agago29229248B46383558561496UGAADM2POLYGON ((33.55948 3.14894, 33.55869 3.15924, ...
3Alebtong29229248B1604569270541UGAADM2POLYGON ((33.53498 2.35203, 33.53486 2.35187, ...
4Amolatar29229248B8101446493380UGAADM2POLYGON ((32.94045 1.81336, 32.93815 1.81341, ...
.....................
130Ssembabule29229248B69968186094061UGAADM2POLYGON ((31.60093 0.05001, 31.59999 0.05042, ...
131Tororo29229248B21797160627701UGAADM2POLYGON ((33.97873 0.57800, 33.97875 0.57799, ...
132Wakiso29229248B89585843617230UGAADM2POLYGON ((32.50099 -0.15249, 32.50111 -0.15233...
133Yumbe29229248B61629311196164UGAADM2POLYGON ((31.40883 3.18405, 31.40880 3.18395, ...
134Zombo29229248B95470617370645UGAADM2POLYGON ((30.79203 2.64443, 30.79167 2.64430, ...
\n", + "

135 rows ร— 6 columns

\n", + "
" + ], + "text/plain": [ + " shapeName shapeISO shapeID shapeGroup shapeType \\\n", + "0 Abim 29229248B2720911975926 UGA ADM2 \n", + "1 Adjumani 29229248B5864304727943 UGA ADM2 \n", + "2 Agago 29229248B46383558561496 UGA ADM2 \n", + "3 Alebtong 29229248B1604569270541 UGA ADM2 \n", + "4 Amolatar 29229248B8101446493380 UGA ADM2 \n", + ".. ... ... ... ... ... \n", + "130 Ssembabule 29229248B69968186094061 UGA ADM2 \n", + "131 Tororo 29229248B21797160627701 UGA ADM2 \n", + "132 Wakiso 29229248B89585843617230 UGA ADM2 \n", + "133 Yumbe 29229248B61629311196164 UGA ADM2 \n", + "134 Zombo 29229248B95470617370645 UGA ADM2 \n", + "\n", + " geometry \n", + "0 POLYGON ((33.96576 2.61670, 33.95916 2.62089, ... \n", + "1 POLYGON ((32.06201 3.57961, 32.06209 3.57970, ... \n", + "2 POLYGON ((33.55948 3.14894, 33.55869 3.15924, ... \n", + "3 POLYGON ((33.53498 2.35203, 33.53486 2.35187, ... \n", + "4 POLYGON ((32.94045 1.81336, 32.93815 1.81341, ... \n", + ".. ... \n", + "130 POLYGON ((31.60093 0.05001, 31.59999 0.05042, ... \n", + "131 POLYGON ((33.97873 0.57800, 33.97875 0.57799, ... \n", + "132 POLYGON ((32.50099 -0.15249, 32.50111 -0.15233... \n", + "133 POLYGON ((31.40883 3.18405, 31.40880 3.18395, ... \n", + "134 POLYGON ((30.79203 2.64443, 30.79167 2.64430, ... \n", + "\n", + "[135 rows x 6 columns]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sel_iso3 = \"UGA\"\n", + "sel_country = dataMisc.get_geoboundaries(sel_iso3, 'ADM2')\n", + "sel_country" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Patch',\n", + " '__builtins__',\n", + " '__cached__',\n", + " '__doc__',\n", + " '__file__',\n", + " '__loader__',\n", + " '__name__',\n", + " '__package__',\n", + " '__spec__',\n", + " 'ctx',\n", + " 'gpd',\n", + " 'mpatches',\n", + " 'np',\n", + " 'pd',\n", + " 'plt',\n", + " 'static_map_raster',\n", + " 'static_map_vector']" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(mapMisc)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "mapMisc.static_map_vector?" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Error mapping specified column, defaulting to index\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhIAAAIuCAYAAADqheFpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOydd3hUZfbHP/dOn8mk9w4kBEgIoTcponQFsSvYVl37unZX14KKZdW1l11Xf4pdbKD03qT3FkpISO890++9vz9CIp2USWU+z8PzkLl33ntumfd+3/Oe9xxBURQ8ePDgwYMHDx6agtjWBnjw4MGDBw8eOi4eIeHBgwcPHjx4aDIeIeHBgwcPHjx4aDIeIeHBgwcPHjx4aDIeIeHBgwcPHjx4aDIeIeHBgwcPHjx4aDLq82w/59rQuqWjgiC4y54GoygKR48e5bbbbqv/5+HCweVysWDBAn7++Wf27dtHUFAQgwcPZtCgQQwcOJCAgIA2eS6bQlVVFT/88AMff/wxV111FQ888AAmk6lVjv3SSy8xfPhwLrroIjQaTf3niqJQXl7O999/zxdffEFCQgI333wzSUlJBAQEoFKpWsW+hlBVVcX27dtZtGgRR44cYdCgQVx//fVERUWd9TuyLJOXl0daWhqZmZnk5eWhVqvp1q0bffv2Ped33cmsWbP44osvmD9/PnFxcR3mmW0rKioqWLFiBV999RWZmZlcdNFFjBs3jhEjRmAymRAEAUVRkCQJURQRRc9Y2c2c8QE9n5A4DYfDQVlZGSqVioCAgOab1QzUajU2m43ffvuNm266CbW60afjoYOyZ88ePvzwQwBuuukmhgwZQlJSEgaDocN1xmazmdGjR7N69Wq2bNlCYWEhXbp0aZVjx8XFERMTc1qHKwgCvr6+XHvttQiCwBdffME///lPunfvTnx8PD179qRv375ERkaeJEBaC0VRqKmpYe/evSxZsoSVK1ciSRIGg4EffvgBQRC49dZbCQwMPO27siyzYsUKPvvsM7Kzs7Hb7eh0OmRZBmDkyJH89a9/JTY2tsXPIyAgAFmWKSwspGvXru1KoLVHfHx8mDJlCt26deO3335j8eLFbNiwgaFDh3LdddcxePBgBEHwvAtamUZd7ZqaGlasWMEvv/zCmDFjmDFjRkvZdV4EQUCv1xMVFUVhYSGexFoXBkVFRfzxxx98++23lJaW8sQTTzBp0iT0en2HExAnotFoMBqNWK1WtFptqx33iiuuQKvVnnHkJggCfn5+XHPNNURHR7Njxw7279/P4sWLmTdvHqGhofTv35+RI0fSr18/zGZzi94DRVFwOBwcOHCAzZs3s23bNg4ePIjVamX48OFMmDABPz8/vvjiC+bMmYMgCFxzzTVERETUv6BlWeann37i7bffBuCqq64iMjKSgIAAXC4Xa9asYdGiRQiCwN13393inokRI0bwzjvvsGbNGlJSUlrNE9WRUalUJCcnEx0dzciRI5k7dy5Lly5l586dXH/99Vx33XX4+vq2tZkXFA0WElVVVcybN493330Xk8lEeHh4S9rVIIxGIxMmTKC8vNyj5C8AcnNz+eyzz5g7dy5eXl7ccsstjBw5EoPB0NamNRtZlnE6nTidTux2e6sdV6/Xn3O7IAj4+/szfvx4hg8fTn5+fv2UwIYNG/j9999ZuHAh8fHxjB49milTprh9WklRFIqKili2bBkrV67k0KFDVFRUEBkZyahRoxg8eDB9+vQhNDQUURQxmUz8+9//Zvbs2axcuZKhQ4cSHByM3W7nyJEjLF++nLi4OB577DFSUlLqvViKotC7d2+0Wm39M3bHHXcQFBTktnM5lbi4OBITE1m2bBm33347RqOxQwvi1sTX15eAgACOHDlCTEwMPj4+/Pvf/2bHjh3cfvvtDBgwwHMtWwnhPCP5+o1HjhzhH//4BxaLhccee4xBgwZhNBpb3sJzIEkS5eXluFwuQkJC2tQWDy1LaWkpn376KV9//TXjx4/nyiuvJD4+Hl9f304xD2qxWPjss8/44osveOqpp5g2bVqLHq+6uhq9Xt9kF7DNZqOwsJCMjAy2bNnCypUrSU9Pp2fPntx5552MGTMGtVrd7I48PT2dOXPmsGzZMrKysggPD2fEiBEMHDiQmJgYwsLC8PX1PWkgIUkS6enpbNq0iSVLlrB3716cTicxMTHY7XaSkpK444476Nmz52n2KYpCdnY27733HkuXLuXOO+9kxowZeHt7N+s8zsVHH33EK6+8wvfff8+gQYM8g6IGsn//fv7xj3+wbds23n//fRITE1m4cCGff/45Pj4+3HXXXVx//fVtbWZn44w/6AYLierqag4ePIjJZKJr166t6n71cGFTVVXFt99+ywcffMCYMWP4+9//TlRU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a9asYcmSJbz22mukpKTwzTffcPvtt/P++++zZcsWiouL64PNGopWq+X+++9n+PDhnW7VS1Noyst6xowZxMbG8r///Y+ioiK3vPAVRaGsrIwVK1YQHh5OQUFBs9vsLKSlpaEoCs8++yzTpk1rt8nncnJyTsqCGhkZSU5OTpPacjqdfPnll0yYMOG0bZ9++ikTJ05ssp0txTmDLc1mc2vZ0ST8/f154YUXqKiowGKxkJmZicViAagf3ajVasxmM0FBQR0+jXJnQ1EUqqqqyM3NZePGjbz44ov07t2bN954g/j4+LY2r03R6/UkJiaSmJjIjBkzWL16NZ999hlff/01H3/8MdOmTeOhhx5q1AoCURTp1q1bC1veuYmMjOSGG27gpZdeYv369UydOrVJgavK8XTfVVVVlJSU8P333/PZZ5+RnJzMW2+95emnqL1GEydOZOzYsRiNxnZdP+NMgrKp9/Dee+9l5MiRjBgx4qTPV65cyaeffsq6deua1G5L0n7vTAMQRRE/Pz/8/PzYt28fM2fO5MCBAyiKgtForHehxsXFccMNNzBy5EhPLvt2giRJHDt2jAULFvDLL7+QlZXFgAEDeOmlly54EXEqarWaSy65hBEjRrB3715+/vlnvvzySxRF4bHHHiMiIqKtTeywKMdz4zSGq666ip9//pmPPvqIQYMGNSi3RN3UXXl5OWVlZZSWlpKZmcm+ffvYsmULWVlZXHnllTz55JOe5Yr8+WLuKEX4IiMjycrKqv87Ozv7tBwtkiTRv39/AKZMmcILL7xwWjszZ86kqKiI//znPyd9vnv3bu644w4WLlzY5sUyz0SHFhIn4uvry8iRI+nevXt9vn273U5mZibp6en88ccf9O7d2yMk2gEul4stW7bw3//+l507d9KrVy/uuusuxo8f36LLHjs6Wq2Wfv36kZSUhJ+fH++++y46nY5nn332vM+11WqloqICLy8vvLy8WsnizklgYCB33303Dz74IF9//TX333//WQuWORwOioqKyMjIIDU1lT179pCWlkZeXh6SJOHr60t4eDgzZszgqquuuqBrbbhcLiwWC3q9vj6rYke5FgMHDuTw4cOkp6cTERHBd999xzfffHPSPiqVip07d561jf/9738sXryY5cuXnzT1mJmZyZVXXsmXX35J9+7dW+oUmkWnERIRERHcf//9p31e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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "mapMisc.static_map_vector(sel_country, \"shapeID\")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \n", + " \n", + " \n", + "
shapeNameshapeISOshapeIDshapeGroupshapeTypegeometry
8Apac29229248B63806553713105UGAADM2POLYGON ((32.58712 1.65118, 32.58642 1.65264, ...
29Buyende29229248B78054244522655UGAADM2POLYGON ((32.82026 1.47501, 32.82078 1.47207, ...
30Dokolo29229248B79330670222430UGAADM2POLYGON ((33.13554 2.10861, 33.13529 2.10698, ...
46Kaliro29229248B95132583956705UGAADM2POLYGON ((33.33503 1.07730, 33.33547 1.07707, ...
49Kamuli29229248B80079273075066UGAADM2POLYGON ((32.93538 1.22259, 32.93572 1.22041, ...
\n", + "
" + ], + "text/plain": [ + " shapeName shapeISO shapeID shapeGroup shapeType \\\n", + "8 Apac 29229248B63806553713105 UGA ADM2 \n", + "29 Buyende 29229248B78054244522655 UGA ADM2 \n", + "30 Dokolo 29229248B79330670222430 UGA ADM2 \n", + "46 Kaliro 29229248B95132583956705 UGA ADM2 \n", + "49 Kamuli 29229248B80079273075066 UGA ADM2 \n", + "\n", + " geometry \n", + "8 POLYGON ((32.58712 1.65118, 32.58642 1.65264, ... \n", + "29 POLYGON ((32.82026 1.47501, 32.82078 1.47207, ... \n", + "30 POLYGON ((33.13554 2.10861, 33.13529 2.10698, ... \n", + "46 POLYGON ((33.33503 1.07730, 33.33547 1.07707, ... \n", + "49 POLYGON ((32.93538 1.22259, 32.93572 1.22041, ... " + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "focus_districts = ['Apac', 'Dokolo', 'Kamuli', 'Kaliro','Buyende']\n", + "sel_districts = sel_country.loc[sel_country['shapeName'].isin(focus_districts)]\n", + "sel_districts" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Error mapping specified column, defaulting to index\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiYAAAIuCAYAAACLncMrAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOydd3gc1dWH39lepV31aknutuTeG8bGuNDBYHpCTKhJKIEACSFA+EINJIQWwNSEUEyzAQOm2tjYuDe5N8nqbVerXW2dme8PsYuF5SJZ0q6keZ/HD2h2dubs7sydc88953cEWZZRUFBQUFBQUIgFVNE2QEFBQUFBQUEhjOKYKCgoKCgoKMQMimOioKCgoKCgEDMojomCgoKCgoJCzKA4JgoKCgoKCgoxg+KYKCgoKCgoKMQMmmO9ePPNN8vLli3j73//O6eeeioazTF371JIkkRFRQUqlQqTyYTRaESr1UbbrHYhFArhdDpRqVQkJCRE2xyFViDLMm63m4aGBiwWS7sdVxAEDAZDl7jGi4qKyMjI6DBba2tr2b17N7m5uaSmpqJSKfMzhdjG6XTyyiuvcPXVVxMXFxdtc9oToaWNx/Q0woPDSy+9xIABA8jKykIQWjxOl0OlUpGenk5jYyMNDQ34fD5MJhMmk6lLD1SyLOP3+/H5fKSnp0fbHIVWIggCFosFtVqN2+1ul/tNlmVkWcbr9WI0GjGZTKjV6nawtmPo6DHG5XLx8ccfM3HiRE4//XR0Ol2Hnk9B4WSx2Wzceuut0Taj0xCOJbBWXFwsL1u2jIcffphzzz2XvLw8Lr744ojH5vV6CQaDWCyWLv0wD4VCNDY24vP5EEWRhIQEdDpdl3TCQqEQVVVVxMXFteuMW6Frc/g1HgqFSEhIQK/Xx9w17vf7qaurIzk5ucMitKFQiD179mAwGMjOzu5WkWAFhS5G6yMmvXr1YtKkScTHxxMXF4ff74+8VlVVxWuvvcby5cs57bTTSElJYfDgwfTv3x8Ao9EYc4Pe0dBoNMTFxWEwGPD7/dTU1KDX60lKSoq2aa1ClmUaGxsBMJvNUbZGIZY4/BoPBALU1dUBkJ6eHlP3qcvlwmw2d2hER6PRMGjQoMjfgUCAqqoqEhMTMRqNHXZeBYXWIkkSK1eupK6ujlNPPZX4+Phom9QpHHeqEB60rFYrl1xyCZIksXjxYl544QV8Ph979+5lw4YNqFQqsrOzyc3NpaGhgbvvvptx48bF1KB3PHQ6HVqtFp1OR319PTU1NSQkJHSZaJAsy9TV1XWrJTeF9kWn00X++Xw+Dh48SHx8PDabDUEQon7dBIPBTneqHQ4HDz30EP379+c3v/mNEkFRiBmcTifLli0jJyenS+SHtRfHvQNlWUYQBAoLC9m2bRtvvvkma9asoV+/fvzxj3+kf//+bNu2jdWrV/P999+zfv16Jk6ciMFgoL6+Hr1ejyiKqFSqLhFFEQQBnU5HQkICdXV11NXVYbfbY3pNHpp+p8rKyi5hq0L00Wq1aLVajEYj9fX1lJSUYLfb0el0qFQqNBpNVO/Vzjx3UlISf/jDH2hoaOgykxCF2CMYDFJSUoLP52u3Y8qyzAUXXAA0JYV3RQwGA1lZWa1yrI6ZYwLITqeTRx55hDfffJOKigpGjRrFgw8+yOTJk494ANbV1fHWW2/xxhtvkJeXR2JiIv369UOtVmM2mzn//POxWq1t+3RRIBgM4nA4UKvVxMfHx/RMyuv1UlNTQ3p6ekzbqRCbBAIBHA4HgUAArVYbyU/SaDQRZ6WjEUUx4lxHe0ll586d+Hw+hgwZojj6CifEgQMHsFqtJCYmnpRjLUkSwWAQrVbb5R1lWZapra2loaGBvLy8lnZp8Ys6rmMCTeu+H330EatXr2b69Omcd955R/3iA4EAK1asYOHChWzYsIHdu3fTv39/hg0bxj333EN2dnYrP1p0CQQCOJ3OyBp9LD70g8EglZWVJCQkdImolEJs4/P5cDqdQFP1Wnimo9FosFgsHXZ9OZ1OAoEAdrs96mHr//73v6xbt44HH3wQk8kUVVsUugY7duxg4MCBJ31/uN1unE4n6enp3cIplmWZnTt3NsvrOoy2Oybhg4uiiFqtPu4XL8syTqeTwsJCXnvtNT744AOGDh3KlVdeyezZs9Hr9WzcuJHRo0d3iWQev9+P0+lEq9USHx8fUxdL2CMFlGUchXYlXHre2NiIJEmRbdCUqxIua24PvF4v9fX1xMXFxYQj4Ha72blzJ8OGDUOr1SKKIqFQCI1Go9xjCi2yY8eOoz18W0VDQwPBYBCbzdblIyZhjvHdnJxj0hZkWaakpIRXXnmFV155BVEUGTduHNdffz2LFy9mxowZnH322Sdzik7D7/fjcDjQ6/WRRMFYoKGhAY/Hg91uR6/XR9schW5MuORYlmVCoRCBQABZltFqtSQkJLT5gS2KIg6HA0EQsNvtMTkY79u3jzfffJMhQ4Ywa9YsDAZDtE1SiDHayzEJP5Pb8oz5xz/+wYIFCxAEgSFDhvDKK6+06lr96quv+MMf/oAkSVgsFl599VX69u3bajt+Tkw5JtD0JdfX17N+/XreeecdFi1axCmnnMJVV13FsGHDyMzMBGDr1q188803TJ8+ncGDB8fk4BQIBKiuriYuLi4mcmXCzpLZbO7QELuCwuGEo6fBYBBZlgkGg7hcLmRZRq/Xk5iY2KolT7fbTX19PampqTG5VApNE4Cvv/6a+Ph4xo8frzgmCkdwxMO30UU7PEIPQwDT0VVfS0tLmTx5Mtu3b8doNDJv3jzOOOMMrrrqqhM+Q//+/Vm0aBGDBg3i2WefZc2aNbz66qsnbXlrHZMOHwUEQcBms3HqqacycuRIsrKyeP7558nIyGDatGmR/Ww2G9BUuidJEiqVCq/Xi9vtxmKxYDAYOvXBGy69/fLLL2loaGDGjBnk5OSQnJxMaWkpdXV12Gw24uLikGUZSZJwOp2o1eqI03Iiy15tRZIkPB4P0KRZojglCp2FIAhoNJqIEyFJUmT5xefzUV5ejtvtxmQyRZwNQRBQqVTNrtOwU1NfX4/dbo9ZpwTAYrEwZ84coKmiSZIkysvLqaysZPDgwYqjotAC7emUnNjxQqEQXq8XrVZLY2MjGRkZrTqDIAi4XC4A6uvrW/3+9qLTRgK1Wo3NZuOWW26hurqa9957j+HDh3POOedgtVrJysrit7/9bbOBa+3atTz55JNceeWVnHXWWR0+cImiCDQl/EmSxObNm/n3v/+NwWAgIyOjWcnT/PnzmTx5MrfeeiuSJOF2u3nyyScxm8388pe/xGAwYLFYIgqy7VnZIMsyHo8Hj8ejaJYoRB2VSoVKpUKWZSwWS6Six+fzUVtbSygUQqfTER8f38ypkWWZhoaGSNlyLBO+h8OIosiWLVv4z3/+ww033MCUKVOiaJ2CAmRmZnL77bfTq1cvjEYjM2fOZObMma06xoIFCzjjjDMwGo3ExcWxevXqDrL22HT4Uk5LlJaWcuutt7Jq1SouueQSBgwYQGpqKqNHjyYtLS3yoPX7/Rw6dAir1UpKSkqHPoB9Ph/r1q1Dq9UybNgwDAZDi2t94chIWVkZwWAwYldJSQkvvPACLpeLO+64g969e7N582bMZjMZGRkR2X61Wo3BYDipBLpgMEhFRQVJSUkxP6ArKMiyjM/ni6jNqtVq7HY7oVCI2tpaevXqFWUL20YoFMLlckUSgRV6Nkcu5dS3/0lMRy8WcTgczJ07l7fffhubzcZFF13EhRdeyBVXXHHCh7/gggu48847GTduHI899hi7du1iwYIFJ212a5dyopLIkZmZyV//+lcmTpzIv/71L6655hp++ctf8sgjj7Bp0yY8Hg+iKKLX6+nbty+pqakIgkAgEGD58uXU1NS0u00ul4sVK1awb9++SAVCS0qY4YZ/WVlZDB8+nKSkJJYvX87jjz9OIBAgLS2NBx98kM8++4yvv/6aPXv2EB8fTygUwufz4fF4cDqd1NbW4nA4EEWR4ziHzRBFkdra2khHZAWFWEcQBIxGI5mZmWRmZiJJUsRR6WptHw5Ho9GQkJCgOCUKMcGXX35JXl4eycnJaLVaLrjgAr7//vtm+4iiyPDhwxk+fDh/+ctfmr1WXV3N5s2bGTduHAAXX3zxEe/vLKK2qNu/f38eeOABhgwZwkcffcS6det48cUX2bx5M3369MFoNGIwGMjLy2PcuHH06tULvV7Pp59+yp49e7j66qvb1Z6w5H5YCwSaIhM1NTWo1WoSExNRq9XU19eTlpYWCeuuXLmSb7/9llmzZnH66acTCAR44oknWLFiBY2Njfj9fmbMmBGJrIQrG0KhEJIkHeFkCYJwTEdFkqTIgKig0BXR6/XU1dVFcse6A3v37kUQBHJycmI6V0ah+9KrVy9Wr15NY2MjRqORr776itGjRzfbR61Ws2nTphbfb7fbqa+vj2iPffHFF+1SZdQWorKUEzn4j7kSW7duZf/+/TQ2NvLiiy+yfv36Zg/gXr16YbPZKCgoIC8vj2nTpjFkyJB2Ob8sy0fkfoT1G7744gs+/vhjjEYjRqMRu91OdnY2cXFx9OnTB4/Hw6ZNmyLNDo1GY0TszOFwUFtby+eff05mZia//vWvUavVzdapJUnC6/VGIjRwfMcEmpJdY7FqSUHhRAhHC7Ozs7tsF++f8/7777NixQr+9Kc/dekokELbifZSDsC9997L22+/jUajYcSIESxYsKBVMhIffPABf/nLX1CpVNjtdl5++WV69+59slbHXrnwiSBJUuRfUVERxcXFVFdXU1dXx6FDh1izZg2bNm1CkiTGjh3LwoULI5Uvfr8ftVrdpt4eX3/9Ne+++y7//Oc/Iw6DLMusWbOGF198EYAzzzyTgoKCSM8gjUbDrl27WLlyJTabjVmzZtGvX78Wf3xRFCkvL+f+++/HZrNRV1fH/PnzmTRp0kl+YwoKXZNgMMjOnTtJTk6OLNF2ByorK9m8eTOTJk1SOnv3EA5/dgqCEFF+jWzzNtCZ5cKxTJd0TJqd8McoRthRCeslVFVVsWzZMl577TXGjRvHlVdeSUJCAn//+9/Jz8/nyiuvbHVY+O2338ZoNHL22WcjCAKiKFJVVcXNN9/M9ddfz5gxYzAYDEeEZkOhEHV1dTgcDjIzM4+paSLLMtXV1XzwwQe88847nHHGGdx8881KuFehxyHLMkVFRQQCAXJzc5tFD7s6rVHGVuhaBAIBKioqEAQhUgUpSRLV1dU0NjaSmZmJTqdj+/bt9OvXj2AwiE6ni1SeBYPBSOFDT702Yk7HpLWEE04PX6oIly716tULv9/Po48+ypIlS7j++us577zzCAQCAM0UKfV6fbOHf1hdUpKkSL7IxRdfHHmfy+Vi06ZNfP7554wZM4bx48cfVRpbq9WSmpqKTqeLnPtYnyclJYVrr72WUaNG8eabb1JYWMiQIUOU5RiFHkU4oT0+Pr5bOSXwk7aLJEm4XC5MJlPU+/0otA9VVVXcfvvtGI3GiNiY3+/nlVdeYePGjTz++ONkZWUBTcURDoeD1NTUiOhld7vWO4OYc0yOhVarZd68eSQmJrJixQree+89LBYL8+bNw2AwEAqF2Lx5M99//z0zZ85k4MCByLJMRUUFH3/8MQcPHiQ/P5/zzjsPk8mEJElUVFSwZcsW1q1bx7p16zj11FO56qqrjlvxIooikiSdcNmvIAj079+f3NxcXn75ZS644AJGjhypKLYq9BhaqnLrbvj9fj788EP69evHxIkTo22OQjuQlZXF3Xff3az6ymg0csMNNxAMBrHb7cBPYqLx8fHKpPMk6VLfniAIJCUlcfHFF3PvvfcyceJEXnnlFb799luCwSDQfCkojMfjYdu2bRgMBvr37x/xYPfs2cO9997LTTfdxKJFizj//PO56qqrTqgXjt/vJxQKtarhmNVqZerUqRQXF/P73/+e5cuXEwqF2vBNKCh0PcK5YN2ZcJh/79690TZFoR0ZNmwYffr0afZciI+PJykpqdnktKcv2bQXXXaUSEpKYs6cOXz++ef89a9/JTs7m169ehEXF8fVV1/dLAEtNzeXe++9N1JdA01JeP/4xz9YvHgxF110ERdccAFjx449IU2C8HqyLMutCtMJgsCAAQOYPXs2f/3rX/nqq6845ZRTlJCvQo/BYDDg9XoJBALdMsSt1+u54IILIu0iFLoPsizjcDjYv39/pOu0QsfQZR0TgIKCAgoKCnj77be58cYbMRgMOBwO4uLiMJvNjBw5kl/96lfk5OQcofuxdOlSPvvsM8444wzuuecekpOTTzj8FtYiiYtrfYa0Xq/n/PPPZ8uWLSxbtoza2lplOUehx2AymXC73ZEEwe6GIAjEx8cTH3/ssk6FrklZWRnPPfcc11xzDePHj4+2Od2WmKvKaQ2yLFNeXk5NTQ07duygvLyc/v37k5qaSnV1Na+//jr79+/nzDPPRKvVMmjQIBISEti7dy+vv/46Op2OBQsWtKrfTFjjpKamhszMzDY5FLIsU1payv/+9z8MBgM33nhjtw9xdzZiKITwYw8XhdiisrISo9GI1Wrttg55KBTC7/ej0+mUmXU3wu12s2vXLlJSUsjOzm722jEqTzqFQ4cO8Ytf/IKKigpUKhXXXnstN998MwCbN2/m+uuvx+12k5ubyxtvvNGqifWiRYu45557UKlUaDQa/vnPfzJ58mQAPvvsM26++WZEUeTXv/41d9111xHv7/Llwq0lbH84tyScYCfLMvX19Xz22WfU1tZGFGMBBgwYwLx58zjnnHOIi4tr1eAoyzJOpxNRFE9KSEmWZT799FMee+wxHnroIQYPHtymCIzCkVRXVrB+1UoEQcBkNpPXbwBZObnRNkvhR0KhEJWVlSQnJ3fLqAnAli1beP/99znnnHMYOXJktM1RaCd+rl3i9XoRBAG9Xs/OnTubPXwb5s1EdtS227kFeyLWd5Ye9fXy8nLKy8sZOXIkDQ0NjBo1ig8//JDBgwczZswY/v73vzN16lRefvllDhw4wAMPPHDC53a73ZEu9lu2bGHevHns3LkTURQjKrFZWVmMGTOGN998k8GDBzd7f5cvF24tYafi586FIAjY7XYuvfRSJEni0ksvZdu2bUiSxPDhw08owbUlJEmivr6enJyck7Z76NChqFQq5s2bxwMPPMC8efOU/jcniSiKbPxhFWNGj8RiNlNaWsaeHYVk9uqFICjRk1ggXFYrSVJkMtHdsFgsZGdnK/dzN+Pn1+q6devYv38/F1544RH7tqdTciLHS09PJz09HWgqtBg0aBClpaUMHjyYXbt2ccoppwBw+umnM2vWrFY5JofnXno8nsj3sGbNGvr27RtRh73kkktYtGjREY5Ja+kRI7VKpSIxMZGpU6cybdo07HZ7mwdDv9+PXq9vl8E0KyuLO+64g9TUVLZs2cLmzZsRRfGkj9uTqa2uwmKxkJiQgF6vJy8vF71Ox5rvlrNz2xaK9u+jqqKc4HH0ZxQ6FqvVisfjaVUDy65Ebm4uv/jFLxgwYEC0TVHoQPR6PVu3bj2unlVnc/DgQTZu3BhpyFdQUMDixYsBWLhwIYcOHWr1MT/44AMGDhzImWeeycsvvwxAaWlpsyWtrKwsSktLT9r+HuGYtCcOhwObzdZux5s6dSq33nor9fX1LFy4kF27drXbsXsijtoaEuy2yN+CIDBqxHAy0pJRiUGcVeXs3b6NVcu+jp6RCsTHx9PQ0NBtHROVSoVWq1VynLo5Y8aM4c4774ypZGe3283cuXP55z//GUkPePnll3nmmWcYNWoUDQ0NbVpCPf/889m5cycffvgh99xzD0CL9297TNqVu6YVyLIcUZVtL/R6PWeffTbTp09n06ZNLFiwgPLy8nY7fk/D5XQSF9e8RYBeryM7K4v+/foybOgQJowbg7uhgVAoGCUrFcJKqWH9IQWFroggCK2q6OxogsEgc+fO5fLLL+eCCy6IbB84cCBLly5l/fr1XHrppfTp0+eI9959990MHz6c4cOHH/Mcp5xyCvv27aOmpoasrKxm0ZeSkhIyMjJO+nPExrfZRaipqSEhIaFd18QFQcBisTB27FgGDRrEF198wRNPPEFVVVW3nU12JD5vIybjsUXvBEHAarXicjo7xyiFFklKSqKmpibaZnQIVVVVvPzyyyxfvjzapih0Ao2Njfh8Prxeb9RskGWZq6++mkGDBvH73/++2WtVVVVAU47k//3f/3H99dcf8f6//e1vbNq0iU2bNh3x2t69eyPPow0bNhAIBEhMTGTMmDHs2bOHAwcOEAgEeOuttzjnnHNO+rMojskJIssyPp+v1Y0CTwRBEIiLiyMpKYlp06axefNm3n333Zhbt4x1ZFnC5/Oh1R2/PNMWH0d5SUkzhWCFzkWr1UZaO3Q3RFGktraWhoaGaJui0AkEg0H8fn9Uf++VK1fyn//8h6+//joS+ViyZAkAb775Jv3792fgwIFkZGTwq1/9qlXHfu+99ygoKGD48OH85je/4e23345EPZ9++mlmzZrFoEGDmDdvHvn5+Sf9Wbp8uXBn4fF4cLvdJCYmdpjmiN/vB5qSjJ577jnef/99EhMTO+Rc3ZEDe3ZRXlzEhPFjjxvV8nga2bx1K16vj9y+/cjt2w+1ussXqXUpJEnC6XRGKui6E4d3lVU0iro/kiRFuguHl/o7u1w4lulx5cKdhcvlwmq1duggE76gc3JyqK6uxuPxKI7JCVJbXc2eHduZOGHcCS21mc0mJo4fh9NZz559+yk7VMzEU09DrTxEOg2VSoXZbKaqqqrbOSZKV9meRbhHzuH5h13ViYgFlKWcEyAQCKBWq0+4k/DJIEkSwWAQSZJwOBwdfr7uQtmhIvr0zsNyWI+kE8Fmi2f0yOGYTUYKN2/sIOsUjka4esXn80XbFAUFhRhBcUxOAI/Hg0ajaddqnJbw+/28+eab7N+/H7VaTVlZWYeerzuhVqvbnCwsCAJD8gdTXVFORdnJ1+ArnDhqtRqj0djtcjECgQBLly5l2bJlShJ7D0EURerr6yNL8gptR3FMjoMsy4RCIVSd0HdFEAQ2b95MKBTCbrfz/fffd+j5ujpbtmzhpZdeori4GJfT0ayjdGvRarWMHD6MLevW4G1sbPYwkWU5olJ6OOFth28/XNFUeSAdn3AIPBQKdavvSxRF1q9fz8aNG7tlcq/CkYQdk1AoFG1TujyKY3Ic3G430FySt6PQarXccccdzJs3j3HjxvHFF18o7dOPgd/vp7KyEre7AafDQUpy23sXAdjtNvR6Pb+/9RY+/PDDyPYDBw5wzjnn8PTTT0e2VVVVce2113LrrbdGtDjq6+v529/+xpVXXsnDDz/M448/rjyUTgCDwYBWq+1WURO9Xs/8+fO57LLLYkbjQqFj0Wg0pKSkKG0I2gEl0+8YyLKMKIoIgtAp+SWCIESSXU855RQ+/PBDli9fzpw5czr83F2RkSNHMmzYMCrLSklKTGyX3yg7K4t555/HqImTI9t69erFP/7xDxISEiLbkpKS+POf/9yse6zVauXXv/41gUAAv9/PSy+9RDAY7PAlwK5OOH8rEAh0m945KpWKlJQUoH2UMBViH5VKpdzr7YTiyh+DYDBIIBDAaDR26uAiiiKjRo1ClmWWLFmizLqPglqtRqfT4Xa5iI9vn87MuTnZCEgc3L0Lz4/RMo1GQ79+/ZpVSKlUKnJzc8nIyIhcGyqVivT0dHJycujfvz+PPPKIMlCdAIIgoNVqIyW23YVwp3OF7k94GTIWfnNRFBkxYgRnnXVWs+1PPfUUAwYMID8/nzvuuKNNx167di1qtZp33303su3JJ5+koKCA/Px8/vnPf56M6RGUiMkxCAaDhEKhk8pdaC0ul4uvv/6aMWPGkJubS2FhIT6fD5Pp2GqmPZlgMIDR1D7CdyqVivFjx7B3/wG++/JzDEYjKpUKV309M88+D10bHI3Gxka8Xi9xcXGR6IpCc8xmc+R76i5ltrt27aKhoYEhQ4YoDmo3RpZlXC4XXq+XUCgUkZS4I60vrsqqdjtPXGoKj1bsPe5+Tz75JIMGDcLlckW2ffPNNyxatIgtW7ag1+sjSrCtQRRF7rzzTmbNmhXZtm3bNl588UXWrFmDTqdj9uzZnHnmmfTr16/Vxz8cJWJyFCRJwu/3d/p6oc/n47333qOqqorBgwdHnCOFoyNLUruu4xsMBgoGD+K0aVMZNiSfgN+HxWpF28YHZnFxMS+99BKbN29uNxu7G4IgoFKpIsnD3YE1a9bwySefRPLUFLovpaWlRzSlbE+n5ESPV1JSwieffMKvf/3rZtufe+457rrrroiDHF5mbA1PPfUUc+fObfbeHTt2MH78eEwmExqNhqlTp/LBBx+0+tg/R3FMjoIoing8HqxW6/F3bkfsdjs333wzvXr1Aui0/JaujCRJqDogfKrVanE4nFjjbEyZMavNIdqEhATS09NbrOxR+Amr1Yrf7+82rRgmTJjAOeec06kRV4XokJ6eTlxcXNTH6ltuuYVHH330iIna7t27+e677xg3bhxTp05l7dq1rTpuaWkpH3zwwRE9dgoKCli+fDm1tbU0NjayZMmSZk392oqylNMC4aRXWZY7XU5ap9MxZswYQqEQ9fX12O12Jcv7OHjcDfTKTOuQYx8sLmbkuIknNeAkJydzwQUXRAaLw9ejFX5Cp9M1K7fu6t9P7969AeV37u4IgoDNZsNgMES1Auvjjz8mJSWFUaNG8e233zZ7LRQK4XA4WL16NWvXrmXevHns37//hK/NW265hUceeeSIcXDQoEHceeednH766VgsFoYNG9Yuz0wlYtICsixTVVVFenp61M4viiINDQ307t1bKTc8Bo66Who9Hmzx8e1+7EAgQMAfIM52cnLpgiBgNpsjSdQOh4Pq6upus2TRXgiCgMlkovFnOjJdCVmWI9VFYe0jxTHpvsiyHNWOwoezcuVKFi9eTG5uLpdccglff/01V1xxBQBZWVlccMEFCILA2LFjUalUR3T2vvvuuyPN/37OunXruOSSS8jNzeXdd9/lxhtvjEgqXH311WzYsIHly5eTkJBw0vkloDgmLdLY2IharY5aomJtbS2rV6+mtraWvn37RsWGroC3sZENq7+nIH9wh4RQHc56bPaEdncMlyxZwl133aVo1LSAzWbD7XYjimK0TWkTfr+fzz77jJqaGpxOJwcPHoyZB5dC++NyuXjttddobGyMtik89NBDlJSUcPDgQd566y2mT5/Of//7XwDOO+88vv76a6BpWScQCJCU1Fz36W9/+xubNm1i06ZNRxz7wIEDHDx4kIMHD3LhhRfy7LPPct555wFEEmmLi4t5//33ufTSS0/6syhLOT8jEAhQW1tLZmZm1Gw4cOAAjz32GGVlZeTk5ETNjljGWVfHulUr6J3Ti4z0jlnGkSQJVQc4POeeey42m63dj9td0Ov1BAIBNBpNl4s2eDwennzySfbt28fAgQNZuXIlV155JQMGDIi2aQodwP79+9mwYUO7PIw7kvnz5zN//nwKCgrQ6XS89tpr7XZvzZ07l9raWrRaLc8880y7NORUHJOf4XA4sFqtUV0+6du3L3l5eWzbti3qyVSxSGnRQQo3b2RI/mDSO8gpgaZy8Y74/q1WazONAb/fH2lmp9CUAF5bW9tlSuTD5aL79u1j9erVrF69GpVKxbBhw5gwYYLihHZjcnJyuOOOO1pUBo9LTWn3cuET5dRTT+XUU0+N/K3T6SLRk5Pl1Vdfbfb3d9991y7HPRzFMTmMcLlXtB0Tu93O4MGD2b17Nzt27FCUXw+jsqyM7Vs2MWHcmA6vmPL5fJg7uBWBJEl8/PHHVFVVMW/evGYibj0Vg8EQ85U5kiRRW1vLli1b2LhxI4WFhezbt489e/ag1+uZMmUKw4YNw2azKTli3ZiEhIRmitCHcyKaIwotozgmPxIKhfB4PJF67GiTnJxMnz59KC4u7hYVCu2B3+djy/o1jBoxvFPKuA0GA3X1HatBIQgCGRkZVFRU4PP5gKb+TJ9//jklJSWcf/759OrVC1mWqa6u5tChQwwcOLDbl6DGx8fjcDiOOuhHg/BvsGbNGpYtW8aGDRsoLy+noqKC+vp6JEnCZrPx61//muuuu05xMhUU2kj0n8AxQkNDAxqNBovFEhNOQH5+Pi+++CIFBQWUlJSQnZ0dbZOizraN68nKzCAh4eTXME8EtVqFKHasuJ0gCIwePZr8/PzI0oVWqyU9PZ1QKBRRQZUkiTVr1vD2229z/fXXM2nSpEj1VrjyIxau2/bCYrFQXl4edcdEkiQOHTrE0qVL+eabb9iyZQu1tbXU19fj8/nQaDTo9XpGjhzJWWedxZlnnkmfPn2w2+2IokgwGESj0cTEZEehY/juu+/weDxKPmA7otwtP3J4eV8ssG7dOhoaGvj0009JT0/nd7/7XY+Wta4oLcHldDB88sROO6fb7UFvaB+p+2Oh1Wqb5ZfodDrGjRvHmDFjIjkuKpWKWbNmMW3atMh1EF4GGjBgAAMGDOhWjknY2RJFMap5VrIss23bNh555BEOHjwYqRay2WwMGDCAKVOmcN555zF8+HAsFkuz33H//v385z//4cwzz2TcuHHR+ggKHUxjYyOLFi3ipptuUqLbLdCW0n/FMYlRwiJrFRUVrFmzhnfffZfTTz+d5OTkHnfhh0IhCjdtYNjQgk57SEmSxMGiYiZNP71Tznc4YbXfwz9ruNHd4Q8+WZbZtWsX27dv5w9/+EPMONXtgUqlwmq14nQ6o7okolarmTBhAhdffDH/+te/cLvdaDQabr31Vq677jpSU1OP+l6j0UhGRkaXSeJVaBszZswgPz+fYDBIbW0tiYmJPW6MPhqyLFNbW4uhlRM84TjeTNdUOWolkiThdDpRqVQxl0Hv8Xh49913ef7555k3bx7z588nLq59Oul2BWRZZtOa1QiSyPBhQzrtvDU1tezcs5fJp83stHO2Ba/Xi8vlIiUlpdsNhl6vl7q6uqiW7ofZuHEjt99+O9988w2JiYmsWrXquBpDhy+1dSensTsgiiJVVVV4PB6ys7PbJRodDAYpKSmJ5IopNGEwGMjKyjpa1WGLg5YSMaGpXFMUxZhMKDSbzcyZM4eVK1fy5ZdfcuaZZ/Yox2T39m24XfVMHD+2U89bU1tLUsrRZ8OxgtFojLQsaGxspLy8HJvNpiReniDhUl+n00lGRkazwVOSJEpKSli1alUktwQgNzeX5OTk4x5bEAQltyRGCYVCrFu3LqJB0r9/f4CIfs6JOpKiKLJmzRqGDBmCxWIhLy+vI83uMSh3DU0XqSRJMddu3ev1UlhYSO/evTGZTKSkpPSosPDBvXsoLTrIpAnjOnwJRxRFfH4/3kYvtXV1FB0qYcIp0zr0nO2N2+1m4cKFxMXFceWVV3Z6A8qOQmrn7tEtsWnTJl555RUGDhzI+PHjcTqdfPrpp3z77bfs3r2bsrKySAlzWVkZX331Feeffz7Qsb1wfD4fer2+20XDooUkSXzzzTdYrVYKCgpITExslmD93nvvIcsyl1122Qkdb+3atTz77LM8/vjjLWqZKLQNxTH5kVirapBlmbq6Oh5//HHOPPNMioqKmDVrVpvaVXdF9u/ayYG9uxk/dkyHJP3Kskzh9p1UVVfj9/uRZRm9Xo/JbCHOZmPStNOwWLtWZMpms3HGGWcgSVLkOwsEAhQVFZGdnd3qdd5oo9PpMBqNkWaWHYEgCFitVsaNG0d1dTXPP/88jzzyCIFAAFEUmTRpEnPnzqW+vp6FCxdGSoTvueceNmzYQP/+/fnFL37R4rEbGxt5+eWXGT58OJMmTWrT+LJ582bGju3caGF3pqSkhBdeeIHf/va35OXlHRHhSE9PZ8mSJSfsmKSnp3PdddcR3wG9unoyimMSw9jtdubPn8/WrVvx+/0MHTq024eGJUmkcNNGaqsqmDh+bId1Vna73VRUVTH+lFPRG4xdUv785+h0OgoKCoCmB2448ezmm29m2rRp3H777ZFKF7/fj06ni+nrSaVSodFo8Hq9HVrtoFKpSE1N5fLLLycxMZE///nPZGZm8uSTT5KZmYnBYECSJKZNm8add97JsmXL2LFjB0VFRfzqV7/iyiuvbNE2SZKoqKjA6XS22f6DBw+i1WoZMWJEl78+Y4H09HSefvrpozoSkyZNYsSIEUd9vyzLBIPByDJddnY2WVlZSg5RO9Pjv01ZljslVNxaBEHAaDQybtw4XC4XJpOJtLS0bj847diyGY+rnkkTxneYUwIgSTJarRaLNQ6tVtttvtefd7RNS0vjww8/5De/+U1kn7q6Ol544YUWm3XFEuHqJEEQCAaDHX6uYDDIwYMHMRgMZGZmkp6ejtVqRafTYTAYGDVqFA8//HDE+fN4PBw8eJADBw602HTQbDZz7733MmfOnDZfX6FQiIceeohdu3bhdDq7bHPDaBEMBikuLqa8vBxoKs1PSko6avsHrVZLfHx8JHH559+3w+Hggw8+YPXq1RGJifA1qtB+xNbTOAqEQiH8fn9MJr4KghDpoVJdXY3T6Yy2SSdNIODH3eDC23hkZ91DBw9QUVrCyOFDO7xvjMVixtvYSCDg79DzRJPw8qROp8NkMkUGz3By36FDh6Js4fExmUyo1epO6cQcDAaZOHEi//rXv5g9e/YRkxVBEBgzZkwzfZlvv/2WBQsWUF9ff8TxwiXebX1wSZLEsvffJXHtdzz0i0t57NFH+fjjj9mxYwc+n6+ZPoQsyzh2FlL6zRcEXEfa0lOprq7m3//+N8uXL49sO5Fl+2AwyLp163jvvffYv38/oVCT0KLT6WTNmjW4XK426XMonBixG8ftJEKhEMFgsENn5yeD0WgkLS2N/fv3s2XLFvLz87uk0Jq3sZEDe3ZTfGAfOr2eYCDAgPwhZGT3ot7poOxQEdUVFYwbO7pTkpDVajVJiYlUlpWRnduzMuntdjs33XRTtM04IcIPEUmSOly8KjExMVLNVFdX1+IyVzAYZP/+/ZGZdGpqKr179+6Q5Ozy8nLG7dtK7xQb9VIjtd98zA91NTTUVFO//EtsRhMGmx33oSKKF7+L5HFj1mpY4/WRe+6FFNx8B1pT7E24OhOdTsfYsWMZM2ZMq94niiJff/01L774Ig888AAZGRloNBry8vJ47LHHYi7C3t3o0Y5JV/B41Wo1ycnJhEIhvvjiC6ZPn06vXr2ibVarKC0uYsv6tWRkpDP1lMkYDQbcbjebtxayq3ArZrOZ1JRkTpkyCV0ndthNS02hvLSkxzkmXQ2TyYTL5cLv93daAm9CQgKSJB2xvaysjNLS0sjYkZOTw4QJE46as7B06VJMJhNjx45ttcP99fPPECfAiDgTAlAUCGHfuAI2rcSv01IP1KjV6EMh8tVgM6gRBPCbdez89EOWb93EtNffQxXDeUQdgSRJEQc2KSmJ8847r9XHMBgMnHPOOWRlZTFu3LhIBDfWiiS6Kz3riv0ZsizjdrtjXhdk6NChTJs2jW+//ZbvvvuOCy+8EJ1O1yVukIrSErasX8vY0aNITPypLM9isTBpQnRluu0JdnbuUTqAxjp6vR5JkggGg51aWdTSrFiv15Oens6ePXuQJInKykpKSkrIz89vtp8syzQ0NLB8+XJSUlIYPnx4qx0T+asljLCaUP14n+fqtWTrNARlGcPhtv3M8dCrVAzVCawpKabkq8/pNevMVp23K1NXV8crr7zCgAEDmDlzZpujr4IgkJ+ff8TvqtA59GjHRJIkvF5vzItRZWdnc+eddyLLMvfffz/ffvstjz76KDabLaadE5fTwZb1axkxfGgzpyRWMBoMTWWhoRDqHjar7EqEKyBEUYx6onpycjKPPvoo8+fPp7CwkD179vD000+TkJBAQUEBPp+P1atX88knn2A2mzn//PPJy8tr01KxPuDDam3+PrUgoD6Be14QBDLlIAfffbPHOSYajYacnJyYrjhTODY9WpI+FApRWlraJbpCSpKEw+FgwYIFPPnkk8ybN49HH3005kThwjR6PKz85kvyBw0kIz0t2uYclW+WfcfoSadgjfGoWU9HkiTKyspISkqKuh6LKIr88MMPXHvttezYsSMyux42bBjr1q3j0KFDZGZmct9993HRRRdFHKnDJxHhcfdYE4vXzziVfGc1/cxt+7yiLPOdJ0j2uXNJGjWWlNHjURsMuPbvI75vf9RdMFfteIiiSCgUiiR4x/LETQE4iiR9j3ZMvF4vDoeDjIyMaJtywoT1FMrLy/n4448jUsqxhBgKseLrL8nOTKd3Xm60zTkmTY7JFKxxikBSrFNaWordbsdoNEb9gRMKhViyZAnXX399pBQ1jMlk4rrrruP//u//jqrUXFtbiyzL2O32oybOvvL4Yxj+829mJMahb2OUyCtKlARF6lUaalwuVGo1BoMBn9+P3mJFazTR69y59Lvy6i6bKBtekg8EAjEf/VY4ghZv5B6dWuxwOJrJEXcFVCoV8+fPR5IkioqKom3OEUiSyKZ1PxBnMZOXG9uRKFmW8fp8GI09R+a/K2OxWPB4PDGRtK7RaBg0aBCnn346mZmZzRylpKQkzjjjDEwmE/v372fDhg00NjY2e//69ev56KOPjikBYOvdlwP+EHXBUJvtNKpV9DNoGa0TmJZg5TSbmVOMGk6JMzKSIIManVT/7xU+P3s6RUsW4S49hOvgfmo2bcBbVdnm83Ymfr+fZcuWsWTJkmibotBO9OhFuGAw2CVLb8844wz+9re/sWzZMkaNGhUzzlWDq56t69ei1agZPnxY1Ge1x8MfCKBWqdB0YiWQQtuJi4ujqKgIu90eE+WaGRkZ3HrrreTn5/PMM89QXFwMNEVTwg7H+vXr2bZtG+np6ZHoSSgUYvfu3ezevZsZM2a0OMsPhUIUbthAplaNsZ0+6+FRF4NKheHHP+1AdcDL/kf/yuZgEJUgoNNo8Ph8pE+ZxpBb70JjtlD69VIqvl6Kt6qSic+8jDHp+I0MOwNZlvF6vTFxTSi0Dz3aMemqWK1WLrnkEj744AN8Ph9XX301AwYM6PQbU5ZlGj1uqisrqS4vw1FXS98+vcnLzYl5pwSgtrYOmz02nLqejCzLVK1ZxaFPPiRY78Q+aiwZk08lrnffZvuFk2DDOQTRxmw2M3z4cLKysigvL2fBggW43W7q6+tZunQp2dnZZGZmkpubS3x8PKIosm/fPj788EPWrl3LOeecE3FKZFmmpqaGlStXsmfPHg7u3UPu91+Ra9Jj03b8Z03WaUkGOMxJFzV6dq5dyZcXziEUDJJkMpEiBQnIAsWffsSAK+d3uF0ngl6vZ8aMGS2Wdyt0TXpsjokoipSWlpKdnd0lHqKHI8syZWVlLFy4kC+++AJRFLnrrruYPHlyhw/YsizjrKujvOQQFaUliJJIUmICyUlJpKakoO2EQbQ9kGWZFd+vpu/gAtIzs6JtTo9E9PtxHdzHlkf+inv3DrIR0QoCTpWa6qBI0tgJjH7gcXSHdUn2+XzU1taSmZnZITadSFJqS+/Zs2cP1113HcuXL4/kjqSmpjJhwgTuvPNODAYDr7/+OosXLyY5OZlrrrmGU089NaJ/UlFRwb333ssXX3yBxtPAjYlmBlsMjIs3R8qFo8nh4naHfAHc46cy7rGno2yVQjegxYu7azxFOoCqqqoumyglCAKhUIitW7fSv39/li9fzurvV5KTnU1cXBxanRaj0YT2ZxU7siwRComo1erjRlfEUIjammrqHXWEQiFkScLv8+Goq0UAMtLTGDVyGHFWa5dz7ACqqqoJBIKkZXTMA06hZWRZxrlrOwfe+R+Hln6CGpl0tcAwgxqV0DQcZQKiVsX29T/w3TWXM/n519HH24AmJc9gMHjSKrBh5dbwfSCKIkVFRbz00ksEAgFuvfXWE3Z+BEGgb9++3H///fziF7+gqKiIuro66urqIorNDoeDiooKsrKyeOCBBxg1alSkQWFtbS233347ixYtYppVzxUZSQw0G+hr0sfMvXW4HYlaDXtWLqOh+CDWXrnRM4qfep0FAgEMBkPMfF8KJ0ePjZgUFxeTlpbWZRu4VVVV8cADD1BZWYlep+Xi886JtIYPBoN4vd6mJmgaDRzWkEqlUiGKImq1Br1ej06vx2gyYTJbQIBGtxtXvRNvYyM2Wzw2mw3tj6V3TQ2u4rqsM3I4ZeXlbNq8lRFjx5OelR1tc3oMy2/4JRWrV9LHaiJDo8J8DCl3WZbZFoKKRi9zPv4GU0oasixTXV2N0WjEelgkpbWUl5ezf/9+DAYDZrOZHTt28MQTT7Bu3Tquuuoq7r33XtLSWlfmLssyTz31FHfffTdut7vFfQwGA4MGDSInJ4eUlBSSkpJYvXo1y5ct47JUG2el2Jhstxzze4kFiv1BDlkTmPTUgiOW3DoTWZYpKirivffe47e//W2XzBns4SgRk8MJP1i76gM2Pj6eM888k8WLFyOHgiQnJzFuzOjI6+H23KIoIQhN0vYajQZBEJBlmVBIxB/wE/AH8Hq9NHq9IENqUgL98nKwWMzdOpksIz0do8HA+o0bCAWDZOf1jrZJPYLG4oOMizdjP4ElP0EQGKIFp15PwOnElNLUXdtms1FRUdGiYxJw1VP8+Se49++l97zLicvr0+KxtVot77zzDh988AEJCQmUl5dTVVXFmDFj+MUvfkFqamqrP5sgCFx55ZWsWrWKd955J5Lz0Meo5/xUGwMtRvQqgWDIgXtXLaVbAuzy+ImTZR7pl0GeUc8UuwVdF7jvsnUaxAYHX19+HgPm38DAX98YlbFUlmUcDkez/kUKXZ8e6ZiEQqEuL76j1+uZOXMmfr+f/bt2kJKc1Oz1cFfZlmjqeqppygcxm2nKy+952O12xo8dzao162hw1WONtxEMBNBotWTn5nXp6yMWkUIhPFWVWONPvDxbkmU8Hg9aS3MnRKVSNUuCLV66hO3/epTGmmqS9DpMoSDffPIB0//zAdac3COOm5SUxC233MK6detYtWoVsiyTmJjIpZdeyrBhba8oi4+P59Zbb2XXrl1s3LiRC1NtXJCWwGCzgSSdFr1KICSDX5LwiBL1QREZSNJpSNFpYiKf5EQQBIE8vYZUjYp1rz6PITWNvHPmRsWOAQMGcPPNN8dsI1aF1tMjHROXy4XZbO6QjqCdiUqlwu12k5qcjNXS9rB2T8ZisTBl4nj2HzhITVkJOp2W8opKzBYLickp0TavW+HavxeDwYCmFQ9flSCQbrWw48WnSZsyDdHbiNpoQtdvEMuvuZz6ndsxpaQSrKkiXyNgMeuaymJ1egz+ICt/8yt0t/yJEaNGR5Y6w+Tl5dGnTx9++OGHH5c31ZjN5kjDtrYQznkwmUz0Mem5IC3hCIE0HWBSq7BrISu6IrYnjUmtYrhOZuPD91O54luG3HIn5ozOSyYXBAGTyRSTQpMKbadHOiZ+v5+4uLguv1QRlqnPSrJjNCmzhbZiMBgYPGhg5O/qmlqld04HsP+d/5IitD5trb8aNn6xhOqln8CPOVJBIEGAMQY1fmcVicYjow3ZOg1VLidrn/0XGyZO5bbbbjsiEhIMBiP/X1NTw6JFi5g0aVKbm7d999133HPPPWxcv54Hc1MYajG2WbW1qxCnUTNJpeLA6uUsveAbMk+byeAbbsGS1bW6oCvEDt37jmmBWFCNbC+cTif79+9HrVaj08Zmz5yuRiDQlHMTd5Q29gptQwqFKP50Mb00rR9yjGoVE40aJpm0TDKomWLSMt6gZrhRS5xGTbJO2+ISiCAIDFDL9Cnbz7tv/DdSyns48fHxkcipJEl88803vPvuuzidzmOOFfKPCeWhUAhJkpo0fRobeeihh1i/ahU3ptvobdKTZegZ96VGJdBPr2GKWYv6u6/48qIz2PX6gg4fb4PBIO+///4RbQEUujY9zjEJJ6R1h/wBj8dDfX39j8JTXXtZKlaoqqomOTUVlUr5PtuTmk3rMGo0GNUnP+QIgoBZrT6he9iqUZOh0zLHrOH+++9n3759zR6W9957L1dccUUkkdbr9fLcc8+xYsWKoyZThnuzvPXWW7z88sssXbqUbdu28fLLL7N/w3oeH5DFzMQ4Jtm7fvVaa9GpVPTTaxhv1HLgxadYf99dHeqcKI5J96THxatdLhd6vb7Ll5XJskxxcTEmvY64uLgeNwB2FIJKoBsF1WKGyu9XkCiFgM6X/++rFShv8PDevmL+8Y9/8Ne//jWiYZSWlsbjjz9OXl4ezz33HGVlZVRWVvLoo49SUFBATk7LKsb79u3jlltuoaamBmiqesu3GLinVwoFViN9jLGjQRINTGoVYwWB1V9/TuWcs0kbP7lDzqPX67n77rvJzc3tkOMrRIceFzEJV+R09cRXn8/Hjh07mH7KZAYPGhBtc7oNKcnJ1DvqKDtUHG1TuhXVq7/DHqXRxqBSMcig5baMBFZ88hHvv/8+Xq8XIFJ+fOONN3LFFVdExoXvvvuODz/8sMXjiaLIihUrIk4JwASrkbtyU5lit9LXpAh9QdPyTpxGja+musPOoVarGTRokFKR083ocY4JdI9lnNraWqoqykmw20mMkSZ+3QGtVsvY0aPYunE9jZ6WRbIUWo/obUQbxfsuS69luEnH7fFaPn3pBVauXEkgEIi8brfbGTt2bDNRtffff7/FZQhJkti/f3/k72FWIzfmpHCK3UqirscFoY+JRNNksKysjPr6+sj3KYoiTqeThoaGyLaw9pLP54uixQqxQI9yTAKBwI8aHl27m2x4YExLSqRPb0Vvo72Ji7OSmZ5G8f590Tal22BKz8Qb5SZreQYtE21mLvLV8eVdt/Kvf/yD0tLSiLx9//79GTx4cGT/oqIiPB5Pi8cKV/Ok6jTclpfGBJsFq5LndQQZYpCND9zNy/94gq+++gq/3w9AWVkZjz76KK+88gr19fVAU7XkU089xcMPP0xlZeUJn6O+vp4lS5bgcDg65DModD49yjEJe+IGQ9cWDwgEAnzzzTck2OJJsNuibU63JDMjg/LSkmib0W2QZRmhZfXpTiVZp+W0hDhOwY/uP//m+isv591338Xv95OZmUlOTk5kX4/Hw4EDB1o8TtgxubFXCvlmIwldpHllZyMJIEsSZ5x/AaNHj44I4tntds4//3xOO+20yDKMRqNh4sSJTJ06NZKMLEkSTz/9NJ999tlRk2gbGhp4//332bFjR+d8KIUOp0fdTeGKnK6uXxLujDwqf6CyttpBVFZVkZTSellyhZbRJ6VEPWISxqBWMclmIdHjw1ZTzFO/v4mXX36Z5ORkPvvss8h+wWCQwsJChg4d2uz94SUHm0ZNP7OBPFPXTqTvKAKSxI6AzPRX3yFp2Mhmr1ksFkaPbmqhEY74qtVqxo4diyzLkVwfQRDIzs5m06ZNzJo1C2gu+SAIAklJSdx0001kZGR0xsdS6AS69hO6FYS1Brq6UwJNN2ajx9PlZfVjFVEUOVRSSq+j9FlRaD29zr6AEtQxoyMkCAKDLEam2K3cmGgiccta3njjDaqrf0rUDAQCbNq0CZ/P1ywPoq6ujpqaGoZYjcSp1aiVe7BFDgQlMmaegZyRTU1NzRG/vSAIzcYvQRCOKEwQBIGzzjqL22+/PbLN6XRSWFhIbW0tkiSh1+sZMmRIl+0Wr3AkPSZi4vf7CQQCR8hSd1X8fn8kAqTQvlRWVWONjyf+GNeKLMtsXruGeqeDjKxs+gwcqGifHIOUMePRpWVQWVVKmj52crwSdRpmJMahFQSsahUvHqomrF4SCAT49NNPycvLY+TIkWRlZVFWVsbrr7/O119/zZkWLSlKsmuLyLJMuSgzft4V/O9//8NkMjF//vw2VUP+/D379+/nxRdf5KyzzmLmzJlH7Qmm0HXpMXeVKIpIktQtLmK1Wk3v3r2RYmT22d3QaNQ0ejz4vF5CweCPXZpDWOPj0en0uF0utm/ZiBgIMLRgEHv27GNlWQnDxowjLt4WbfNjEkEQKLjlLjbedROpPyabxgo6lYpTE5r62fQzG/j7gQrK/UEkSWLr1q3ceuutFBQUMGzYMAoLC1m/fj3BYJCc5DTMSsJrizSIEmqzhbg+/cjZsw+LxdJu0erhw4dz++23Yzab0Wg0SJJERUUF+/btY+DAgSQnJ7fLeRSiR49xTLoTgiBgNJlQlMA6hpTkZFKSavj28yXo9Xo0Gg1qtRqXyxUJNffKzqJP7zxUKhVjRo+k+FAJq5d9Q8GIUWRkKz1CWiJt0ikEZBm/JGNQx45jAqBVCUyxW8gy6EjTaXm9rIbPa1xAU9L8unXrWLduXbP3pOq1GFSx9TliBWcwRMrE8ej1es444wyg/WQa1Go1ffv2jfwdCARYsWIFzz33HLfeeivnnHNOu5xHIXr0CMdEFEX8fj8m04m3W49lZFmmpqYaQRh4/J0V2kRB/iAK8gc12yaKIoFAEKOxeVWXIAjk9MpGDIWoqapUHJOjIAgCap0eieDxd44CgiDQ26QnVa9BpxIosBj5Z1ElYgv+f5JWQ7peS7zS7LFFdCoVZTsKQZY7PEqtVqsZOnQov/zlL8nLy+vQcyl0Dj3irhJFEa/X222ytoPBIKUlpTEVDu8JqNVqjMajh+49jV6sCUoC3tE49OVnyD4fBnPs5Ji0hFmt5rTEOExqFXathof3l+MWf8rnGmo1cktOKgNMBrRKxKRFUnUa9lRXUlu4BfvgIR2aqK9Wq+nfvz95eXldXtFboYke4ZjIstxtKnIAVq9ejdPhUEqFY4yQGOry4n0dRdGSRWx84G5G6dUtdgKONdSCwESbBbNaxQsFudSHRBpCIklaDWaNmpFxJlJ0ym99NARBQKtWs3PbNr7/dCnz5s3r0H42KpWqy/c/U/iJbu+YyLJMKNS9HhhfffUVQwsGk5aaEm1TFA5DFCVU6m5/S7Wa+r27WXfvnYwx64nvQkJkKkFgRJyZobKMW5QISBJGlQqzWinTPx4+UcLjDxKfmY26rLJbjb8KHU/XGSXaiCzLOJ1OkpKSom1Ku9DQ0MDatWv59ZWXk5amCIDFEpIkolZKho+gbPnXZBj12LqQU3I4akEgXqMGlN/2RGmUJKyZ2YycMJFhY8cp0QyFVtE1R4pWEgwGu82NsWrVKirKy4mzWkjoJpos3QFZlvF4GtF38XYH7UnQ3cD+d99i14JnGKHrHsuoCsdHlmUOSirsQ0eg1WqVaIlCq+n2jkmsKE22B0VFRfz3v/9Fr9Oh1+uVcHIMUVfnQFCpjinK1pOo3rCW1bfdiFUKMVqvJk7R++gxVAZC+G1JnPKnv0bbFIUuSrd3TOrr64mPj4+2Ge3CW2+9RXZ2NhajIdLkSiE2KDp0iJzefXq8syiFQpR88SkbHvgTBVpBSRDtYYQkmR1BiYn3PozH6+WLL74gLi6OGTNmRNs0hS5Et3dMGhoaukWZsCRJeDweamtqOGvmDAb073v8Nyl0Co1eL9XVNQwZPT7apkQN96EiPKUlrP3zbegCfkbqVF02p0Sh7RwMiqRMmELyqLFUVVWxa9cuevfuHW2zFLoY3XrkCIVC3aZMuLi4mJKSEtz19cRZrdhttmibpPAjdXUOEpNT0HaDdgdtYff/XmXTY/+HxWJhgCCRqtfSg/qDKhxGrUrD0HlXAJCUlMTvfvc7RVtEodV0W8dEFEXq6uqIi4vrFuH1uro6KioqiDObsFjM0TZH4TB0Wi1iKDbVTDsDlUZDepyVYToVSuVKz0YAZJry+lQqFRaLJboGKXRJuuW0RpIk6uvrkSQJq9XaLSImgwYN4qyzziIQCOD3+aNtjsJhyLKMIHT9a6yt9JpzDnWijCskHn9nhW6NBKj1TZVpYWFLBYXW0u1GU1mWcblc+P1+7HZ7tylVMxqNzJ07F7M1jtq6OkKhULRNUvgRURRR9+CeKTprHP3nX0+RdPx9Fbo3KkD0+5pKhg8e5K233iIY7LnRRIW20a0cE1mWcbvduN1u7HZ7t9EuCZOcnExCYiIHi4qpqKyMtjkKP+JpbMRk7tnLa30uvJRKf5CA1HbvpCIQYm9AVGbZXRiVAKLXiyzL7Nu3j48//lj5PRVaTbeZ5smyjNfrxeFwkJKS0u2ckn379vHee+/xxRdfMPq2W1Ar0ucxQ53DQVbvftE2I6ro4uKx9x2A89BeUtogplYbCLHNFyIUDGC3mkjUKdd3V8MnSrh9QQS1GkEQGDlyJBkZGd0maq3QeXSbiInf76e6uprk5ORuKT7mcrn4/PPPueyiC+nXp4/SJydGkGWZmppa0rpBSfrJYumVi19q/ezYEQyxOSgx+ZmXmfjoU2xXUlW6JEVBkYw5Z5M+ZRqCIGC32xk0aFC3G4sVOp5u4ZgEAoGIU2I0GrvljRAIBDAa9IweMYxRI4Z1y8/YVREEQQlXA5q4OEKtcExkWabIH2RjQGbco0+TMnoc8f0H4vF4KPMFEJXvtEtRJQvknnORcj8onDRd3jHx+/3U1NQQFxeH0WiMtjkdhlqtJikxEavVqoRGYwhBELDZ4qmtro62KVFHn5RC4BgOsyzLVPqD7PCH2B4QWeOXqEjJ5LQ3F5E+eSoAluwcht/2J4qS0vjW7WeXknPSZdCqVPgdtUBTf7LVq1dTUVERZasUuiJdeiE3GAzidDrR6/VYrdZuHUXo27cv9oQE3G53tE1R+BnpaWmUHDxAanrPXs4JNXpQyy0nvzaKEvv9QerjEsi75EpUWi3pNjvZM89EdVhFkyAI9L9iPv0u/xUNRQdY+6db2V9ykD76Lj1U9Qj0KgG/0wFAY2MjL7zwAr/61a9IT0+PsmUKXY0ue7eHQiGcTidqtZr4+PhuoVVyLOLj4+k/YAD+QIBAIIBOp0OWZepdLhoa3ASDQQx6PXa7HaNR6XDbmWRlZrJz1zdIkohK1XMFxnxlJZh+NjkQZZn9AZFDIYnc8y5mxK+uw5h8/PwoQRCIy+3N4BtuZe2dvyNLK6Hv5vd4V0OSZSRAIwi4QiLVDY0MysoGmuQNLr/8cgYMGBBdIxW6JF3SMQlrlYRCIZKSktD0AA0JQRA499zzWPz+u3y29EsMBgM+n49Gr5d6VwMqtRqdVostzkpBQT598nKjbXKPQfNj51xRlHq0Y+IuOkDyYfLjNYEghSFIGjuBmX+8H1NKWquPmT7lVDJnncX2L5cwTC+g6sZR0a6AV5SoCgRxaXTU+Pz4/X5MJhNBGQpuup2kkWMB0Ol0nHbaaVG2VqGr0uWe6LIs09DQgNfrJSUlpUflW6Snp3Px5VdScqgYp8NBZu8kLFYrer0eg8FAIBDgkosv5uYbriUjLU2JnHQStXV1mC2WHnUttkRc/0HUHzpAIlDmD7JLEhj/+LOkjp90Uscddue9/FBdyXcb15GiFkhXoTQIjBJr/SLJk6eTNm4i/bJzMKak46utxj6oAI3RSDAYJBAMotPpun0UW6Hj6FJ3d1irxOVykZyc3CMiJYcTLsGzHdbA7/C8Gp/Ph9FkIhAIEAwGFcekk6iqriEtMyvaZkSdnHPm8u1HH+BAwGMwMfW517D1O/lQvsZgYOJTL1G3dROVq1ey9Z3/ovP7GaSWidP03AhVNAgEgwy59S5MaT/lU1lzcoGm8fnTTz9l27Zt3Hjjjc3GKQWF1tClXNpwXonNZuuWWiUniiAIkX+NjY1UVlbi9XpZtmwZu3fvwmgwYDJ13wqlWMPjacRssUbbjKiTPGosuWedi2X6bGYt/qpdnJIwgiCQOHQEg6/9LXM+X0nvm+9kXUCi0q/InXcmuUY9K264CqmFlhiiKFJTU8OQIUO6dYWkQscjHKcUL2bq9GRZpqqqCq1WS0JCQrTNiQkkSWL58uVs3LiR4cOH889//pNJY0dxxszTKcgfHG3zegz7DxzE4XIzasLJLVkotI66wi0sv+ZyRuvVSuSkkwhIEt86Gzn3uw1oTZ3ThkGWZQKBAG63G7VajclkQqfTdcq5FTqcFqMLXSZiUldXB6CEB1sgFArx6quv0jenF2NGjmDQQCUTvjOx2+LxuBuibUaPIyF/KAOvu4liqWdGTjsbWZbZGpTpc+ElEadEFEXKy8spKyvrsPM2NDTgdDoRRRG/34/D4cDr9XbY+RSiT5dI0qivrycQCJCUlNRjl29aQhRFdDod27ZtIystlamTJzBx/DjUamX22JkYjUY8bjdiKNSjuwxHA4M9EVFJsuxwZFlmW1BCyshm2O1/jmyvq6vj2WefZezYsWS0Y1sGSZJoaGjA7Xaj1Woxm82YzWZEUcTj8VBbW4vNZsNsNivPhG5IzI+ijY2NNDY2Eh8fj0ajUS5CfiqXfv311/l0ySdceO459MrKZNKE8d2ueWFXQBBUTdelcm12KsFGD9uf+wf9xCBoenZFVEfjDInUG63MfOVtVIdVn2k0GgYOHMjQoUNP+hyNjY1UVVUBRJZsbDYbOp0uMvZrNBqsVis6nY7q6mp8Ph8JCQlKBVA3I+YcE1mWEUWRUCiEw+EgGAySkJDQbXvgtAW/38+zzz7L1k0b+c2v59O/X1965+UqkZIoEC5flyRJ+f47mT3/eRmrp4FUveKUdDT1IZHkMRPQGE3NtsfHx3PhhRe2uVQ+PN7X1NQgiiIZGRmRxH6VShX5/8NRqVQYDAYyMjKor6+nuLgYvV5PcnIy6h87Gyt0bWLGMZEkiUAggCiK1NXVRUpjTaamG0G52H6itLSUdxe+w31/uotTJk/CarVE26QeSSAQoHD7TqpraxlYcPIzRoXWUbz4PQapYiY/v1tTq9HRZ+Ipkb9FUSQQCGAwGNocpRVFEa/Xi8PhwGKxEB8f36Ij0hLh6ElCQgIJCQm4XC7Kysoik1hlktC1iQnHJBgM4vF48Hq9yLJMWlpajxerOharVq1i8MABZKSnKU5JJyHLMuUVFZRXVOL1+iKDamavHKaePhu9QdGM6WwCDS6MGiWE395IskyJP0i9WospFMCl1tJoMJE+dXpkn3Xr1lFRUcGcOXNaXSEjyzKhUCiSO5iQkIDZ3LYKn7ATE17qr6+vx+fzKUv/XZyoOyahUCgiL5+YmKiUgZ0AKpWKQf37k5SYGG1TegRut4ethdsJiSK5fftjsVpRqzUYlLLFqKLSahFlf7TN6FbIsszGgAx5A8g++wLcB/aRmZtHzlnnRypxZFlm1apVmM3mVnd+lmWZxsZG3G43KpWKpKSkdruHzGYzWq2W+vr6SHJsT9a76spE1TGRJAm32x3JI1EG+RMjOTmZ0gP7lHBlB+PxNLJn3z6qqqrpM2AgvfsPQBCUGXqsoNHrEb2KY9KeVAVC+OMSmfnyW826Pv+cs88+u01ORV1d3Y+q1Ebi4uLa3WnQ6XQkJibicrmoq6vDbDYTHx/frudQ6Hii5pjIsozP58PlcpGamqo4Ja0gOTkZV0MDoRbUFxVOHlmWKSktY8fOXeT27cepI8cq12eMIcsyonL9nxQhWaZRlNCrBPQqFZIss0uE0X9+4JhOiSAI9OnTp9Xnq6mpAZq0qAwduPSpUqmw2WxotVpcLhc+n4+UlBQlctKFiJpjEgqFqKioIDMzUylxbSUpKSns23+A+vr6aJvS7QgGg2wt3I6rwc34U6YRpwj6xRSyLDf9Roveh0YPVoMSNWwNsixTFxSpFiUO+YMYk5LxOx2oVSqQZexDRpA2fvIR76mtreWTTz6hT58+TJ48+ShHP/o5PR4PoVAIu93eaU5+WCG2vr6esrKySIRHcVBin6g4JsFgkLKyMjIyMpSZaBswGo24Ghpw1ruibUq3wuFwsnHzFpJS05gydqIilhajbN++nU/u+yNn2swIgvIbtYbdQYlqg4XM2Wdz2gUX06jVI0gSJikEwQCWXrktvq+iooL169czbty4Vp8zFArR0NCAxWLpVMfg8Modt9tNVVUVCQkJmEwmxTmJcTr9rvb7/VRXV5OQkKAkJrURlUpFSJTw+XzRNqXLI0kSbo+H8vIKig6VMHTkaKVTcAwjSRKbNm1CCgQwqJSKtNZQEwhRqdYzc+ESdHFNeRc2oLKykoBKT3xaBmrtTxNFSZIi5bv5+fk8+eSTrR6vZVnG6XSi1WqxWCydPt6H7Y+Li4sk3ur1+h7Xmb6r0am/TrjPgcViUaSETwKVSoXFaiEYVDqrtpUGt5uDB4soK69Ap9NhT0xiymkzMZpMx3+zQlTRaDSsdLgZH28h26BEXI+HOySyT1ZRG5QY/8gTEackTGpqKlVVVTgcDoxGIxaLhYqKClauXMm4cePIzs5u81jt9zclJ8fCeB8fH09ZWRler/eknCRJkvB6vXg8HuLi4pQJdgfQaY6J3+/H6XSi0+mwWq2KhPBJoFKpiIuLb3WpnsJPVFZWUVR8iOlzzsLURg0Fhc5HlmUqKirY6fHiVJJfj4tPkljnF+l39XWMOvt8TClpLe6XnJyM2+2msbGRYDDI3r17Wb9+Pfn5+Sd1/kAggCRJHZrs2hpsNhsOhwOTydTqqsZwl2On0wk0LVHV1dWRkpKiRGDamU7xDoLBIPX19Wg0GuLi4pQy15NElmWscXFAk/eu0Hp65+USHx/Pnh2FynfYhfB6vXz44YeU+IL4JRl3SIy2STFLQ0hknV+i71XXMujqG47qlEDTkofFYiEhIQFJkkhJSeH666+nb9++7RINiJWIgslkQqPRUFlZSVVV1QlHnWVZprq6mtraWvR6PTabLdK0MCwMqtB+dLhjIooiTqcTQRAianwKbWfv3r3ccMMN7NixI9JPQqH1qFQqxo8dTUXJIQ7u3R1tcxROkJUrV7Jt2zYAtjU04lAckxapCARZG5AYcPOdDLrmt8fd//PPP+f+++9HpVJht9tJTU1FpVLhcrna7LiHQiECgQBGo7FN7+8oEhMTI80By8rKIn16jobL5aK4uBitVovdbic+Pj6yfJOUlITD4VAmN+1Mh3oJkiThcDiQZZnExEQlUtIO7N27l1AoRJzZRHx8XLTN6ZIEAgFKy8o5WFSMNd5GWmZ2tE1SOIywxlFjYyPQNMs1GAwIgsBHH30U2b630Y8rKEJsrBLEDK6QyI6gzCkvvkFC/on1cNq/fz8jR46MNM6Lj4/HYrHQ0NDAoUOHIn+faJM8WZbx+/34/X4SEhJO9iO1KxqNBo1Gg8FgwGw243a7KSkpQZIkrFYrarWahoYGZFlGkiRMJlNEa+vnvXx0Oh1msxmHw0FSUlIUP1X3osMck3CkJBQKkZqaGjOhvK7OqaeeyuOPP841v7icgf37R9ucLoPX56OiopKqqmocTiep6RkMHT2WhKRk5dqMIURR5MCBA7z99tu8+eabqFQqLr74Yq655hqSk5Opr6+PhM3dokSjMlNtRqU/SGEIRtzzt6M6JcFgkNra2qakb7sdQRC49tprmz10VSpVJHoSHx9PbW0t5eXlxMfHR/IzjnXfhCeliYmJMRvVDTthNpsN2496RS6XC1mWyczMPMLuo31em81GaWkpgUBAkb9oJzrEMRFFkfr6eoLBoKK4186Ul5ej06ix22wkJSm9co6Hz+djz779lJWVk5qeSa9+AxiVkopGaRIZk/j9fp5++mneeOONiFJoRUUFarWaa6+9lmAwGHFMtIKARhlaItQGQhSKcMqC/5EwuKDFfWRZprS0lJdffpnx48czZ84cgKNGswVBQK1Wk5KSgs/nw+Fw4PP5sFgsGAyGozodXq8XlUoVc8s4P+fnz6a2yNerVCoSExOpqqoiIyMjZh2xrkS7OyZhpyQQCMS0t9xVqaioIDM9nTQlCtUi4f5LrgY3tbV1VFRWkpWTx6mzz0CvV2L+sY5er2fu3LlkZmby3nvv8cMPP1BdXc3zzz+Py+Vi165dkfX8NL2WeCVnDQC/JLE1KDHhiX8f1SkJo1arGThwIAUFBa0aQwwGA6mpqbhcLlwuF42NjSQkJBwxxoeVYtPT09v0WboagiCg1+vRarW43W7i4pQl9pOlXe/qsFMSCoVISEhAq8xK2x21Wo1er0evV0KGXq+XsvIKgsEggUCQBrcbl8uF0WjCGh+PPTGRAcNHYjDE9qwt2oTLHk0mExZLdEXL1Go1U6ZMYfz48eTk5DB//nw8Hg8HDx7kiSeeaBYxGWQxYNH0vIlPQJIoC4TwCyp6aVT4JIltQZk+V8wndfykI/avra3lwIEDDBgwAKvVSnZ2Npdddlmbzh3uQ+Pz+XC73VRWVpKSktIs4uJ0OjGZTD1q/Fer1Vgslh/HH2OP+uwdQbs5JofnlHRmP4SeRm5uLo1eL/U9WI4+FAqxZ+8+ig+VkJ6ZjdFsIi5OT0ZeH2z2BGWZppXs27ePjz/+mNNOO43hw4cfc99AIMC2bdsIBoMMGjSow2aHGo2GzMzMZgN8WKwLwKpWkWXQkaDtORGTgCRRGBKo9QVInzgZfXIqKxe9i8GewOBbbyXv3LlHvEcURd566y327dvHH/7wB6xWa7vYYjAY0Ol0OJ1OKioqSExMxGAwIMsyLpeLtLSjlyZ3RwRBwGAw4PV6aWhoiLmE365Gu9zVkiThdDoJBAIkJSUp3mIHEJ4lJiYmYk9IpLKqClmWe9xyjsPpZMPGzSQmp3DKzNkYjYpS6+HIskwoFEKSJFQqFevWrePhhx9mypQpXH311djt9mb7+nw+VqxYwbPPPktiYiKDBw8+6qQiHKK/8847qaur4w9/+AMXXHABpaWlvPrqq/j9fm655ZZ2eSh5PB7eeOMNXK6WHfBTE6wkaDVoetD1vy8kY5h0Kufc8zc0P173I//01yP2Cy91hRNYzz77bERRJDGxfXPSwtETtVpNbW0tNpsNj8dDfHw8Wq22x41NarUas9kcWeYyGo097js4FuFn2OGaL0dL9ThpxyQcKQkEApHad4X2RZZl3G43tbW1pKSkcO7553No7y5qamtJ7kElamXlFWwr3M7QUWOUfjbH4N///jefffYZ+fn5vPfee9jtdoYPH94ssS+cBHnPPfewaNEinE4nmzdv5qyzziIxMTEyoIYfcuG/A4EABw8eZP/+/Tz66KN89NFHrFmzhkOHDmG32+nbty9XX311u4lyqdXqIzQidILA3LQEBlt61hJdtQiTf3V9xClpCVEUWbt2LSqVirFjxyIIAtnZTeXwHfGQbFKhjkOr1VJXV0cgECA9Pb3HPpANBgMejwefzxcpce/JiKIY0YgJd5n2eDyRezonJ6fF952UFxEKhXA4HASDQdLS0hSnpIOQZZmvvvqKv/zlL+zdu5ehQ4fyw/qN7Ny1J9qmdRolJaUU7tjJuFNOVZySYxB+EO3evZvHHnuMhoYG7rnnHmbMmNHs/gwGg7zzzju8+uqrEa2h1atX8/333+PxeCKzmn379rFy5Urq6+uBptLI2bNnI0kSGzdu5H//+x979+7F7/dTW1vL6tWrjylWdaIYDAYuuugihg0bdsRrc9PspOg0xGt6li6SIAiojqMF5fF4ePbZZykuLm72vo58QAqCgMlkIiUlhezs7B79QBYEgYSEBHw+X7P7qKcRjsbW1dVRUVFBZWUl1dXVCIJARkYGOTk5R3VK4CQck2AwiNPpRBRFkpMVLYj2RJZlampqaGhoAIh097zrrrsYOHAgFRUVrF2/AY/HE2VLO4fS0jJ27N7D+FOmEW+zH/8NPZifD4hDhw5l9uzZR+xXW1vLggULmm1bvXo1t912G88//zxFRUXIsswXX3zBddddxyeffILf70en09GnT58Wz63VaklISGiXsUCj0TBgwAAGDx7cbHuOUcdZKTZGxXWv/kZBSabY66cuGGrxYdYQEgmIIYypzZfJwg3lwtLqVquVJ554grlzj8w36Wh0Ol2PXML5OSqVCovF0iwy0JMIhULU19fjcDhQq9VkZmaSnZ1NVlYWdrv9hIRW27SUE3ZKZFkmISFBUXRtZ4qLi3nxxReZMmUKs2bNQhAE+vXrBzRlvP/73/+md06viChQd8btdrNx8xZOOX1WpD+QQssEg0G+/fZbXnzxRcrKygDIyspCr9cfsW91dXWzWXWYvXv3ct9997Fp0yZOPfVUfvjhB/bt28cHH3zAtGnTSE1NjSwNHI7JZGLevHn86le/apfxQJZl6urq2LVrV2SbThC4Ky+d4VYjBnX3ic6GJJm1fhHLsLEcOriPxuoq0o16sgWZRkmiVNDi9AUYfsc9aM0/VU2JosiWLVtYvnw5M2fOZNCgQRGZdIXoEhcXF1m2sFqtPcJZk2UZr9eLy+VCpVJFxPjaQqsdk7BTAmC325VE15OkurqaDz74gAEDBjB16lSgKYw9fPjwyAMgFAqxb98+VqxYwcqVK9mwfh33/+mP9M47eiisu2A0GomPj6OmspK4eFu0zYlpBEHA4/Fw6NAhvF4v0LQUEwwG0Wq1VFdXs2TJEsrKyti7dy+BQKDF47jdbt566y2WLl2Kz+cjEAiwYsUK1qxZw7Rp09ixY0ez/YcOHcr111/PrFmz6N27d2S71+tFp9OdkKMSdkJyc3NJT0/H6/WycOFCNm7cGNlnflYSvU16MrtZqfyukEzC1BmM+b+/IwgCvrpa9ry+gK2ffYQ5LYM+F11G5vRZaH4mVhbudhtujqoQWyQkJFBZWdlulVCxTrjnkMlkwmw2n9QERTjOGlizFyVJioinKTol7UNxcTGvvvoqs2fPZuzYsZHt9fX1fP7553z77bccPHgQp8NBvNXC5AnjGT50CAX5g8np1TN6vHg8Hlau+oHxU6cpzslx2LlzJ7///e/59NNPAUhJSWHBggUUFBTw3HPP8eabb9LQ0IDP52tWfns8BEFg4MCBjBo1iq+//joSkQGYM2cOr7zySjOVZ7/fz0MPPURWVhZXXHHFcdveNzY28vjjj1NZWcn555/Pzp07eeCBB6isrARguNXEnb3TOD0xHq2q+8w+RVnmmwYfcz5ZhjEp+bj7u91uZFnGbDY3OTE+H6FQCIvF0iNm5V2Nurq6SLpDdyacPxJWBG4FLV60JxwxCXvnbrebjIwMZfmmDRw4cICnnnqKoUOHcvnll6PVasnIyOCmm27CbDYTDAapqanhueee48MPP0Sn1TCsoIB5555NUmIC8fHxZGakk5WZ0aN0YsxmM4MGDmDj6lVMnnE6anXP0a5oLQaDoZkMeHV1NVdffTUGg4Ha2tpIA7zWIssyO3bsYO/evUe0il+2bBk//PADZ511VuThuHv3br744gt27tyJWq3moosuijxMW8JoNGI0Glm4cCELFy7E7/dHEm4NKoFbc1OZYLN0K6cEwC/JaI2mE3JK9u7dy9///nd69+7NddddR3x8fMxLvvd0rFYr5eXlkahldyS8hJOcnNzisnFbaJVj4nK5iI+PV5ySViJJUiR8npGRwbBhwyIVEmq1GoPBQFFREatWreKZZ57BoNNxy43Xk56WSnpaKqkpKSQnJaLpwfLbWZkZVFfXULhpI0NHjYm2OTHL4eV50HTfVldXt9vxf+6UQFO04+2332b27NnodDokSWLdunUUFRVRV1fHTTfdxNatW3nooYeOOnAJgkBmZiZGo5GioqJmr52aYCVZp8HeDcXUDCqBoKcRX10thoQjdUb8fj8ajSaSRHjXXXdht9uVpZsugkajISkpicrKym7ZRyfcRRp+aorYHpzwne73+wkEAqSkpLTLiXsSa9eu5eGHH2b58uXEx8dTVFTE1KlTsdvtyLLMzp07ee211zhUXMwtv72R4UMKGDiwP9mZmYoT+COCIDCkIJ+Vq1ZzcO8ecvv2i7ZJUSec6xUXFxcZ8ERRJBQKdbotgUAgIrS4detWPvnkk8gyTHZ2NiNGjDhulC8jI4OEhIQjHJMpdit9TN2zz5FKEEg0Gqlc9R05Z57X7LXGxkYWLVrElClTyMrKwmg0kpubGxU7FdqGIAhotVp0Ol2366MTrgirq6sjMTGxXaP4J+yY1NbWKjK7baCuro6//OUvbC/cxg1X/4o+vXvz5bffcuONN6LT6ZrW5cwmZp8+g2l/+D2ZmRkMyT+6+mZPRqvVMGbUSFauWo0lLo6klNRomxRVFi1axPbt25k+fTqTJ0/GbDbj8/nw+XydbsvOnTt5/fXXKS4u5qOPPmL79u2EQiEEQWD+/PlcccUVx51N9e3bl0GDBlFYWNgsMTdRp8HUjapwfo4WmdCPycqHU1tby7fffsu4ceOiYJVCe6HVajGbzTQ0NESk/Ls64eUbp9OJ3W7HZDK1a47TCTkmLpcLrVbb2qQWBaC0tJSa6mr+9dijDBzQj+SkJPIHDeTSCy9ERkagqf4/LS2VrMwMEuyKTsexMJtN9O/Xl83r1nDaGWdH25yocujQIV544QU+/fRT5s6dyzXXXENFRQXl5eWdbkthYSF33nknjY2NzZwKnU7HtGnTIoNWWKMnrBR9+PJkRkYGv/zlLyMlymH8kkyoGwtV+QUBvf3ISZ/dbue2224jLy8vClYptCcGg4HGxkY8Hk+30HoJBALU19cTFxfXIY0/j+uYyLKM0+kkKSmpy3+Z0SArK4tTJk0gN6cXgwYOACApKRFJkiKCVcpyzYnT4HazZ+8+CkaMirYpUWfevHmsWLGCr776in/84x9s2rQJr9fLgQMHOt2W8Djxc3r37h0pe6+qqmLx4sV8+umnqNVqHnroIXr37h0ZVwRBYMqUKeTk5LB///6I0Ngejw9XSOyWDfskWaa2wcOEEaOPeM1isdC/f/8oWKXQ3qjVaqxWK06nE5/P16WTlkVRxOFwYDQaO6wb+THv9HDTLrPZ3KNlhk8Gu91OZkYGcXHNa9lVKlWXvjijxbbCHfQblE96VmyWSouiyLp16+jTp0+znjMdQd++fbnrrrvYvHkzFRUVfPTRRwiCcNI5JuHmbGGp+pOhqqqKyspKkpKS+P777/nrX/9KWVlZRB3zySefxGq1UlpayqJFi9i8eTN79+5tdoydHh+V/iC5xvbJ+I8lBCDOaKTky8/oO+9y4Cc5b61W26MT3rsber0erVaLx+NBp9O1a7JoZxEuggGIj4/vMPuPuXAbCoUIBoOKU3IShEIh9CYzB4uOVNlUaB2SJOFwOMiO4dD21q1b+eMf/8if//xnSkpKOvRcKpWKyZMnM3ToUARBaLfE19zcXN5++20mT5580lUEdXV1PPzww2zfvp0lS5Zw6NAhRFEkGAyycOFCXnvtNSRJYs+ePbzyyiu88sorHDp0qJlDtL+xSaq9OyIIAgPUMrtfejay7cCBA9xxxx1s3749ipYptDeCIGC32/H5fG0u2482Pp8Pl8tFSkpKh1YYHdMddzqdGAyGdk9s6SmIosiyZcvIyc3D7fEQCAS6ReJTtAgGQ6g1mpjWMfF6vdTX1/P8888jSRJPPPFEh4U7oakc8ayzzuKbb75psZS3LcyZM4dTTz0VtVrNDTfc0EwWvrXIssw777zDd999R2lpabPXPB4Pb731FsOGDeOjjz5i9+7dLX6GIp8fiSbpdk030zGBpqiJfFhPFVmWyc/P7xEtJ3oaKpWK9PR0SktLu1zeZjAYpKKigqysrA4vez7m0SVJUqIlJ0FjYyP//e9/OVRSQk1tLfX1rmib1KVRq1VI7dC5tiMJa04AvPPOO7zxxhuUlpZ2aDOvqVOntrknxc9Rq9WcccYZqNVqhg4dyrnnnnvSg2coFOLQoUNHfAeyLLNmzRouu+wynnnmmUiI+OeIMpT4At0yaiLLMrslFQOu+W1kW58+fbjuuuta7Emk0PVRq9XYbDbq6uq6VPdhh8PRaTpmx3RMNBqNkgdxEmg0Gn75y19G1DJFKbYfqrFO+IY4Wo+XaCPLMiqVKjKbcLlcPPDAA/zlL39h8eLFESXTk6WxsZHt27dHlkV69eoVafJ4suTl5TF06FCgqdfHnDlzjujw254Eg0FKSkqOK4+/vK6B3Y0+GsXu1a21JhgiFBdP77mXNNsuCIIyIezGWK1W1Go1Docj2qacEI2NjYiiiNls7hSRuGOeoac0H+oojEYj+fn5rF69mpTkZMym7tWqvbMRBIG4uDjqHXXRNiWCLMs0NjZSWlrKsmXLeOmllyJVMbIsU1paymuvvca9997LF1980S4aI+vXr+cPf/gDv//971m8eDGhUIicnPZp6Dh9+nTi4uIiD8ZRo0Yxf/58cnJyovqgXOlw84PTw9KaepbW1FPqCyB1odnm0TiImoHX3oTqR6dbFEU8Py77KnRvEhISaGxsxO12R9uUYyLLcqdrsBxzsV7Jh2g9TqeTzz77jFAohNPpZMmSJcw49RTsNhsWi+KYnCxJiQnUVFaSnJoWbVOApmWKxYsX89RTT+FwOCguLsbj8TTbRxRFCgsLueeee6irq+Pyyy/HbG77tVBRUcGqVatwuVxs2LCBM888s90SJfv379/svrdYLFx66aXk5ubyyCOP8P333zeTvO8sHCGRv+4rQwCGWU1ckp5AnlHPmHgzibrYzTk6FnXBEF6tkew5Z0W27du3j48//pjp06czfPjw6Bmn0KEIgoBGo8Fms9HQ0ADQobloJ0NDQ0OkQV9nTU665h0dI0iShM/nQxRFqqqqeO211/jss88oKipCp9MxaEB/fnn5ZWSkpTJ+7GglNNsOJCUlsm37TgYOGRoT36fP5+Ptt99mw4YNEVn2lhBFMaKOOnv27FY5JkuXLmXVqlXcfPPN2Gw2jEYjZrMZh8PB/v37WbBgQZtm2EajkVmzZpGdnc3SpUs5cOAAycnJzdaQBUEgISGBWbNmkZ+fz7333svrr7/e6nO1FzKwqaGRTQ2NjIgzcUtOKkOsxi4nWR/OLRly612otT85gmFtI2UJvfsjCEJkHAjnVx2r0WU0CIVCkWuyM0vXFcfkKMiyTDAYxOPxYLFYWuwMWV5ezlNPPcWGDRsoLCwkL6cX5505m9xevbBaLFgsFnJ69SKnVzbqbiyp3Zkk2O1IokhdTQ2JMdBK3GAwcNtttzF27FjeeOMNCgsLj7qvxWLhrLPOwt5Kdd/du3ezYMECBg8ezEUXXYRer2/24PK2IGd+IiQmJnLrrbcyZswYJk2axA8//MC4ceNaHIA0Gg1ZWVkUFBSgVqujEjX5ORtdjdy+6xB/65cF0KWck9pgCNFiJ3t2c/XiwYMHM3DgQEV0sYcQy86JLMu43W5EUex0gVXFMWmBsIrlxx9/zPbt27nwwgsZOXJkRCtCpVLh8/lYu3Yt3377LeVlpfzptlvp26c3/fv1xW63YbVYlMGlAxAEgbzcHPbv3hETjolWq2XixIlkZWURDAZ599132bNnzxG5JCkpKVx66aVcdtllrQ7ZlpeXU19fz3/+8x+GDh1KeXn5EctFbcHpdLJw4UIyMzO5+OKLufjii4+5v1qtZu7cuSxdupSKigo8Hg+hUIiGhgbq6+s7rMJAo9GQmJiI0WhEluVIn47q6mqqAyH+tLuExwdmE6dRk6zrGq3lSwUN/a66NpJbEkatVivjRg8jvEwCTc6JIAgxIdERDAbxer0dKqR2NITjDCZdP7usDTgcDp5++mkee+wxJEniiiuu4I9//CMlJSUUFhZyyimnsGzZMl5//XXysrOYN/d8Bg/sT++8vG7X1joWEUWRr5d9x5iJU7DFUGNJn8/HqlWruOeee1i1alWzZZ158+bx6KOPtjpJ1e/384tf/IJ3330XnU7H9OnTaWhoYMWKFe3iCCQmJvLnP/+ZW2655YT2DwQC7N69m5qaGqqrq/H7/ezfv58nnnii3aqOfk5KSgpXXXUVo0aNQpIkJEmisLCQv//975ElrP4mPff1y2R6QhzGGI9OSrLMNw0+Zn+yDGNSk3MtyzIejwePx0NycrIyjsQQ4cloZzyc3W439fX12Gy2k8pDO1lkWaa+vp5AIEBKSkpHnqrFL/W4kvTR9to6mwMHDvD888/zyccfcdm8CwmFQvywahW33347hw4dYufOnUyaNImaqipuvGY+uTk5jB45ArO5fXQkFI6PWq1mQL++bNu4nknTT0MQYmMQNxgMTJkyhcsvv5w9e/ZQVVUVee3AgQNs3LiRpKSkVg0427ZtY//+/ZF8piVLlrSrzcFgsFUqlDqdjoKCgmbbDhw4wIIFC1p0TNLT0ykoKGDZsmXHzYOxWq307t0bg8HA1q1bI3YZDAbGjx/P+eefH9l35cqVvPLKK5GGhbsb/Swsr8OoUjEtwRrT45YrJGJMSo44JdC0lr9y5Up2797Ntddei17f/eT3uxKyLFNVVcW6detwu93MmDGDxMTEDj+vxWJBkqRmyzrRQBRF6uvrycjIiMr5j+mYNDQ0EBcX11m2RA1RFCkqKqKmpoaPP/6YVStX8H/33E3/fn0RJYmiomJ27t5DRVkpI4cNZeqEceQPGkj+4EHk9MqO6UGwu5KdlUlZeQXrV31P/oiRGI2x4RhqNBrOPfdcXnnllWaOyYYNG7j77rsRRZGzzjqrxQfP3r17EQSBXr16IQgCVVVVvPHGG+zcubNdbZw4cSJ2u53PP/8cv98fiXy09WFYXFx8VKfj/PPP5/LLL+fBBx/kk08+OeZxZs6cyQ033EB8fDybN2/m+eefZ+3atQSDwSMUYZOTkxk2bBi1tbUYDAa8Xi8fVjmZnGAlx6uL6XyTBlEiYcjwZtvCkaCwvoVC9BBFka1bt/Kvf/2LVatWMXfuXGbMmNFp57damxzrw5d1Opva2lpsNluLuZWdwTEdE7/f3+WjJuFw9+Ft1x0OBx6Ph4SEBNRqNQ0NDSxatIgDBw7www8/8Ntr5jN+3FhSU5pmNIMG9Cd/0EAmTRiHIKhITU4iKytTabAVRQRBYMyoEezas5dvP1tCbt9+DBoyLNpmAZCWlsbEiRPZsmVLRDhMFEW2b9/OAw88QP/+/cnPz4+E68Nh/Pvvv58tW7ZEZk0+n4/i4uJ21zm4/PLLmTFjBv/+9795+umnWbNmDRs2bGDChAltOt727dub5dTo9XrmzJlDcnIys2bNYsSIEVx99dV89913Laq7ajQaxo8fz4033sgpp5yCRqNhyJAhZGVl8bvf/Q6j0XjEbDUnJ4d//etf1NXVoVareffdd3nmmWf4+4EK0vVasg06dDG6HKJXCVSXNe+jpNVqmTJlCqIoKuNKFBFFkdWrV3PnnXeyfv16DAYDw4YN69T2AOGE2PByCjRV0HXWczgYDOLz+UhKSuqU87XEce+ArtiiOSx65ff78fv9qNVqEhIS8Hq9lJSUcN9997Fhwwb8fj+CIEQkt+vq6hg+dAhpqamkJP/0o6jVanJzc8jNbR8RK4X2Qa1WM3jgAFKSkti+a3fMOCYqlYp+/fqh0WiOUDTdunUrV199NQ8//DAjR45ErVbj9Xr53//+xxdffEFlZWWH2xcO0f7pT39i0KBB1NTUtEn+PJyEunHjxohjIggC06ZN495776VPnz7odDp0Oh1Tpkzh//7v//jwww/ZuXMn1dXVkShI7969ueOOO5gyZUrkoazT6Rg9ejQ333wz8fHxjB8/vtm59Xp9M7Xb6upqXn75ZcrdblY73eQYdBRYYyOK9nPi1Gqc+/ciSxLCj85TuNuyQnTZu3cvV199NXv27EGSJEKhEJWVlQSDwU6NZKlUqkjkJJxY3hkJsZIkUVFR0eFN+o7HMR0TlUqF3+/vUo6JLMscOnSIBQsWsHHjRrZs2UJSUhJ//OMfWb58Od9++y0et5shgwdxxuyZpKWkNCnbud34/H7SUlIYPWpEl44S9TRkWUYbY2KAVqu1xRtbkiTWrl3L3LlzmTNnDklJSWzZsoV169a1S6XNibB9+3a8Xi/Jyclcc801bT5OMBjkpZdeYvHixREHLDk5mXPOOYehQ4c2+/xJSUn87ne/4ze/+Q1bt27lwQcfZPXq1dTU1JCbm8uQIUOahY0FQSAxMZHf/OY3J2RLVlZW5P1vltcx3mZhoMWIJgbvY4NahU6QqSvcQuKQ4YRCIYqLi8nJyVGWcaLMhx9+GMnpgqbcn4ULF1JQUEBGRgZerxe/34/BYCA3N7dDUx0EQYior4cjJx3tnDQ0NKDX69HpdFF9BnabmGFYNnfjxo0sXLiQ//znPwwfUsDsGdMx6PV888XnJNjs/Om2WzAZjaSnpZGVlUGC3d5Ur+3xEAqGsNttSuJZF0Or0xL0x5aEt8ViOeaMw+l08uabb3aiRT+xa9euNmufHI7f76ewsLBZv4+CggJmz5591M+uUqkYOnQo//znP1m5ciVr165l1KhRZGZmnpQtWVlZjBgxgvLycqoDIXZ5fAyxGOlljM172SAIuPbvJXHIcIqLi/nb3/7GU089FZV8AoUm6uvrWbFixREaPStXruSPf/wjOp2OyspKamtrSUlJ4f777+fcc8/t8DyMw52Tjsw5Cet22Wy2qDvI3cYxkSSJLVu2cMstt1BRXs7jDz5ATq9e5Ob0QqNRI8tNa9lhafife4Ndqf20QnNkWUZQxdbMOJbbOezduxe3233S+WNWq5VTTjmFJUuWcOjQITQaDb169SI3N/eY7xMEgfT0dObOncvcuXMj204Gu93OHXfcwVdffYXP5+PDSgcFMeqYlPqD+C12smeeATTNyvPz85UJURQpKSnhjTfeYPXq1UeoN4fzTn6+rbq6GlEUOyVB9OfOSUesYrjdbnQ6XUxch93GMWloaODJJ59k27ZtPPLA/YwcPowRw4cpSzI9AJ/PjyGGlhu9Xi/r1q2L2UZsDoeDkpISBg4ceNL3R1paWmQGp9PpSE5OPuFjtve92atXL7RaLT6fj20NXnyShFeUYkrXxBkMsSskM/Ufz6H5sZKsd+/eXHvttVGfpfZEZFlm+/btPPvss7zzzjvU1NQcsY9Wq41UTcXFxWG325k5cyYzZ87s1Ie4xWKJFG+Ec07aC7/fTzAYxBIjwqDHdEzUajWSJCGKYkwYeyzCza8uPP9chuQPZviw2OilotDxBINBtNroe/mSJPHtt9/y6quv8vXXX7dLJ+H2Qq1WYzQakSQJk8nUbjOuQYMGMXv2bDIzM6mtreW8885rl+O2Ba1WS69evSgsLEQEtjZ4GRFnJlsdG9GrumCITQGJsQ8/iX3A4Mh2jUajJL5GiR07dvC3v/2Njz76qFn1W0pKChdddBHjx4/HbrdHkkLT0tJISEggMzOT7OzOlYoIK8SGq3XaK3ISTmKXZTlmVg6O6ZhYrVZqamrw+/0xufYZ/oG++eYb7rvvPvIHDeLyi+cxYdwYRTmxB6FSCchyy83zOpNQKMTatWv5/PPPqamp6TCJ9tag0WjIzc3lxhtv5PTTT0ej0aBSqdptUE1NTeWee+6hsbGRUChEVlZWO1jdNmw2G7Nnz470K/re6WaK3UK2IfqOiSjLbAlIjHvsadInTQV+ki6wWq1oNBplItWJhHuhff/99yxevDiSeK5Sqejduzf33Xcfc+bMifw20KR6rNFoojpJP7xax+l0Ak1pCG29dmRZxufz4fV6SUhIiJnn5jGtUKlUyLJ81I6p0SQshf3b3/6Wq666il6ZGdz7xzsYN2aUMvvoYagEVUxco1qtlt/+9re8/vrrjB49Oqo3uSAIJCUlcdlll/Hxxx/zm9/8hvz8fAYOHEj//v3bTRdBpVKRmJhIVlYWubm5URNkgqYB+txzz2Xw4MEIgsAmVyMNooQUAw5ipT9I3IBBEacEmhKgb7zxRrZu3RpFy3oesizj9/tZtWoVb7/9dsQpUavVTJw4kTfeeIOLL76YhIQEtFotgiAgCAJ6vT4mVg7CzonZbMbpdEaiHW0h/F2o1eqYyos7ZsQkFj14SZKoqanhs88+47nnnqOh3sm/HnuYrMxMRo0cji0+PtomKnQyUoyIAIaFkWbNmsX333/P1q1b26X6pS0MHz6cm266iYsvvrhTyv1j4ftXq9VMnjyZf/zjH8yfP5/S0lJqAyGcIZEEbXTT6apUGrLmnNtsWyAQYOrUqVGNMvVEJEli0aJF3H333ezbty+yPS0tjWeeeYYhQ4bExPV8LARBiJQqn4wIWygUwuVydfqy1PHoUsmv4VD5G2+8wQcffMCvrriMCWPHMCR/MNnZWTH1xSp0Hj6fD0OMSNLDT6Xr0YzijBo1iiFDhlBXV4fJZMJut0fNls5EEAR69+7NuHHjeP/991lT72FMvDmqjkl9MIRDUjHhzOaOSWpqKjfccEOUrOq5HDx4kIcffriZUwJEusZ3JbXzw52TtuachCNCscRx79bDpdyjaXxlZSXvvvsu//vf/2iod/Lkow+Rm9OLoQX5MRWCUuh8AsEgOpM12mZEKC0t5YcffohqVc7777/PwYMHSU5OZsCAAdx8882dKqsdTSwWS0ROe73LQ7EvwCBLdKq2fKLE5qDM8Hv+itasLDHHAgsXLmyx/9ShQ4d4+eWXGTJkSJcSFQ07J06ns5mSeVfmuI6J2WzG6/ViMBii0sOhtLSU999/n2+++Yb169Zx7plzOH36NMaMHkVaaoe2Y1boIoihUNT7iwSDQcrLy9m+fTsLFy5k27ZtUU1+raur48svv0Sv13PNNddE8sVKS0tZvHgx/fv359RTT43699YR2Gw2+vXrh8FgYJfbR1CS8UsS+ijk/GwMyfT+5TXkzD47si2sTq1Wq0lPT4+ZhMOeQCgU4quvvjqiVUSY9957jyFDhnDVVVdFrbNvW7BarZFkarvd3uWdk+OOSiaTCafT2WlhaUmS+O6773jppZciKntlZWUMH5LP4w8+QG5ODkOHKFEShZ8QJQm1JnpJaYFAgE8//ZQHH3yQmpoaysvLo5Zb8nMkSWLfvn0sWbKE0tJSPv30U7Zs2cLjjz8ebdM6DL1ez5AhQ8jLy2PHjh0U+/w4giJp+s53AEIyZE6f1Wyby+Xi9ddfJzs7m8suu0xxTDqRoqIiysrKjjppqK2t5cEHH6SwsJAbbriBgQMHRjWh+0Q5XL6+Ozgnx3VMDu+A2pGIokhdXR1///vfefvtt0lNTiI7M5Oxp01jxLCh2O02hg9t+q+CwuHodTpqq6vJyslFEDp3kJdlmZKSEl544QXWrFnTqec+EYLBIF9++SXff/89oVAIr9fLqFGjmDBhQkxUGHQEgiDQq1cv+vTpw65du1hX72Gy3UqavvMfMAkqKFv2FfF9+0e2aTQaJkyYQEpKSreMWMUymzdvjpTZtoQsy5SVlfHSSy/x/vvvk5eXx4033sj5558f89We4WodaFrWiY+PP2YpcfiZHmv5JRAjya+yLLNx40Zuu+02VLLEk488iNlsJikxAbvNRnJyUkzqqCjEBn1657Fuwya+/+Zrho0Zi8XatsZaHo8Ho9F4zBmsLMuEQqFI7X9xcTFvvvkmy5cvb6v5HU4wGIxk7mu1Wq677rpIN2FRFAkEAmi12m71kOzTpw9Tp07l+++/Z7fHS4U/yNAopCFlCDKFC99g0NU/JbmaTCamT58OxOZDoTvjcrkIhUJHfV2lUpGTk0NCQgI+n4/i4mL++c9/MmLECPLz82P+91KpVMTFxUV0Tmw22zGdE7/fHxMS9D8nJkaiqqoqnn32WQ4VF/HPRx9m6pRJxHdg10aF7oVOp2PCuDEcLCpm5Tdf0W/gYPL69T/hQaShoYEdO3awatUq5syZQ//+P81u3W43Bw8eZMCAAWi12ogo03fffUd5eTlffPEF+/btiwkxtRPBYDDgcrmoqanB7XazdetWysvLmTJlCsOHD4+2ee2GJEmoVCrUajVl/gDBKP0+akEg5Gu+rBfrD7fuTN++fY+ZO2IwGLjvvvs444wzqKioYPPmzezbty/moyWHEy4llmX5mM6JLMu4XC5SUmIvV/OEHBOtVksoFOqQVsjBYJDPP/+cpUuX8sfbbmFI/iDFKVFoNYIgkJebQ0pyMps2b8Htqmfo6LHHfI/P52PLli189tlnLFmyhMLCQg4ePMh9991HfHw8dXV1vPPOO2zZsoWHH34YrVaLKIosWbKExx57rJM+WcuYTCYsFgtOp7NV1T/hnlJbt26lpqaGVatWEQqFeOSRR7qVY2IwGJg8eTK5ublsW19LNFwBUZYpDMHA638b2eb1eiktLSU+Pp7k5OQoWNWzOZ5jEs7VSEpKIikpiYKCgk60rn2J/1HTy+l0kpCQ0GJkpLOaELaWE3JM4uPjcTgc7aYWeTg7d+7k9ddfJyMtlT55eeTm5LTr8RV6FmaziZEjhrHi+9XH35mmZLiFCxdSWFiILMu8/fbb6PV6xowZw8aNG/nPf/7DwIEDI/uLonjMUHBHoVarueiii0hLS8NoNJKWlkZSUhLvv/8+H3/88VGrDDQaDbIsN2vlXlRUxCuvvBL5e/DgwZGlne6E2Wz+cTLV+ecOSBKbAjLx4yfT79JfRraXl5fzv//9j+nTpyuOSRRITk6O5GG0RCAQ4JNPPmHMmDHdQvgu7JzU1dW16JzEaqT3hBwTvV7fIZoMoihSWFjIihUruPePdzJ40Ml3O1VQCJfGHg+9Xs/06dOxWq385S9/Yf369ZSXl/Pss8+SnJxMXV0dTqcTv9/PV199xdlnn82WLVtYt25dJ3yK5lgsFm677Tby8vLQarXo9Xq0Wi2jR48mLS2NL7/8Er/fT3l5ecRJ+cUvfsFZZ53F1q1befLJJ3G5XEccNzMzk+uvv57x48d39kfqcIqLi6mrqyMoNV0Lkiyj6oTxxREMsSUg0+v8ixh6290Ih+UsmUwmhg4dSo4yAYsKarUai8WCIAgtjhHBYJAPPviA2tpafvnLX3L66ad3qbLhlgiXErfknHRpx6QjnQVRFJFlmcEDByi6JArtQiAQRHsC5eSCIJCYmMiMGTPw+Xxce+21VFdX09DQQENDQ2S/yspKfvvb3/LAAw9QV1dHRUVFR5rfIoFAgM2bNzN69Ohm2/v168f999/PLbfcgiRJLF26lEceeYSSkhIuueQSZs6cyaRJk3A6nTz//PMIgtAs6pObm8t5553XLZVhMzIysNlsBGWZA14/Ff4gGR3Y0E+UZfYHREokGP23x8mcdvoR+yQnJzN79mxF7iBKyLKMxWJBpVI1iyIeTl1dHR9//DFbt27lj3/8I1dccUVMJoieKOGEWPgpcqLT6fD5fOh0uqiLp7ZEVJNfw1/Y0CEFmMwm5WZVaBe8Xi/GVlRxaTQazjrrLObNm8err75KMBgkGAw2m02UlZVRVlbWEeaekH2TJk1i6tSpR7wWdq4SExORZRmj0cjKlSt555138Hg8yLJMeno6119/PX379iUjI4P169fzwgsvNEUTgkEaGxuj8Kk6HqvVGnmgvF1eR2+jnhSdFo2q/Qfh6kCQHSEB2/CRnP6XBzGlpjd7XZIkvF4vJpOpS+tLdGXCnXT9fv9xIwV6vZ7TTjuN008/vVs8l1QqVbNlHbvdjsPhQBAEAoFAzDleJ+yYHC30dTIEAgFKS0tJS0khoRvO2BSiQ7h6pjVoNBruuusu4uLiOHToECtXruTAgQMdZGHryMjI4LHHHqNPnz7H3E8QBLKyspgxYwbLli2joqICURTRaDQMHjyYwYMHA3DBBRewZ88ePvzww0gTr+5IIBCIfGcbNmxgpcONViUwxW5tNxVYryixQwSPwcqoex4kffKRziPA1q1b+f7777n66qu7xYOuKyFJEuXl5ezatYutW7eycePG4wqGDhw4kOuvv55evXp1kpUdjyAIkbYU9fX16PV6QqEQ+/fvj+SYHR45OdrzPix735E6SCfsmJhMJjweTyQk1B7U1NTw1VdfkZmRrlTiKLQbBoMefxuUV7OysnjwwQeprq7mvvvu49lnn+0A61pPWJNAkqTjDgaCIHDaaaexd+9ecnJyWtRkUalUXHrppVRVVTFjxoxuNfgeTlZWFvfeey8mk4lf//rXvLt6NXUVDkIy5Br1+AQVmRqBRK2m1bknIVnmQCDEoaBMvyvnM+XXN6LWHX3WuWXLFpxO51GXD7o6kiQhy3KnifaFQiGqqqpISko6rqMniiKLFy/mz3/+Mw6H44Qm2GGNoj59+mC1WmNuqeNksNlsuN1uysvLMZlMmEwm3G53ZEnn8P54LSHLMo2NjSQlJXXY93LCjkl8fDwVFf/P3lmHR3Wmffg+ZzwzcRdIQiAEd3cvlFKhLW2puy9b79Z1l3brLtuWtsu2FKpQwd1dEgIhkBCIy2QmGZ/3+yPNfKQJEEIUzn1dc10wOfLOzDnved5Hfk9eoxomZWVlbN68mfvuuA19K3MlKbRdvF5vjYTDM0UI0aqSwnJzc3nrrbfo3bt3vRrxJSQk8Mgjj+Dn53dS0bQJEyYQGxtL165dG/Webk2YTCZMJhNer5dZs2axa9cuvvjiC4pyDtMlOpIuSQkUlBQQ6HCSrIIgteq0E61HCHKdLjLcEDZwKBMeeRpjTGyNbWw2G+np6QQGBpKYmAjA5ZdfjlqtbpWlmWeDEIL8/HxSU1Pp3LkzsbGxp9+pEaioqOCTTz5hypQp9OvX75SiiLIs+4yX+t7Xhw4d4sUXX2Tjxo1cdNFF9O3b95wKwZlMJjp16tSgfT0eD/n5+VgsliabO+ptmMiy3Kj9coQQmM1mcnNz6ZCQQFBQYKMdW+H8xmazn1GOyYl4vV5SU1NZsWJFI4+q4TidTn7//XcyMzPp27dvvfY5XTJrQEDAOVmJUxeyLDNy5Ej69+9Pv379WLlyJX5+fqgCAkjLzubSxFh2/ucDJJcbWZYxqmQCXVWVTV4kXGoNTllFpddLZWUloV27M/Tv/yCsd+3fQgjB4cOH+eijj7jiiit8hklb6lZbX7xeL3v27OHLL78kISHBFypsDnQ6HZGRkb7iiVOhUqno0qULnTp1YtOmTfU6vsPhYOvWrezbt4/ly5fzzjvv0L9/f6WvEf+fG2o2m32JxI3NGSW/Nqbbxul0smnTJtRqNVqtps2XZCm0HqqSDOt/Pdntdt58802fW/jHH3/k4MGDTTjCM8ftdrN69ep6GyYKNZEkCaPRyNChQ+nZs6dPWMpsNhMVFUW362/leNo+Nm/ciLO0COF1ozUYUOkNaAMD0YeEoYuKRgqLICgs3OeJysvLY9OmTSQkJNCtWzdUKpWvBPtcDZFBlQH2ww8/8Morr+Dv78/f//73ZtVl0ev1XHPNNajV6no9GDt06EBiYmK9DZNqAgMDiYmJaZIcy7aKJEkYDAbsdrtPvK2xabGqHCEEDoeDxPj26HS6cyqGp9CySLKM11v/WP6mTZv49ttvOXz4MJIkUVlZ2ey5ANUNuEaMGMGECRPYuHEjixcv9uUluN1u3njjDcLDw5kyZQpBQUHKPVNP0tLSCAoKIjo6ukYXVqDGgigwPpGKHbvIUhsIDAwkPT2dWbNmERUVBcB3333HRx89yGOPPcaYMWNQqVQUFxezfft29Ho9KSkpqNVqAgMD6dWrV7N/zubC5XKxYMECnnzySY4cOcLUqVOJjY1t9uuxWna9un+VWq32jcHr9fraEsiyjMPhOCMtLo1Gw8SJE3n88cdJSUnB399f8ZacgCzL6PV6rFYrTqez0RO6W8wwkSQJrVZLdFRUm+pDoND6CQwIIP1gRr23HzBgAMOHD2f//v3Y7fYmHNnJiYyM5IMPPmDSpEloNBpuvfVWli1bxuzZs9m8eTMul4vs7GxuuukmZs6cydtvv31KBUuF/+fdd99l7NixTJ8+/ZTbGY1Grr76agB27tyJv79/je942rRpTJgwoYb7umvXrjz99NM1kgbPRaof/haLhZUrV/L8889z6NAh1Gq1T7CsMc9VUVFBcXExkiQRGRl5ynYopaWlrFq1iokTJ/qeJRkZGezcuZO4uDji4+PJyMjg2LFj9R5DcnIyDzzwAEOHDj2nf9eGUu2BdDgcWCwWgoODG9VwazHDxOv1UlhYiMPhwO0+s9JOBYVTYTIZ8Xo8VFgtGE2nfnh7vV42bdrEihUrWswogaqYtl6vR6PRoFKp8PPz48ILL8RkMvHiiy+ydu1anE6nz6A/V6s7moILLriAfv36nXY7SZJ8VSX9+vWrtY9Op6ul93DiPucyFRUVrF69muXLl7Nw4UIOHDjg+5tKpfJ5JxqDakXwuXPnUl5eziWXXMKkSZNQqVTk5eXh9XqJjo72rdLLy8v59ddfiY+PJzk5mby8PJ577jnmz5+PXq/nggsuwG63s3fv3nqPQQhRlUR/iq68drsdvV7fJD3k2gLVxonZbMbpdDZqcnCLGSZarZbRo0fz4/ffY7FYW2oYCucgkiQRGxvD3h3b6T1gELpT3DBZWVl88MEHNSbalqCkpITff/+doUOH+lbpsiwzevRoJEli1qxZ7N69m3bt2jFt2rR6VecoVHHRRRe19BDaNG63m/Xr1/PAAw+Qnp5e428ej4fjx49TVFTUaF1qZVkmIiKC8ePH89tvv/Hyyy9jsVjo3r077777Lg6Hg1tvvZWhQ4ei0WiIiYnh+uuvZ/Xq1Xz//ffs27ePdevW4XQ6cTqdzJs3r17nlSSJ+Ph4KisrKSsrIy0tjfHjx9farrKykqVLl7J27Vri4uKYPn26Lw/lfKM6nFNRUeFbVDUGTWaY2O12fv75ZyZNmuRTnDsRlUpFSkoKce3bU1FRQVmZWanMaUGEEJSWlpFfUMDRnGPY7fYayV6SJKFSq/A3mYgIDyckJJjQkJBWu1rs3KkT6QcOsGrxbwwbOwHjScKFW7duZevWrWcsyNbgcXXuTMeOHTEYDOzcuZPMzExftdsPP/zAPffcU8M1LkkSI0eO5N577+Xvf/87UVFR5001jULrYMuWLbz66qu1jBJJkujZsydTp05t1HlAlmUSExMJDQ1l2bJl7Nu3j6effprOnTuzfPlyPB4PRUVF3HDDDQwcOJCYmBjy8/N55ZVXKCgoaFD1qMlk4uKLL+aSSy7B5XJRXl5eZ2dhm83GkiVLePHFF9m2bRv+/v7ExsYyderUVqee2lwEBgaSn5+PyWRqOcPEbrdTUlJCQECAL56XlZXF+++/z7Bhw5g2bRpQpVHy7rvvkpGRwT/+8Y86jxUVFcUVV1zBf7/9joiICEaNGHYWH0WhIbjdbjIOZXLgYAYlpaWs27iJvftSyTl2nIrKSiRJqqqc0mgIDAwgMiKC9u3iGNi/HzF/drrtnNyJ6OgotK1Io0GlkunaJQW7w0FpcVEtw8Tj8XDo0CEWLVpEbm5us4zJ39+fWbNmMWbMGDQaDZs3b+Zf//oXu3btAqqazq1YsYIOHTrUWH3Jssz06dMpLCwkMTFR8ZacAQcOHCA0NJSQkJDzckV7thw9epQnnniCNWvW1PrbyJEjeeaZZ+jfv3+j5wl6vV6WLFnCokWLqKio4PDhwzWUmFesWEF6ejrt2rWjS5cuGI3Gs+phNWPGDB599FE6dOiASqWqpWUkhMBms/HFF1/w/vvvs3//foQQWCwW5syZg91uZ+bMmWf1mdsqGo0Gf39/ysrKCA8Pb5SQXr0Mk2oL1O12s2TJEj744APuu+8+Jk+eDFSpwqakpNSQzA4JCeG9996rYb1W/7s6UUyn09GzZ08+/OADCgoKKS0rI1iZdJuNktJS1q3fyPadu/jiv3M5kpV9yu1zjh9nX9p+AL74ei4GvZ4+vXoyeeIEunfrSmhICL16dCcgoPUkZXq9XgT/L5rm9XrJz8/n888/Z8GCBRw6dKjJc0skSaJdu3bcf//9XHnllQQHByNJEuHh4VitVl555RWys7MxmUyUlZXVeYygoCDuvfdeNBqNUh1QT1wuF++88w4TJkxgypQpJxWba2rMZjO7d+9mwIABbUakq/qh+95777FhwwZf08fIyEhGjhzJxIkTGTlyJElJSfVaJQsh8Hg87N69m9mzZxMZGcl9991HUlJSrcRhIQT79+/nyy+/PGlbCIfD4TNWNm3adFaGkSzL9O/fnw4dOvj0uoQQvvusWnPrhRde4Msvv6SoqAhJktBoNMTHx9OzZ0+GDh3a4POfC/j7+1NaWorH42mURPB63albt24lOjoalUrF+PHjGTJkSI0LITQ0lJkzZ9a4QLVaLd27d/dZndUXW2lpKb169cJoNPrqoQMCAzn+p5KcYpg0D4WFRaxdv4F/vvYGW7Ztb9AxbHY76zdtZv2mzRj9/Jg0YRxXXz6dsLAw+vbpRUArqBqRZZn9aamUWyvIy8tj69atzJkzh8OHD9ermVdjEBcXx9NPP80111yDXq/33bQmk4nrrruOYcOGUVlZSXR09EnLgP9a5qpwemRZZsSIEfTo0aPFQo52u53Vq1fz/PPP8/XXX9O5c+cWGceZIIQgJyeHZ599lu+++85nuAcHB/PAAw9w1113odPp0Gg09XoACSEoKSnhu+++47XXXuPw4cOo1Wp27drFY489xqhRozAYDD6tkLKyMubOncvixYvrleTtcDhwOBwN/rwmk4nAwECfUbJjxw4OHjzIxIkTCQ4OZt++fTz55JMsWbIEm82GTqdj2LBh3HbbbYwYMYLg4OBzUkDvTJBlmZiYGI4dO0ZYWJivl05DDZR6GSb//e9/GTp0KAMHDsRgMNT6EU6U/D2Rv1pO2dnZzJ07lwcffJCePXsCVaVeOTk5JLRvh8molA03B0XFxaxdv4EnnnuBtPTGSfqsqKzk+59+YdFvfzB50gSunXElMTHR9O7ZE4Oh5VaJ4aGh/PjLQl6c/e8WE0iKi4ujR48ete6baq9hly5dWmRc5zoqlYorr7yyxc4vhGD16tW88MILRERE1Jlr1xopLy/n008/ZcGCBVgsFt/7kZGRdO3a9YwN5KKiIv71r3/xySef+I7n8XhYvXo1OTk5/O1vf2PGjBmEhoZisVj48ccf+fzzz5u1Si4rK4uCggJCQkKoqKhg3759JCUlYTAYeOyxx1i8eDFutxudTsfUqVN5/vnnm1Xpti2g1WqJjY0lNzcXrVaL0Wj0eZ2qG//V19tbL8PksssuIy4uDlmWfY1+zhRJkpg0aRKDBg3Cz88PSZJwu93k5uYiSxJqlapRkl+r6u092O12bDYbNruNykobTqeTuLhYXxdju91OucWK1WqlpLQUP4MBPz+/P0sCteh0OvQ6XYu5f5sKa0UF69Zv5NmX/9VoRsmJOJxOfvxlEYuXLefqyy9n6uRJJCbE06VLSovkoBgMBqIjo5rVKNFoqpSM7XY7Xq+XPn36KIqt5ympqalkZGQwffr0NqHX5HQ6Wb58OfPmzcNsNtf4W0hICHFxcfU6TkVFhS8k8vvvv/PTTz/VMHKqyczM5IUXXuDAgQOkpKSQk5PDggULOH78eKN8nvpQXl7OO++8w9GjRxk+fDhCCBISEli3bh2rVq1i1apVuN1V7Qr69OnDww8/rBglJ0Gj0dCuXTscDgfl5eU1UjkcDkeNpH6DwXBSYbZ6PXVHjRrlax3tdrsb3IhKkqQaPTyKi4v5448/6NOrJ8FBQfW2ppxOJ0dzjpGVfZSKigrf+wJACLxCYLVaKS4pJTcvj6M5x5AkmDhubJWrHPB4vbhcbmS1mmO5uZSbyzHodfibTBj9qr4w7Z+uSr1eh9NZVbUxeNAAQttoIp3D4WDlqjV89Nnn7N67r0nPVVlp4z9ffsUPCxdy83XXMnzIYLp2SSGpQ2Kz5kgEBAYQHR2FQa/H1gwrsISEBKZOnUpKSgrHjx/n6NGjXHDBBeecgdva8Xq9ZGZmEhgY2KRdUE+F2WwmJycHh8PBb7/9htFo5PrrrycgIACv18uRI0fYunUrAQEBjB8/vlGvkeqcqjOJ9wshOHToEJ999lmtChyoqkipy7ioi2+++YY9e/b4dIJOlisCVR6V9957r17HbSqOHz/O+++/zzfffIPD4cBms9Wq7gkODubee+9lwIABLTTKtkG1d+TEfCqPx4PZbK4RmnO5XISFhdV5jDO6E3Q6HQ6Ho9E6ZFZWVpKVlcUlUy6gffvTW+KVlZXsTU0jNy+frKM5CFkmKCiEyKhIgoKCqays5PDhwxzKzCQvL6+qIZfRSELHTvj7++NAhVetJTg4hPCICOLi4vD398dms1FQUIDNZsPtduN2uykuLubQoUMczswkP/c4e/buRa/Tce+dt2MwGFD9KXUsy1UCS/7+/oQEB2PQ69HqdPj5GTD6+bWaREWn08myFauY9/2P/LZ4abOdt6SklH+/9Q7zFvzAvXfeRkpyMn379CYmOqpZHhZajYYAk4kRQ4eweHnTNubr0qULs2bN4tJLLyUsLAyLxUJpaSmRkZFNel6F2pjNZr7++muGDh3KhAkTWmQMarWaCy+8EKvVyrfffkt6ejpHjhxhxIgRHDt2jKVLl7Jjxw5CQkJISEggJSWl0c5dXl7O999/z549e4iNjSUuLo64uDjat29PVFRUnXN4eXk5//vf/1i+fHmdHsZDhw6xcuVK+vfvf9qciuqqzLYmBFhSUnLSvyUmJnLJJZe0mjm9LaFSqWr01PF6vdhstpNuXy/DJDs7m+DgYLRaLXa7vVFckm63u8qi9rhJ6pBI9J/9KOpCCMG+1DQyDmUiVGqi2yfQpXc/oqKiqrqE/plkI4RgpMeD1Wql8s9SV41G43vpdLo6k+D8/PxISEiodc5Ro0ZRVlZGYWEhRUVFVFZWkpeXx0/f/8TuXbuQ5T9LabVaQkNCiI6MJCY6itCQECLCwzGZqmJs7eJifWGklli52e12lq9czQ+/LOKr/33T7OcHyM7J4ZEnn6Fn927ce8dtxMXGMrB/P0JDG78B1F/p2bM7111zVZMaJrIsM2TIEK644gqfVzAgIKDJ2oIrnBq1Wk3Xrl2Jjo5usTGYTCZGjx5NSkoKOp2Ojz/+mA8//JAffvihyqNbXOwTKJs7dy7PP/98o5zX6XTyyy+/8Oyzz5KXl4fJZPK9/P39CQkJYfLkydx8882+XkEul4v58+fz8ccfU1lZWedxy8vL+fzzzzEajdxwww2EhoaedAxXXnklW7ZsYf78+W3OODkZubm5LFiwgAEDBmCz2SgvL8disVBeXk5lZSVJSUkMHz680fvGnItUOw1OhnSa2LsAeOihhxgyZAiTJk2ivLycmJiYsx7Y/v37ufDCC3n8wVmMGTmCpA6JdW7ndDpZv2ETGYcPczSvkEcefbRFOhFXf08ul4uSkhL27NnD119/zfr16xkzZgxRUVFotVpUKhUej4djx46xbds2nHY7Pbt3ZdzoUUSEhzN08EACAgKazUApLS1lzboNfLvgB+bO++6M96827rxeLyaTib59+3LNNdfw+uuvk5qa2qAxSZLEiKFDuOOWmzAZjURHRdGuXRxhoSFNEvIQQrDotz947OlnfeXOjYlGo2HMmDHMnj2bXr16tckwX1vH4XCQkZFBbGwsQUFBeL1enE4nKpWq0Ty89UEIgdPpRAjha04qhKCoqIhhw4bV2bValmXGjRvH4sWLG2UMHo+HLVu28Oijj7Jx48ZazeskSSIoKIgBAwbQv39/kpKSOHjwIP/5z38oLCw85bGrq8MmTpzICy+8QHJycp0ehOqy/IULF/Luu++yf//+M2qi1xqp/t78/Px8TQI9Ho/v335+fkyYMIEHH3yQbt26KZ6V+lHnZFmvp8DgwYPp3LmzT3imMVi7di1hIcHExcSQEB9f5zbWigpWr1mH0+Plymtv8HlHWoLqh41WqyUyMpKIiAhGjhzJkSNHCAgIqNXye9u2bQgh2LNnD6vWbeC7H37i0oumUlZWhslkIqlDInGxsfj7N24DrGq8Xi8HDh5iX1oar7zxFpu3bgOqHqJhYWGo1WrKy8uRZZmwsDC0Wi0ul4vKykoqKysxm80IIRgwYACDBg3CbDbTrl07xo8fz7Zt2yguLm7w2IQQrF63ntXr1pMQ356+vXoxasQw4tu1Q6vV0iExgbjYWIxGv0b5LiRJIqVzMtMvubjRDRONRsP48eN544036NSpk2KUtBAbN27k9ddf5+mnn6Zfv36+7qfNjcPhYM6cOVgsFm666SZCQ0ORJAmTyXTSBZUQ4qReioYgyzIDBw7k008/5amnnuLbb7+tdb7S0lKWLFnCsmXLfMZTfTwb4s/8vXXr1rF8+XI6dOhQp4dAlmWioqK4+eabGTFiBO+//z4//PADx48fb5Aya3Oi1+uJi4tDrVaTm5tLeXm5L2entLSU0tLSOverLnMOCQnhqaeeqpFPqXBm1MswufzyywHOqlb8r1x44YWsXbWCyIhwVKralmVRUTEbNm1GZ/Rn8uQprWrCP1Eg7mS6BIMGDWLQoEFYLBbWrl3LTz/9xB9//MH/vptP504dGTtqFKOGD8VkMjF86BACAxvP5V9cUsLWbTs4npfHE88+T25ePgBhYWFMmDCBSy65BH9/f3bt2oVarWbSpEmEhoZSXl7OoUOHOHjwID/88AMZGRl88cUXpKSk4PV6WbBgAffddx/79+9vNAn3I1nZHMnK5vuff0Gn09G9SxeGDhnEqGFDMRr96JKSQkx03THxMyG+fXv69upJVGQkefn5jTJ2WZYZM2YMr7/+epvQpzhX8Hq9lJeX43Q6CQ8PR5Ik+vTpw8cff9xo/VoaSrUoWXFxMSaTiRtvvBG1Ws3mzZs5cuRInftUe1kai+q5Uq1Wn3LerK8x8ldSUlKYNWsWM2bMOOV9Wd3gMCUlhdmzZ+Pv788777xT7wTaxkaWZVQqFW63+6QLbL1ez3XXXccdd9yB0Wjkhx9+4Mcff2TXrl31ev5FRUXRv3//NlMa3lppsVIBu91Ofn4BRXUkG2VlZ7Nj524MgcFMnDylBUbXePj7+3PBBRcwcuRIBg8ezJw5c0hNTeXjz7/gg0//w6jhw3C5XPTq2Z349u0b7P7zeDzk5xeQun8/ZnM5ev9Aii2VlP/ZIDEoKIi//e1v3HHHHT7vzuTJk30dNCVJIiYmxmeE9OrVi3/+85++ib56FdaxY0f27Wuaih6Hw8G2nTvZtnMnH3zyKX1792balMl069qF0OBgOid3IiwstEHfkdPpQKfTcvmlF/Puhx83ynhTUlJ47rnnSE5ObpTjKdQPi8XCZ599RkREBFdffTUqlarV5PNkZGRw8OBB7HY7X331lS9s++mnn2K1nrxZqcPhwOVyNWphwaJFixotPHQi06dP56qrrqq3nkllZSU7d+5k3759LRbOCQ0NZdSoUXTs2BGr1cqvv/5aw1AMCwujV69edOnShRdeeMHX9uGRRx5h5MiRvPfee/zwww+n1Vbp0aMHgwcPVsI4Z0m9DJP8/HwCAgIa9csODg5m7ISJFBUVsy81jYT49tjtDvamppKXX0B4bHvGjhvXaOdrSarbQ8+YMYNevXqxb98+MjIySEtLY8WKFTz8xNPceevNdOqYRL8+vYg9TQ5PdUaz1VpBUXExuXn52O12Kipt5BUV071Xb/R6PcuXf4TL5UKv13PHHXdw991318iMBur8TWVZJiUlpVaZZbt27Rg8eDArV648qTuzsXC7PWzeuo3NW7fh/2dVzbQLpxAVGUFERDgJ8fF/VkBp0f2Z21O9AnS6XFitVsrKzBw7novFYsHhdLJ7z14W/PhTo4xPrVZzww030KNHD2USamYkSSIsLIyOHTu29FBqsXLlSp83cevWrTz99NM4HA5yc3NP6Z3Iz89n3rx5XHrppfj5nV0IUwhBbm4u//3vf09ZZdJQiouLsdls9TJMnE4nS5cu5dVXX2Xr1q0N9rpX/+ZJSUlERkb62jesX7/+tHNRSEgI119/Pffccw8JCQm4XC769OnDM888w/Hjx0lMTOSWW27hoosuol27djW8HSqViqFDhxIREUFoaCj/+c9/AOjUqRN6vZ79+/dTXl7u216v15/176dQD8PEbrfz73//mzFjxjB69OhGO3FQUBD33HMP27dv48jRY2RkHsbhcCJkFZ269aRvv36Ndq7WgsFgoE+fPvTu3ZvKykoKCgrYtGkTb7/9Ng/940m6pqTw9GMPM2hAf6Kjo7DbHdjtduwOBxUVFZjN5VgrKqpubklCVqnR6HREt08gJjYO6U9X5f79+3n88cfZtm0bvXv35uKLL+aGG244o5hnVlYW3bp1q7GCk2WZTp06ERQU1OSGyYlYrFZ+XbyEXxcvITwslGGDBzNi2FCCgwIxGo3oT+jqKYTA4XRSWFjEnn2p7D9wgMwjRziac6xRx9SvXz8mTJigTEItgL+/PzNnzkSW5VYV4oWqFfNtt91GTk4Oy5cv59ChQ/Xar7CwkDfeeIOIiIhGKW+uTm7dvHlzo+d0fP/99/Tu3ZuZM2fWef2np6eza9cuMjMzOXz4MBs3bmTv3r1nPA5JkoiOjqZfv34MHz6cHj16EBERQUBAADqdjsrKStatW8crr7zCgQN1i0XGxMRw++23c/PNNxMXF4ckSciyzIwZM3C73XzwwQckJydz8cUX061bt5O2g+jYsSOPPfYYvXv3Rq1Wk5ycjEaj8XU+zs6u6jOWkZHB3r17iYyMbHXXZlvitIaJJEkkJyc3ukhRddb60KFVHYVLSkp8givnuhhVtQclMTGR2NhYunbtyvz58/n555954vmXeP7Jx/EzGJBkGY/Xi8fjJSIqmuiYWDqFhqHV69Fqtb6s/2qEEOzatYv77rsPj8fDO++8w6BBg4iKisJkOrMk2wMHDjBkyJBarbwjIiJapCqqmsKiYn5cuIgfFy6q8b7BYMDtdjda7sup0Ol0XH755SQnJyuTTzOzZ88ejEYjHTp0aOmh1Mm4ceMYOHAglZWVfPPNN7zxxhsUFBScdPvqB6XBYCAkJMTXLO+vVFf2LFu2jKNHj5KSkkJJSQkHDx5Er9dz2WWXkZKS4gvLhoSEMH78+CbxmuTl5fHTTz8xfvx42rVr57sHvF4vixcv5tVXX+XgwYO+RPozCd9Uj33ChAlMnTqVLl26EBYWRmhoqE8x/EQSEhJITk7mueeeY/ny5ej1ehITE+ncuTNdu3Zl8uTJdO3atUYPqupk5Ouuu46+fftisViIjo4+5b1cHeq+9tprEUL4mmn26NGD8vJyHn/8cSoqKti/fz9vvPEGISEh9O7du1Ea2p2XVGcbn+QlvF6vsNlswuVyCbvdLo4ePSoaA7PZLN555x2xZcuWRjleW8bj8YjKykqRn58vfv31VzFhwgRx7bXXioKCAmGz2YTdbhder/eUx3C5XGLLli2iT58+IjExUXz33XfCZrOddr+T8euvv4qcnJxa++fm5oorrrhCaDQaQVU5+Xn10mg0Ytq0aWL37t0N/m4VGs67774rXn755ZYexmnxer3i6NGjYubMmUKW5TqvJZPJJCZPniw+++wzceDAAVFaWirsdnudx8vMzBQ33nijCAgIEAaDQQQEBAiTySR0Op3Q6/ViwIAB4ueff/bNFXa7XXz22WfCZDI12X2QnJws7r//fvHoo4+Khx56SNx4440iKSnppJ/3dC+1Wi0uu+wysXbtWmE2m4XT6TztPeb1eoXL5RILFiwQw4YNE999953Izc0VZrNZVFZWCo/Hc8r9PR6PcLlcp92umoqKCvH555+Ld955RzidTiGEEFarVcyZM0f07dtXyLIs1Gq1GDZsmFi7dq1wu931Ou55TJ22x2kNkxNpTMMkPT1d3H777SIrK6tRjncuUFRUJN58803x4YcfihkzZojCwsJ677tjxw7Rv39/IUmSCAwMFDfddJP4+eefRVpamigrK6v3jVeNw+E46T5vv/22CAwMbHEjoblffn5+4oorrhDbtm1TjJIW4tixY2L79u0tPYx6M2fOHBEXF1frWoqPjxf/+te/REFBQb0evr///nudxznx1a1bN/HTTz+J8vJy8fPPP4tevXq1+D1zJq+YmBhx/PjxBn3PaWlp4ssvvxQVFRUN2r++eDwesWLFCvH++++LsrIy3/tut1usXr1ajB49WkRGRgp/f39xxx131NhGoU7qtD3OOGbSWG6pTp068e677zar+FFrx2AwoNPpiImJoVevXhw6dOikvQT+yurVqzl8+DBCCMxmM59//jnz58+nT58+jBo1iv79+9O7d+8artdTcSr1Qq1We965J7VaLRdffDHPPvusUoXTgsTExDSKwGNzkZiYSGhoKDk5Ob73QkNDueeee7j77rtPGRbNzc2lqKiIuLg49u/fT1FR0SnPtW/fPp555hn27dvH559/XqeYW2umS5cuvmqYMyUuLq5ZdGtkWWbUqFGMGjWqxhyoUqkYNmwYH330EcuXLycvL49Jkya1aNi7LXPGhok4S4G16v2rFUUV/h8/Pz+uv/56ZFmmV69efPvtt3Tq1KlWJc1fsdvtpKam1tIHsFgsrF69mtWrV9OuXTvGjBnDBRdcQHx8PCkpKac97sk43wwTSZIYMGAAjz32mGKUKJwxf71XunbtWq+H1tdff82yZctITk5m3bp1py1VBdi5cyepqaltUmW1e/fuDRbQrJbcbw5ONvfJskxycrIyRzQCzZplarPZ+P777+nXrx+dO3c+rx5u9aU6yz02NhZZlvnXv/7FnXfeecpkv127drFjx45TTkZHjx7lv//9LytWrCA2NpahQ4f6FH2rS9/q+3sMHTqUqVOn4vV6OXr0KLt376asrOyMPmdbIjY2lscff5wePXq09FDOe4QQFBcXs23bNiZMmNCqS7VLS0tZunQpWVlZNd63Wq0UFhbi8XhO+SDevHkzS5cu5Y8//jij87ZFowSqxMna0jMhKysLt9tN+/btlUV2I9OsoZycnBxWrVrVKvUHWiN6vZ758+cTEBDAtddeS3x8fK3vv6KigoULF9ZL9Mzj8XD06FFycnLYu3cv33//va+z6e2338748ePrtWJJTk7m+eefR5ZlzGazrx/G8ePHG/xZWytarZZHHnmE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37+f8vLyensRKysr+fzzz/ntt9/wer3k5uY2xZAbjL+/P08++SSXX345MTExTeYVkCSJgICAVlVt1VBkWebgwYNs376dZ599ttG9S+c6ZzTTSJKEWq3G7XbXS1BGCIHFYkGr1SourkZECHFOC5o1FiaTialTp/KPf/yDlJQUNBoNXq+XYcOGceWVV6JSqWoIy8myTFhYGFdffTXJycm89tpr6HS6ZlOUbAyEECxbtox33nkHSZJ45ZVXiIuLIysri/379xMWFsY333xDfn4+48aNIywsDI/Hg9vtJi0tjddeew2z2Uz37t2JiIiga9euvoTXM12QNCUnGlzNPS7xp1bJ0aNHqaioICkpCX9/fxwOB8eOHWtQN1+73c6RI0caf7BnicFg4OGHH+a+++47IxHG8x1Zlrn77rtxu92+kmqPx1OVP6FWK98jp55PzsgwkWUZtVqNw+Gol2HidDp54YUXmDp1KqNGjTqTUymcguq23Qonx2Qycffdd/PII4/UCEHIsoxWqz1p/FqSJHQ6HUOHDqVfv36oVKpW5Sk4FXa7nezsbL799lt+++03XC4XR48e5aKLLmLFihUcPXoUl8tFbm4uQgiuu+46hg4dSkFBAUeOHCErK4usrCyfNsPmzZtZt24dmZmZPPXUUz7PUmtBCEFGRgYajYb27dvXqGJrSo4fP863337Lq6++is1m46677uLuu+/G5XLh8Xia9NzNSWBgILfccguzZs1SjJIz5K9ztNfrZceOHRQUFDB8+HACAwNbcHQtj9frJS0tjW7dutX59zM2TDQazRlJHuv1ehITE8/kNAqnQa/Xc80117Bhw4Y2Kz/d1ISFhfH3v//9rPIiWlOyZ33Izs7mueee45dffsHlcgFVZb7bt2+vc/u1a9eybt26WmEJj8dDbm4uwcHBZGZm8v333zN27Fhf64LWgtfr5fvvv0etVjN69GisVitarZa+ffs26W/3+eef89JLL/lCfJ9++in5+fn4+flhNpub7LzNgV6vp0OHDiQmJjJo0CBuvfXWOnORFM6M6jDpmjVrSEpKOu8Mk8OHD2OxWOjWrRsqlcpXPNEohkl13bbD4ajX9lqtlieeeKJVTWbnAmq1mnHjxjFgwADWrVvX0sNplZjNZjZv3sy0adNaeijNhtPpJC8v74z0ZOrKU6qu+kpNTWXQoEF4PB4MBkOr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y6UrqaqafD9Wq5WCggISiQSbNm1C1/VkK0r7b3Krr7EzGzzllFN488038Xq9AMkf3Lp16ygoKEBVVS666CIAnnjiCe69917Ky8s588wzO1y5mEymZGU7VVW5/fbbO2xn7ty53HvvvVRUVHDllVdSU1PD7373O8xmMz179qSxsTH5AVgsFmKxGK+88goul4vTTz8dq9XKzJkzicfjBINB7rjjjg79v3vssQfPPvssb7/9NuFwGLvdjtlsxmw2Y7VaCQaDNDc307dvXy699FKam5tZuHAh5557Lh6PhxtvvJE77riD4uJipk2bRiKR4PXXX+f555+nrKyM8847D7/fzzPPPMO9995LaWkpZ5111jYHx5lMJq677jo+/PBDAC6//HIaGhqIRCJcfvnl+Hw+pk+fzp577kkgEADg7rvvJhqN8uyzz/LBBx+gqiqTJk2ipqaG999/n6uuuori4mJ+97vfsWnTpq1ud86cOUybNi35Pfbu3ZuysjLefvttrr76aqCtpaI9wdvcvHnzePHFF/nxxx8ZMWIE//d//8e3337L2Wefzf3337/FQNVQKMTf//53PvjgA8aPH9/hvm+++YaxY8cCcNRRR7FgwYIO96uqmmwh25ZzzjmHl156iY0bN1JaWprc/tq1aykrKyMUCnHllVcCcO+99/Lkk09SXFzM1KlTO7RU+f1+zjrrLMrLy3n++eeTt69Zs4ZBgwbx8MMPM3/+/ORK2O0j0levXs2gQYN49tln+eijjzrE9v7773PkkUcC8MYbb3DllVcmmz+HDBmCw+FgxIgRzJ8/v8PzvvjiC8aOHUuPHj0AOOuss/j8888BmD59Ov/5z38wmUycc845AFx77bWsW7cORVG48MILk497//33URSFyy67DGirwXHvvfcyf/58XC5XsnChzWbDbDYze/ZsbrvtNsrKyvjggw946KGHqKio4NJLL6WhoYFXXnmF2bNnU1ZWxvnnn08oFEpOIWyfXXDmmWfyz3/+k7q6Otxud7Lv/eeff6akpIR4PJ6M58EHH+SRRx6htLSU0047jUgkkvwMIpEIJ554ImazGYvFQmtrK3fccQfffvst8Xic008/HYDbb7+dl19+GZfLxbnnnrvFe3rxxRe5+eabKSsrY+3atfzjH/9I7ntVVVWsXbuWm2++Ofla0DYG4K677upwvDKZTFx22WXU1NRQW1vLJZdcgtls5qqrrmLOnDkUFxdz2WWXkZeXl6xgLeUGIQThcDh5Qb6tacCdFYvF+Oqrr7Y43uWSzX+Hffv2Ta6YvGnTJlpaWrb9vJ3ZiMvlwul08thjjyUPCNB2oHv//feZO3duh6vr6dOnM378eCZOnMhXX32VvH3AgAEUFxdzzDHHbHUK6AsvvIDb7WbevHmYTCY+++wz+vfvzzvvvIPX62Xw4MEdHi+E4Oabb+a4446jtLSUmpoaJk+ezLvvvsurr76a7Cpqd8EFF3DLLbewePFijjjiCBYuXMjgwYPZe++9OfLII3E4HKxZs4Y333yTYDDIkiVLAJgyZQoTJ07k2GOPZdy4ccnR1A0NDTz//PM4nU7mz59PPB7n+++/B+C3v/0tEyZMYPDgwcmEamsURUmOeP7oo49Yv349q1at4ssvv0yunfDxxx8zZMiQDs/717/+xZ133smkSZOSJ3eAadOmceyxxzJhwgRWrly51W0GAoGtnvA7UzPE4XDg8XgoKChg7dq1KIrCLbfcQkFBwVYTGVVVKSoqQlVVNmzY0OG+aDSazLBtNluHE1NraytPPPEEL774IjU1NTz66KP8/e9/3+L1y8rKCAQCPPXUU5x77rnJ2wsLC3nnnXf45ptvOuyb1157LRMnTuTAAw9k6dKlydu//PJLJk6cyPjx45k+fXry9vbkNxgMMn/+fAYPHkx5eTnHHHMMLpcLTdN45ZVX8Pl8fPHFFx1iq66uTrYCbOszV1WVeDze4bZfP3bzktRms5kbb7yRqVOnkkgk8Pv9vPvuu9TW1rJ06VK+/fZbEokEDoeDGTNmcNZZZyW7kv71r38xdOhQ/vGPfzB27Fjsdjs9evTgqKOOYs899wT+/3778ssvJ3+LiqLwxRdf8Pe//z25r0ejUZYuXUq/fv049NBD2XfffZOfu67rPPHEE8nEqf32d999ly+//LLD93H11Vdz7LHHMnr0aBYuXJi8/dtvv2XUqFFMmTKFyZMnU1ZWxmeffcZNN93EmWeeiaZpyQulmTNnMmXKFDRNw+VyUVFRwZFHHslee+0FtCX8EyZM6DA1c8iQIZx77rlcc801fPPNN1t8LwAVFRXJ41VFRQU//fQTl1xyCeeffz6rV69GCIHNZuPmm2/moIMOonfv3syZM4doNLpFK6mUnYQQeL1eWltbcTgclJaW7vaM0Hg8ztKlS1m2bFmKosx87VXd+/Xrt93Pb6cHv5599tlcfPHF3HTTTfzhD38A2g4IDz/8MBUVFR1OSu191oFAYKf64Ox2O6eeemqyC8LpdGKz2aiqquK5555j+fLl3HrrrcnHt4+SLywsJBgMYrPZOPfcc7nooosIBAK89dZbyfni7R/GIYccwiGHHMKAAQP48MMPGTp0KLquA/Daa69RXFzMrbfeysyZM5NX1O1X4WazucPfNU3D4XBw3nnnUV5ezvTp03G73bz99tvJ993+uG1ZvHgxAwcOxGQyUVFRkTwpTp8+Hbvdzscff8x3333HJZdc0mH8htvtxuv10qNHjw5XZ53Z7qGHHsrs2bOTJ472abn77LMP3333XbJLIhqNbtECMnLkSE488UTKy8t56qmnmDJlCg6HY5vfs8fjYfLkyQwcOJAHHniAqVOnJu8bNGgQa9asYeTIkaxevZoTTzwxeZ/NZmPUqFHJ1xg1atQ2mz1POeUU7rnnHv74xz8mb7v++ut58cUX8Xg8HHLIIcnbt7Vv2u32DvdBW2vJZ599xvPPP89bb73FihUrUBQlub9UV1fz73//m1deeYX333+fefPmdYirtLQ0eXUwatQoPv7442QLSjweT9bn+XUyeOCBB/LMM88k18ZYs2YNPXr0QFEU4vE40WgUh8NBJBJJrjF11VVXoSgK06dPT16p/PqKzm63M3XqVKZOncrEiROprq7u8H6AZL+33W7njDPOSJ7cXS4Xs2fP5vzzz6e0tLTDvr7586FtXNGNN97I73//+w7fx9/+9jcKCwsZOXLkDr8Ph8OxxTgRRVGS9RRCoVCHpLb9/vb/b+09ba59u5uvMdL+//aE59faf08Wi4VEIoGiKDidThRFoaqqivvuu4/169fzl7/8hcrKSn77299u9XWk7BAKhZLHgvz8/J2aebM9drud4447rkPZ+O5CURSKioq2ef9OJyZHHHHEFlfgQ4YM4YEHHkDTtA4HkUcffZTPP/+chQsXJpOYdh6Ph5kzZyabczc3ffp0pk+fzjHHHJNsLn311VdxuVxs2LBhi4F0ZrOZW265heLiYoqKipJjBoqKiujZsydms5lwOMymTZsoLS3liSeeYN26dZSVlfHee+/xzDPP4HK5mDVrVnKMyZ133klTUxOffPLJFl0PWzNz5kyuu+46jj76aNavX89tt922w+d4vV6mT5+ezMQfffRRzGYzU6ZM4frrr2fIkCH4/X4uuOACZs2axcCBA3E6nR2uoq+77jrOO+889thjD9atW7fNlo7Kykpuu+02Zs+enbxtzJgxvP/++5x22mnst99+/PDDD8yaNYv77ruPCy+8kJEjRybXXHjooYc6vN5zzz3Hxx9/zOLFizuceLZm3bp1ya65uXPnJj+bo446irlz53LOOedw5plnsnz5clatWsXhhx+efK7dbmfEiBE0Nzfj8Xg4+OCDt7mdk046iZNOOqnDbf379+eBBx5Irljd7s9//jMDBw6kqampQyvU4Ycfzr333ss999zDDz/8QGlpKcXFxaxZs4ZZs2bxySefcNhhh+F0OgkEAtx4441ceumlVFdXM2vWLObNm8fQoUM7xDBu3DiefvppTj31VM4++2wuuugizj//fAYOHMh3332XHBMzbNiwDs8bNGgQJ5xwAlOmTGHYsGF88cUXPProo0DbSXHGjBl4PB723Xdf7HY7559/Ptdccw3Dhw+noaGBe+65Z6uf09SpUxk6dCiBQABVVenduzejRo3iuuuu69ASCnDNNddw/fXXM27cOKqrq5k+fTo33HADM2bMYOzYsaxfv5477riDgw8+mDvvvJNTTz01+dwJEyZs8VsdPHgwDzzwAH6/v0ML0axZs9hrr71Yv349+++/f/L2Aw88kIceeohbbrkFk8nEJZdcwsUXX8x5551HRUUFI0aM2OaJYtSoUcycOXOL97S5pqYmZs6cSW1tLdOmTQPaEsnbbrutQ1Nz//79ufbaa5k2bRonn3wyl156KYqiMGXKlA6vF4lEkl1GNTU1nTp2SJkpkUjQ2tpKPB5PjpVI5ewrs9ksW9S2pX2E7Db+JIVCIREIBDa/STQ3NwtN04SmaeKnn34Szc3NoqWlRQghxGWXXSZWrlwpVqxYIWKxmPg1XddFU1OTiEajyef4fD4Rj8eFEEJEIhGxbNkyUVdXJ4QQIhwOiyVLliT/vbmWlhYRCATEqlWrhKZpydsvvvhisWzZMqHruojH48Lv94uGhgah67qorKwUy5YtE6FQKPn4WCwmGhsbhRBCbNq0Saxbt04Eg0ERjUZFNBpNvv9AICAikcgWMQeDQbFkyRLR3NwshBDC7/cn3/vmj2vX2NgoGhoaRCKR2OI9NTQ0iKVLlya3s2nTpg7/9nq9QtM0EQ6HRTQaFa2trWLcuHEiHA6LUCgkwuFwMtZoNCr+9a9/iTfeeGOL7bS/1tKlS5PPEUIITdPEunXrxM8//yx0Xe/w+GAwKOrr60VjY2OHzzsWi4nW1tatbqO2tlYsWbKkwz7U1NSU/HskEhFr1qzZ6mcRjUZFZWXlVl+3PZ7Nv0chRPI70DRNrFixQrS2tib3s6lTp4q6ujqxcuXKrW4vFouJFStWiHA4LHw+nxBCiNbWVrFixQoRiUSS70HTNNHY2Cji8bjw+Xxi+fLlHfaTzZ1//vkdbm9sbBTLli1L7h8333yzWLVq1VbfX2trq1i1alWH/ec3v/mN8Pl8YvXq1R2+g6amJrFkyZLk59H+njf/eywWE8uXL9/iu/X7/ck/0Wg0eXs4HBZLly4VDQ0Nydt+va+339ba2irC4bAIBoMd3kP743RdFytWrBBerzcZz7Rp00RlZaVYsWLFFr+R9uesXbtWbNiwIXlbfX29WL9+fYf31v45bP6e299P++9AiLb9ye/3Jx9bV1cnNm7cmHxOPB4Xy5cvF+FwWHi9XqHrutB1XbS0tCR/I9XV1aKqqioZX0tLi/jxxx/FrFmzRCAQEIsXL04eS6Tsouu6CAaDYsOGDaKhoUFEIpEtjoFSymw191DE9qft7PK8t4ceeojTTz/dsJWA77nnHhRFSU6HhP8/orquri5ZDCfb6w/8/PPP3H333ei6zmmnnbbNaZmapm2xTkK2iMVi1NXV0adPn5S83h/+8AdmzJixwwG1qeTz+ZJVi7emrq5ui9ko23P99ddz//33pyo8Q91zzz1ceuml223aTbdEIkEoFEqW21YUhUgkgtVq7dRvRvwyffTLL7/k6quvZuzYsfzpT3+ipKSkC6KXUkX8UjSsoaGBsrIyLBZL2upkiV+mmK9fv55DDjkkK4/NKbDVE3DaEpNMFgwGaW1tpaysTFZrzAKxWIza2toO03clKVWEEKxatYpHHnmEMWPGMHXq1F2e/unz+TjrrLOIRCLMnj07Ob1ayg6aplFfX4/L5Up74TxN0/joo4946623uP/++8nLy0vbtjLYLiUmkiRJkiRJXaZbth1JkiRJkpSZZGIiSZIkSVLGkImJJEmSJEkZQyYmkiRJkiRlDJmYSJIkSZKUMWRiIkmSJElSxvh/+QB58aQ+z7sAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "mapMisc.static_map_vector(sel_districts, \"shapeID\")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "sel_districts.to_file(f'{sel_iso3}_sel_districts.geojson', driver=\"GeoJSON\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Earth Engine", + "language": "python", + "name": "ee" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/Untitled.ipynb b/notebooks/Untitled.ipynb new file mode 100644 index 0000000..3e461ed --- /dev/null +++ b/notebooks/Untitled.ipynb @@ -0,0 +1,143 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Importing Overture data from Parquet\n", + "\n", + "The [Overture foundation/project](https://overturemaps.org/download/) has developed a novel dataset that serves as a supplement to OpenStreetMap. There is a lot more to it, so please check out the link above.\n", + "\n", + "This notebook will highlight how to parse their open data into GeoPandas Dataframes" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/wb411133/.conda/envs/ee/lib/python3.9/site-packages/geopandas/_compat.py:106: UserWarning: The Shapely GEOS version (3.9.1-CAPI-1.14.2) is incompatible with the GEOS version PyGEOS was compiled with (3.10.4-CAPI-1.16.2). Conversions between both will be slow.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "import sys, os, importlib\n", + "import rasterio, geojson\n", + "\n", + "import pandas as pd\n", + "import geopandas as gpd\n", + "\n", + "from sedona.spark import * \n", + "\n", + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "ename": "Py4JJavaError", + "evalue": "An error occurred while calling o52.count.\n: org.apache.spark.SparkException: Job aborted due to stage failure: Task serialization failed: org.apache.spark.SparkException: Failed to register classes with Kryo\norg.apache.spark.SparkException: Failed to register classes with Kryo\n\tat org.apache.spark.serializer.KryoSerializer.$anonfun$newKryo$5(KryoSerializer.scala:185)\n\tat scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)\n\tat org.apache.spark.util.Utils$.withContextClassLoader(Utils.scala:240)\n\tat org.apache.spark.serializer.KryoSerializer.newKryo(KryoSerializer.scala:173)\n\tat org.apache.spark.serializer.KryoSerializer$$anon$1.create(KryoSerializer.scala:104)\n\tat com.esotericsoftware.kryo.pool.KryoPoolQueueImpl.borrow(KryoPoolQueueImpl.java:48)\n\tat org.apache.spark.serializer.KryoSerializer$PoolWrapper.borrow(KryoSerializer.scala:111)\n\tat org.apache.spark.serializer.KryoSerializerInstance.borrowKryo(KryoSerializer.scala:351)\n\tat org.apache.spark.serializer.KryoSerializationStream.(KryoSerializer.scala:271)\n\tat org.apache.spark.serializer.KryoSerializerInstance.serializeStream(KryoSerializer.scala:437)\n\tat org.apache.spark.broadcast.TorrentBroadcast$.blockifyObject(TorrentBroadcast.scala:356)\n\tat org.apache.spark.broadcast.TorrentBroadcast.writeBlocks(TorrentBroadcast.scala:160)\n\tat org.apache.spark.broadcast.TorrentBroadcast.(TorrentBroadcast.scala:99)\n\tat org.apache.spark.broadcast.TorrentBroadcastFactory.newBroadcast(TorrentBroadcastFactory.scala:38)\n\tat org.apache.spark.broadcast.BroadcastManager.newBroadcast(BroadcastManager.scala:78)\n\tat org.apache.spark.SparkContext.broadcastInternal(SparkContext.scala:1548)\n\tat org.apache.spark.SparkContext.broadcast(SparkContext.scala:1530)\n\tat org.apache.spark.scheduler.DAGScheduler.submitMissingTasks(DAGScheduler.scala:1535)\n\tat org.apache.spark.scheduler.DAGScheduler.submitStage(DAGScheduler.scala:1353)\n\tat org.apache.spark.scheduler.DAGScheduler.handleMapStageSubmitted(DAGScheduler.scala:1334)\n\tat org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.doOnReceive(DAGScheduler.scala:2934)\n\tat org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:2923)\n\tat org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:2912)\n\tat org.apache.spark.util.EventLoop$$anon$1.run(EventLoop.scala:49)\nCaused by: java.lang.ClassNotFoundException: org.apache.sedona.core.serde.SedonaKryoRegistrator\n\tat java.net.URLClassLoader.findClass(URLClassLoader.java:387)\n\tat java.lang.ClassLoader.loadClass(ClassLoader.java:418)\n\tat java.lang.ClassLoader.loadClass(ClassLoader.java:351)\n\tat java.lang.Class.forName0(Native Method)\n\tat java.lang.Class.forName(Class.java:348)\n\tat org.apache.spark.util.Utils$.classForName(Utils.scala:227)\n\tat org.apache.spark.serializer.KryoSerializer.$anonfun$newKryo$7(KryoSerializer.scala:180)\n\tat scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:286)\n\tat scala.collection.mutable.ResizableArray.foreach(ResizableArray.scala:62)\n\tat scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:55)\n\tat scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:49)\n\tat scala.collection.TraversableLike.map(TraversableLike.scala:286)\n\tat scala.collection.TraversableLike.map$(TraversableLike.scala:279)\n\tat scala.collection.AbstractTraversable.map(Traversable.scala:108)\n\tat org.apache.spark.serializer.KryoSerializer.$anonfun$newKryo$5(KryoSerializer.scala:180)\n\t... 23 more\n\n\tat org.apache.spark.scheduler.DAGScheduler.failJobAndIndependentStages(DAGScheduler.scala:2785)\n\tat org.apache.spark.scheduler.DAGScheduler.$anonfun$abortStage$2(DAGScheduler.scala:2721)\n\tat org.apache.spark.scheduler.DAGScheduler.$anonfun$abortStage$2$adapted(DAGScheduler.scala:2720)\n\tat scala.collection.mutable.ResizableArray.foreach(ResizableArray.scala:62)\n\tat scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:55)\n\tat scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:49)\n\tat org.apache.spark.scheduler.DAGScheduler.abortStage(DAGScheduler.scala:2720)\n\tat org.apache.spark.scheduler.DAGScheduler.submitMissingTasks(DAGScheduler.scala:1545)\n\tat org.apache.spark.scheduler.DAGScheduler.submitStage(DAGScheduler.scala:1353)\n\tat org.apache.spark.scheduler.DAGScheduler.handleMapStageSubmitted(DAGScheduler.scala:1334)\n\tat org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.doOnReceive(DAGScheduler.scala:2934)\n\tat org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:2923)\n\tat org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:2912)\n\tat org.apache.spark.util.EventLoop$$anon$1.run(EventLoop.scala:49)\nCaused by: org.apache.spark.SparkException: Failed to register classes with Kryo\n\tat org.apache.spark.serializer.KryoSerializer.$anonfun$newKryo$5(KryoSerializer.scala:185)\n\tat scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)\n\tat org.apache.spark.util.Utils$.withContextClassLoader(Utils.scala:240)\n\tat org.apache.spark.serializer.KryoSerializer.newKryo(KryoSerializer.scala:173)\n\tat org.apache.spark.serializer.KryoSerializer$$anon$1.create(KryoSerializer.scala:104)\n\tat com.esotericsoftware.kryo.pool.KryoPoolQueueImpl.borrow(KryoPoolQueueImpl.java:48)\n\tat org.apache.spark.serializer.KryoSerializer$PoolWrapper.borrow(KryoSerializer.scala:111)\n\tat org.apache.spark.serializer.KryoSerializerInstance.borrowKryo(KryoSerializer.scala:351)\n\tat org.apache.spark.serializer.KryoSerializationStream.(KryoSerializer.scala:271)\n\tat org.apache.spark.serializer.KryoSerializerInstance.serializeStream(KryoSerializer.scala:437)\n\tat org.apache.spark.broadcast.TorrentBroadcast$.blockifyObject(TorrentBroadcast.scala:356)\n\tat org.apache.spark.broadcast.TorrentBroadcast.writeBlocks(TorrentBroadcast.scala:160)\n\tat org.apache.spark.broadcast.TorrentBroadcast.(TorrentBroadcast.scala:99)\n\tat org.apache.spark.broadcast.TorrentBroadcastFactory.newBroadcast(TorrentBroadcastFactory.scala:38)\n\tat org.apache.spark.broadcast.BroadcastManager.newBroadcast(BroadcastManager.scala:78)\n\tat org.apache.spark.SparkContext.broadcastInternal(SparkContext.scala:1548)\n\tat org.apache.spark.SparkContext.broadcast(SparkContext.scala:1530)\n\tat org.apache.spark.scheduler.DAGScheduler.submitMissingTasks(DAGScheduler.scala:1535)\n\t... 6 more\nCaused by: java.lang.ClassNotFoundException: org.apache.sedona.core.serde.SedonaKryoRegistrator\n\tat java.net.URLClassLoader.findClass(URLClassLoader.java:387)\n\tat java.lang.ClassLoader.loadClass(ClassLoader.java:418)\n\tat java.lang.ClassLoader.loadClass(ClassLoader.java:351)\n\tat java.lang.Class.forName0(Native Method)\n\tat java.lang.Class.forName(Class.java:348)\n\tat org.apache.spark.util.Utils$.classForName(Utils.scala:227)\n\tat org.apache.spark.serializer.KryoSerializer.$anonfun$newKryo$7(KryoSerializer.scala:180)\n\tat scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:286)\n\tat scala.collection.mutable.ResizableArray.foreach(ResizableArray.scala:62)\n\tat scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:55)\n\tat scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:49)\n\tat scala.collection.TraversableLike.map(TraversableLike.scala:286)\n\tat scala.collection.TraversableLike.map$(TraversableLike.scala:279)\n\tat scala.collection.AbstractTraversable.map(Traversable.scala:108)\n\tat org.apache.spark.serializer.KryoSerializer.$anonfun$newKryo$5(KryoSerializer.scala:180)\n\t... 23 more\n", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mPy4JJavaError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mconfig\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mSedonaContext\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuilder\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"fs.s3a.aws.credentials.provider\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"org.apache.hadoop.fs.s3a.AnonymousAWSCredentialsProvider\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetOrCreate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0msedona\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mSedonaContext\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcreate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/ee/lib/python3.9/site-packages/sedona/spark/SedonaContext.py\u001b[0m in \u001b[0;36mcreate\u001b[0;34m(cls, spark)\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;32mreturn\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mSedonaContext\u001b[0m \u001b[0mwhich\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0man\u001b[0m \u001b[0minstance\u001b[0m \u001b[0mof\u001b[0m \u001b[0mSparkSession\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 35\u001b[0m \"\"\"\n\u001b[0;32m---> 36\u001b[0;31m \u001b[0mspark\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msql\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"SELECT 1 as geom\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcount\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 37\u001b[0m \u001b[0mPackageImporter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mimport_jvm_lib\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mspark\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_jvm\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 38\u001b[0m \u001b[0mspark\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_jvm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSedonaContext\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcreate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mspark\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_jsparkSession\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/ee/lib/python3.9/site-packages/pyspark/sql/dataframe.py\u001b[0m in \u001b[0;36mcount\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1191\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1192\u001b[0m \"\"\"\n\u001b[0;32m-> 1193\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_jdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcount\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1194\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1195\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mcollect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mRow\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/ee/lib/python3.9/site-packages/py4j/java_gateway.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args)\u001b[0m\n\u001b[1;32m 1320\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1321\u001b[0m \u001b[0manswer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgateway_client\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend_command\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcommand\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1322\u001b[0;31m return_value = get_return_value(\n\u001b[0m\u001b[1;32m 1323\u001b[0m answer, self.gateway_client, self.target_id, self.name)\n\u001b[1;32m 1324\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/ee/lib/python3.9/site-packages/pyspark/errors/exceptions/captured.py\u001b[0m in \u001b[0;36mdeco\u001b[0;34m(*a, **kw)\u001b[0m\n\u001b[1;32m 167\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdeco\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mAny\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkw\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mAny\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mAny\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 168\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 169\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkw\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 170\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mPy4JJavaError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 171\u001b[0m \u001b[0mconverted\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mconvert_exception\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjava_exception\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/ee/lib/python3.9/site-packages/py4j/protocol.py\u001b[0m in \u001b[0;36mget_return_value\u001b[0;34m(answer, gateway_client, target_id, name)\u001b[0m\n\u001b[1;32m 324\u001b[0m \u001b[0mvalue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mOUTPUT_CONVERTER\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mtype\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0manswer\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgateway_client\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 325\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0manswer\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mREFERENCE_TYPE\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 326\u001b[0;31m raise Py4JJavaError(\n\u001b[0m\u001b[1;32m 327\u001b[0m \u001b[0;34m\"An error occurred while calling {0}{1}{2}.\\n\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 328\u001b[0m format(target_id, \".\", name), value)\n", + "\u001b[0;31mPy4JJavaError\u001b[0m: An error occurred while calling o52.count.\n: org.apache.spark.SparkException: Job aborted due to stage failure: Task serialization failed: org.apache.spark.SparkException: Failed to register classes with Kryo\norg.apache.spark.SparkException: Failed to register classes with Kryo\n\tat org.apache.spark.serializer.KryoSerializer.$anonfun$newKryo$5(KryoSerializer.scala:185)\n\tat scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)\n\tat org.apache.spark.util.Utils$.withContextClassLoader(Utils.scala:240)\n\tat org.apache.spark.serializer.KryoSerializer.newKryo(KryoSerializer.scala:173)\n\tat org.apache.spark.serializer.KryoSerializer$$anon$1.create(KryoSerializer.scala:104)\n\tat com.esotericsoftware.kryo.pool.KryoPoolQueueImpl.borrow(KryoPoolQueueImpl.java:48)\n\tat org.apache.spark.serializer.KryoSerializer$PoolWrapper.borrow(KryoSerializer.scala:111)\n\tat org.apache.spark.serializer.KryoSerializerInstance.borrowKryo(KryoSerializer.scala:351)\n\tat org.apache.spark.serializer.KryoSerializationStream.(KryoSerializer.scala:271)\n\tat org.apache.spark.serializer.KryoSerializerInstance.serializeStream(KryoSerializer.scala:437)\n\tat org.apache.spark.broadcast.TorrentBroadcast$.blockifyObject(TorrentBroadcast.scala:356)\n\tat org.apache.spark.broadcast.TorrentBroadcast.writeBlocks(TorrentBroadcast.scala:160)\n\tat org.apache.spark.broadcast.TorrentBroadcast.(TorrentBroadcast.scala:99)\n\tat org.apache.spark.broadcast.TorrentBroadcastFactory.newBroadcast(TorrentBroadcastFactory.scala:38)\n\tat org.apache.spark.broadcast.BroadcastManager.newBroadcast(BroadcastManager.scala:78)\n\tat org.apache.spark.SparkContext.broadcastInternal(SparkContext.scala:1548)\n\tat org.apache.spark.SparkContext.broadcast(SparkContext.scala:1530)\n\tat org.apache.spark.scheduler.DAGScheduler.submitMissingTasks(DAGScheduler.scala:1535)\n\tat org.apache.spark.scheduler.DAGScheduler.submitStage(DAGScheduler.scala:1353)\n\tat org.apache.spark.scheduler.DAGScheduler.handleMapStageSubmitted(DAGScheduler.scala:1334)\n\tat org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.doOnReceive(DAGScheduler.scala:2934)\n\tat org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:2923)\n\tat org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:2912)\n\tat org.apache.spark.util.EventLoop$$anon$1.run(EventLoop.scala:49)\nCaused by: java.lang.ClassNotFoundException: org.apache.sedona.core.serde.SedonaKryoRegistrator\n\tat java.net.URLClassLoader.findClass(URLClassLoader.java:387)\n\tat java.lang.ClassLoader.loadClass(ClassLoader.java:418)\n\tat java.lang.ClassLoader.loadClass(ClassLoader.java:351)\n\tat java.lang.Class.forName0(Native Method)\n\tat java.lang.Class.forName(Class.java:348)\n\tat org.apache.spark.util.Utils$.classForName(Utils.scala:227)\n\tat org.apache.spark.serializer.KryoSerializer.$anonfun$newKryo$7(KryoSerializer.scala:180)\n\tat scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:286)\n\tat scala.collection.mutable.ResizableArray.foreach(ResizableArray.scala:62)\n\tat scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:55)\n\tat scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:49)\n\tat scala.collection.TraversableLike.map(TraversableLike.scala:286)\n\tat scala.collection.TraversableLike.map$(TraversableLike.scala:279)\n\tat scala.collection.AbstractTraversable.map(Traversable.scala:108)\n\tat org.apache.spark.serializer.KryoSerializer.$anonfun$newKryo$5(KryoSerializer.scala:180)\n\t... 23 more\n\n\tat org.apache.spark.scheduler.DAGScheduler.failJobAndIndependentStages(DAGScheduler.scala:2785)\n\tat org.apache.spark.scheduler.DAGScheduler.$anonfun$abortStage$2(DAGScheduler.scala:2721)\n\tat org.apache.spark.scheduler.DAGScheduler.$anonfun$abortStage$2$adapted(DAGScheduler.scala:2720)\n\tat scala.collection.mutable.ResizableArray.foreach(ResizableArray.scala:62)\n\tat scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:55)\n\tat scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:49)\n\tat org.apache.spark.scheduler.DAGScheduler.abortStage(DAGScheduler.scala:2720)\n\tat org.apache.spark.scheduler.DAGScheduler.submitMissingTasks(DAGScheduler.scala:1545)\n\tat org.apache.spark.scheduler.DAGScheduler.submitStage(DAGScheduler.scala:1353)\n\tat org.apache.spark.scheduler.DAGScheduler.handleMapStageSubmitted(DAGScheduler.scala:1334)\n\tat org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.doOnReceive(DAGScheduler.scala:2934)\n\tat org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:2923)\n\tat org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:2912)\n\tat org.apache.spark.util.EventLoop$$anon$1.run(EventLoop.scala:49)\nCaused by: org.apache.spark.SparkException: Failed to register classes with Kryo\n\tat org.apache.spark.serializer.KryoSerializer.$anonfun$newKryo$5(KryoSerializer.scala:185)\n\tat scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)\n\tat org.apache.spark.util.Utils$.withContextClassLoader(Utils.scala:240)\n\tat org.apache.spark.serializer.KryoSerializer.newKryo(KryoSerializer.scala:173)\n\tat org.apache.spark.serializer.KryoSerializer$$anon$1.create(KryoSerializer.scala:104)\n\tat com.esotericsoftware.kryo.pool.KryoPoolQueueImpl.borrow(KryoPoolQueueImpl.java:48)\n\tat org.apache.spark.serializer.KryoSerializer$PoolWrapper.borrow(KryoSerializer.scala:111)\n\tat org.apache.spark.serializer.KryoSerializerInstance.borrowKryo(KryoSerializer.scala:351)\n\tat org.apache.spark.serializer.KryoSerializationStream.(KryoSerializer.scala:271)\n\tat org.apache.spark.serializer.KryoSerializerInstance.serializeStream(KryoSerializer.scala:437)\n\tat org.apache.spark.broadcast.TorrentBroadcast$.blockifyObject(TorrentBroadcast.scala:356)\n\tat org.apache.spark.broadcast.TorrentBroadcast.writeBlocks(TorrentBroadcast.scala:160)\n\tat org.apache.spark.broadcast.TorrentBroadcast.(TorrentBroadcast.scala:99)\n\tat org.apache.spark.broadcast.TorrentBroadcastFactory.newBroadcast(TorrentBroadcastFactory.scala:38)\n\tat org.apache.spark.broadcast.BroadcastManager.newBroadcast(BroadcastManager.scala:78)\n\tat org.apache.spark.SparkContext.broadcastInternal(SparkContext.scala:1548)\n\tat org.apache.spark.SparkContext.broadcast(SparkContext.scala:1530)\n\tat org.apache.spark.scheduler.DAGScheduler.submitMissingTasks(DAGScheduler.scala:1535)\n\t... 6 more\nCaused by: java.lang.ClassNotFoundException: org.apache.sedona.core.serde.SedonaKryoRegistrator\n\tat java.net.URLClassLoader.findClass(URLClassLoader.java:387)\n\tat java.lang.ClassLoader.loadClass(ClassLoader.java:418)\n\tat java.lang.ClassLoader.loadClass(ClassLoader.java:351)\n\tat java.lang.Class.forName0(Native Method)\n\tat java.lang.Class.forName(Class.java:348)\n\tat org.apache.spark.util.Utils$.classForName(Utils.scala:227)\n\tat org.apache.spark.serializer.KryoSerializer.$anonfun$newKryo$7(KryoSerializer.scala:180)\n\tat scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:286)\n\tat scala.collection.mutable.ResizableArray.foreach(ResizableArray.scala:62)\n\tat scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:55)\n\tat scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:49)\n\tat scala.collection.TraversableLike.map(TraversableLike.scala:286)\n\tat scala.collection.TraversableLike.map$(TraversableLike.scala:279)\n\tat scala.collection.AbstractTraversable.map(Traversable.scala:108)\n\tat org.apache.spark.serializer.KryoSerializer.$anonfun$newKryo$5(KryoSerializer.scala:180)\n\t... 23 more\n" + ] + } + ], + "source": [ + "config = SedonaContext.builder().config(\"fs.s3a.aws.credentials.provider\", \"org.apache.hadoop.fs.s3a.AnonymousAWSCredentialsProvider\").getOrCreate()\n", + "sedona = SedonaContext.create(config)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df = sedona.read.format(\"parquet\").load(\"s3a://overturemaps-us-west-2/release/2023-07-26-alpha.0/theme=buildings/type=building\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "ename": "OSError", + "evalue": "When getting information for key 'release/2023-07-26-alpha.0/theme=buildings/type=building' in bucket 'overturemaps-us-west-2': AWS Error [code 15]: No response body.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mOSError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtempDF\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_parquet\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"s3://overturemaps-us-west-2/release/2023-07-26-alpha.0/theme=buildings/type=building\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/.conda/envs/ee/lib/python3.9/site-packages/geopandas/io/arrow.py\u001b[0m in \u001b[0;36m_read_parquet\u001b[0;34m(path, columns, **kwargs)\u001b[0m\n\u001b[1;32m 391\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 392\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"use_pandas_metadata\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 393\u001b[0;31m \u001b[0mtable\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mparquet\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_table\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcolumns\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 394\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 395\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0m_arrow_to_geopandas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtable\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/ee/lib/python3.9/site-packages/pyarrow/parquet.py\u001b[0m in \u001b[0;36mread_table\u001b[0;34m(source, columns, use_threads, metadata, use_pandas_metadata, memory_map, read_dictionary, filesystem, filters, buffer_size, partitioning, use_legacy_dataset, ignore_prefixes)\u001b[0m\n\u001b[1;32m 1698\u001b[0m )\n\u001b[1;32m 1699\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1700\u001b[0;31m dataset = _ParquetDatasetV2(\n\u001b[0m\u001b[1;32m 1701\u001b[0m \u001b[0msource\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1702\u001b[0m \u001b[0mfilesystem\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfilesystem\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/ee/lib/python3.9/site-packages/pyarrow/parquet.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, path_or_paths, filesystem, filters, partitioning, read_dictionary, buffer_size, memory_map, ignore_prefixes, **kwargs)\u001b[0m\n\u001b[1;32m 1528\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1529\u001b[0m \u001b[0mfilesystem\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mLocalFileSystem\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muse_mmap\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmemory_map\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1530\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mfilesystem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_file_info\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath_or_paths\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_file\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1531\u001b[0m \u001b[0msingle_file\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpath_or_paths\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1532\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/ee/lib/python3.9/site-packages/pyarrow/_fs.pyx\u001b[0m in \u001b[0;36mpyarrow._fs.FileSystem.get_file_info\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/ee/lib/python3.9/site-packages/pyarrow/error.pxi\u001b[0m in \u001b[0;36mpyarrow.lib.pyarrow_internal_check_status\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/ee/lib/python3.9/site-packages/pyarrow/error.pxi\u001b[0m in \u001b[0;36mpyarrow.lib.check_status\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mOSError\u001b[0m: When getting information for key 'release/2023-07-26-alpha.0/theme=buildings/type=building' in bucket 'overturemaps-us-west-2': AWS Error [code 15]: No response body." + ] + } + ], + "source": [ + "tempDF = gpd.read_parquet(\"s3://overturemaps-us-west-2/release/2023-07-26-alpha.0/theme=buildings/type=building\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Earth Engine", + "language": "python", + "name": "ee" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/ZON_DECAT_B_ZonalStatsNTLHarmonized.ipynb b/notebooks/ZON_DECAT_B_ZonalStatsNTLHarmonized.ipynb new file mode 100644 index 0000000..dc06c1a --- /dev/null +++ b/notebooks/ZON_DECAT_B_ZonalStatsNTLHarmonized.ipynb @@ -0,0 +1,219 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 106, + "metadata": {}, + "outputs": [], + "source": [ + "import sys, os, importlib\n", + "import rasterio\n", + "\n", + "import pandas as pd\n", + "import geopandas as gpd\n", + "\n", + "from rasterio import MemoryFile\n", + "from contextlib import contextmanager\n", + "\n", + "sys.path.append(\"../src\")\n", + "\n", + "import GOSTRocks.rasterMisc as rMisc\n", + "from GOSTRocks.misc import tPrint" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": {}, + "outputs": [], + "source": [ + "in_admin_file = \"/home/public/Data/COUNTRY/ETH/ADMIN/gadm36_2_hoa.shp\"\n", + "inD = gpd.read_file(in_admin_file)\n", + "\n", + "ntl_folder = \"/home/public/Data/GLOBAL/NighttimeLights/LI_HARMONIZED\"\n", + "ntl_files = [os.path.join(ntl_folder, x) for x in os.listdir(ntl_folder)]" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": {}, + "outputs": [], + "source": [ + "@contextmanager\n", + "def create_rasterio_inmemory(src, curData):\n", + " '''Create a rasterio object in memory from a \n", + " \n", + " :param: src - data dictionary describing the rasterio template i.e. - rasterio.open().profile\n", + " :param: curData - numpy array from which to create rasterio object\n", + " '''\n", + " with MemoryFile() as memFile:\n", + " with memFile.open(**src) as dataset:\n", + " dataset.write(curData)\n", + " del curData\n", + " \n", + " with memFile.open() as dataset:\n", + " yield(dataset)" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10:21:08\t2008_calDMSP: 7\n", + "10:21:11\t2008_calDMSP: 20\n", + "10:21:14\t2008_calDMSP: 30\n", + "10:21:18\t2009_calDMSP: 7\n", + "10:21:21\t2009_calDMSP: 20\n", + "10:21:24\t2009_calDMSP: 30\n", + "10:21:27\t2010_calDMSP: 7\n", + "10:21:30\t2010_calDMSP: 20\n", + "10:21:33\t2010_calDMSP: 30\n", + "10:21:37\t2011_calDMSP: 7\n", + "10:21:39\t2011_calDMSP: 20\n", + "10:21:42\t2011_calDMSP: 30\n", + "10:21:46\t2012_calDMSP: 7\n", + "10:21:49\t2012_calDMSP: 20\n", + "10:21:51\t2012_calDMSP: 30\n", + "10:21:54\t2013_calDMSP: 7\n", + "10:21:57\t2013_calDMSP: 20\n", + "10:22:00\t2013_calDMSP: 30\n", + "10:22:03\t2014_simVIIRS: 7\n", + "10:22:05\t2014_simVIIRS: 20\n", + "10:22:08\t2014_simVIIRS: 30\n", + "10:22:11\t2015_simVIIRS: 7\n", + "10:22:14\t2015_simVIIRS: 20\n", + "10:22:16\t2015_simVIIRS: 30\n", + "10:22:20\t2016_simVIIRS: 7\n", + "10:22:22\t2016_simVIIRS: 20\n", + "10:22:25\t2016_simVIIRS: 30\n", + "10:22:28\t2017_simVIIRS: 7\n", + "10:22:30\t2017_simVIIRS: 20\n", + "10:22:33\t2017_simVIIRS: 30\n", + "10:22:36\t2018_simVIIRS: 7\n", + "10:22:39\t2018_simVIIRS: 20\n", + "10:22:41\t2018_simVIIRS: 30\n", + "10:22:45\t1992_calDMSP: 7\n", + "10:22:47\t1992_calDMSP: 20\n", + "10:22:50\t1992_calDMSP: 30\n", + "10:22:53\t1993_calDMSP: 7\n", + "10:22:55\t1993_calDMSP: 20\n", + "10:22:58\t1993_calDMSP: 30\n", + "10:23:01\t1994_calDMSP: 7\n", + "10:23:04\t1994_calDMSP: 20\n", + "10:23:06\t1994_calDMSP: 30\n", + "10:23:09\t1995_calDMSP: 7\n", + "10:23:12\t1995_calDMSP: 20\n", + "10:23:14\t1995_calDMSP: 30\n", + "10:23:18\t1996_calDMSP: 7\n", + "10:23:20\t1996_calDMSP: 20\n", + "10:23:23\t1996_calDMSP: 30\n", + "10:23:27\t1997_calDMSP: 7\n", + "10:23:29\t1997_calDMSP: 20\n", + "10:23:32\t1997_calDMSP: 30\n", + "10:23:35\t1998_calDMSP: 7\n", + "10:23:38\t1998_calDMSP: 20\n", + "10:23:41\t1998_calDMSP: 30\n", + "10:23:44\t1999_calDMSP: 7\n", + "10:23:47\t1999_calDMSP: 20\n", + "10:23:50\t1999_calDMSP: 30\n", + "10:23:53\t2000_calDMSP: 7\n", + "10:23:56\t2000_calDMSP: 20\n", + "10:23:58\t2000_calDMSP: 30\n", + "10:24:01\t2001_calDMSP: 7\n", + "10:24:04\t2001_calDMSP: 20\n", + "10:24:07\t2001_calDMSP: 30\n", + "10:24:10\t2002_calDMSP: 7\n", + "10:24:12\t2002_calDMSP: 20\n", + "10:24:15\t2002_calDMSP: 30\n", + "10:24:18\t2003_calDMSP: 7\n", + "10:24:21\t2003_calDMSP: 20\n", + "10:24:24\t2003_calDMSP: 30\n", + "10:24:28\t2004_calDMSP: 7\n", + "10:24:30\t2004_calDMSP: 20\n", + "10:24:33\t2004_calDMSP: 30\n", + "10:24:37\t2005_calDMSP: 7\n", + "10:24:40\t2005_calDMSP: 20\n", + "10:24:42\t2005_calDMSP: 30\n", + "10:24:46\t2006_calDMSP: 7\n", + "10:24:48\t2006_calDMSP: 20\n", + "10:24:51\t2006_calDMSP: 30\n", + "10:24:54\t2007_calDMSP: 7\n", + "10:24:57\t2007_calDMSP: 20\n", + "10:24:59\t2007_calDMSP: 30\n", + "10:25:03\t2013_simVIIRS: 7\n", + "10:25:05\t2013_simVIIRS: 20\n", + "10:25:08\t2013_simVIIRS: 30\n" + ] + } + ], + "source": [ + "ntl_file = ntl_files[0]\n", + "for ntl_file in ntl_files:\n", + " file_name = \"_\".join(os.path.basename(ntl_file.replace(\".tif\", \"\")).split(\"_\")[-2:])\n", + " inR = rasterio.open(ntl_file)\n", + " rData = inR.read()\n", + " for thresh in [7,20,30]:\n", + " tPrint(f\"{file_name}: {thresh}\")\n", + " curData = (rData > thresh) * rData\n", + " with create_rasterio_inmemory(inR.profile, curData) as curR:\n", + " res = rMisc.zonalStats(inD, curR)\n", + " xx = pd.DataFrame(res, columns=[\"SUM\",\"MIN\",'MAX','MEAN'])\n", + " inD[f\"{file_name}_{thresh}\"] = xx['SUM']\n" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": {}, + "outputs": [], + "source": [ + "inD = inD.reindex(sorted(inD.columns), axis=1)\n", + "finalD = inD.copy()\n", + "for col in finalD.columns:\n", + " try:\n", + " finalD[col] = finalD[col].astype(float)\n", + " except:\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": {}, + "outputs": [], + "source": [ + "finalD.to_file(\"/home/wb411133/Code/gostrocks/data/RAW/gadm2_HoA_SoL.geojson\", driver=\"GeoJSON\")\n", + "pd.DataFrame(finalD.drop(['geometry'], axis=1)).to_csv(\"/home/wb411133/Code/gostrocks/data/RAW/gadm2_HoA_SoL.csv\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python (geog)", + "language": "python", + "name": "geog" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/ZON_DECAT_NTL_from_AWS.ipynb b/notebooks/ZON_DECAT_NTL_from_AWS.ipynb new file mode 100644 index 0000000..f6f74c8 --- /dev/null +++ b/notebooks/ZON_DECAT_NTL_from_AWS.ipynb @@ -0,0 +1,570 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Analyzing VIIRS imagery in AWS\n", + "\n", + "This notebook focuses on two nighttime lights analyses: zonal statistics and timelapse mapping" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/wb411133/.conda/envs/ee/lib/python3.9/site-packages/geopandas/_compat.py:106: UserWarning: The Shapely GEOS version (3.9.1-CAPI-1.14.2) is incompatible with the GEOS version PyGEOS was compiled with (3.10.4-CAPI-1.16.2). Conversions between both will be slow.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "import sys, os, importlib, json\n", + "import rasterio\n", + "import imageio\n", + "\n", + "import pandas as pd\n", + "import geopandas as gpd\n", + "\n", + "from shapely.geometry import shape\n", + "from rasterio import MemoryFile\n", + "from contextlib import contextmanager\n", + "\n", + "sys.path.insert(0, \"/home/wb411133/Code/gostrocks/src\")\n", + "\n", + "import GOSTRocks.rasterMisc as rMisc\n", + "import GOSTRocks.ntlMisc as ntl\n", + "from GOSTRocks.misc import tPrint\n", + "\n", + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Zonal statistics" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['https://globalnightlight.s3.amazonaws.com/composites/npp_201201_rp2/DNB_npp_20120119-20120131_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201202_rp2/DNB_npp_20120201-20120229_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201203_rp2/DNB_npp_20120301-20120331_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201204_rp2/DNB_npp_20120401-20120430_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201205_rp2/DNB_npp_20120501-20120531_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201206_rp2/DNB_npp_20120601-20120630_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201207_rp2/DNB_npp_20120701-20120731_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201208_rp2/DNB_npp_20120801-20120831_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201209_rp2/DNB_npp_20120901-20120930_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201210_rp2/DNB_npp_20121001-20121031_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201211_rp2/DNB_npp_20121101-20121130_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201212_rp2/DNB_npp_20121201-20121231_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201301_rp2/DNB_npp_20130101-20130131_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201302_rp2/DNB_npp_20130201-20130228_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201303_rp2/DNB_npp_20130301-20130331_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201304_rp2/DNB_npp_20130401-20130430_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201305_rp2/DNB_npp_20130501-20130531_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201306_rp2/DNB_npp_20130601-20130630_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201307_rp2/DNB_npp_20130701-20221231_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201308_rp2/DNB_npp_20130801-20130831_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201309_rp2/DNB_npp_20130901-20130930_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201310_rp2/DNB_npp_20131001-20131031_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201311_rp2/DNB_npp_20131101-20131130_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201312_rp2/DNB_npp_20131201-20131231_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201401_rp2/DNB_npp_20140101-20140131_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201402_rp2/DNB_npp_20140201-20140228_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201404_rp2/DNB_npp_20140401-20140430_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201405_rp2/DNB_npp_20140501-20140531_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201406_rp2/DNB_npp_20140601-20140630_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201407_rp2/DNB_npp_20140701-20140731_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201408_rp2/DNB_npp_20140801-20140831_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201409_rp2/DNB_npp_20140901-20140930_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201410_rp2/DNB_npp_20141001-20141031_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201411_rp2/DNB_npp_20141101-20141130_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201412_rp2/DNB_npp_20141201-20141231_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201501_rp2/DNB_npp_20150101-20150131_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201502_rp2/DNB_npp_20150201-20150228_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201503_rp2/DNB_npp_20150301-20150331_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201504_rp2/DNB_npp_20150401-20150430_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201505_rp2/DNB_npp_20150501-20150531_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201506_rp2/DNB_npp_20150601-20150630_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201507_rp2/DNB_npp_20150701-20150731_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201508_rp2/DNB_npp_20150801-20150831_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201509_rp2/DNB_npp_20150901-20150930_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201510_rp2/DNB_npp_20151001-20151031_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201511_rp2/DNB_npp_20151101-20151130_global_vcm-slcorr_v10_rp2.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201512_ops/DNB_npp_20151201-20151231_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201601_ops/DNB_npp_20160101-20160131_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201602_ops/DNB_npp_20160201-20160229_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201603_ops/DNB_npp_20160301-20160331_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201604_ops/DNB_npp_20160401-20160430_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201605_ops/DNB_npp_20160501-20160531_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201606_ops/DNB_npp_20160601-20160630_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201607_ops/DNB_npp_20160701-20160731_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201608_ops/DNB_npp_20160801-20160831_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201609_ops/DNB_npp_20160901-20160930_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201610_ops/DNB_npp_20161001-20161031_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201611_ops/DNB_npp_20161101-20161130_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201612_ops/DNB_npp_20161201-20161231_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201701_ops/DNB_npp_20170101-20170131_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201702_ops/DNB_npp_20170201-20170228_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201703_ops/DNB_npp_20170301-20170331_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201704_ops/DNB_npp_20170401-20170430_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201705_ops/DNB_npp_20170501-20170531_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201706_ops/DNB_npp_20170601-20170630_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201707_ops/DNB_npp_20170701-20170731_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201708_ops/DNB_npp_20170801-20170831_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201709_ops/DNB_npp_20170901-20170930_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201710_ops/DNB_npp_20171001-20171031_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201711_ops/DNB_npp_20171101-20171130_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201712_ops/DNB_npp_20171201-20171231_global_vcm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201801_ops/DNB_npp_20180101-20180131_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201802_ops/DNB_npp_20180201-20180228_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201803_ops/DNB_npp_20180301-20180331_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201804_ops/DNB_npp_20180401-20180430_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201805_ops/DNB_npp_20180501-20180531_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201806_ops/DNB_npp_20180601-20180630_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201807_ops/DNB_npp_20180701-20180731_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201808_ops/DNB_npp_20180801-20180831_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201809_ops/DNB_npp_20180901-20180930_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201810_ops/DNB_npp_20181001-20181031_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201811_ops/DNB_npp_20181101-20181130_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201812_ops/DNB_npp_20181201-20181231_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201901_ops/DNB_npp_20190101-20190131_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201902_ops/DNB_npp_20190201-20190228_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201903_ops/DNB_npp_20190301-20190331_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201904_ops/DNB_npp_20190401-20190430_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201905_ops/DNB_npp_20190501-20190531_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201906_ops/DNB_npp_20190601-20190630_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201907_ops/DNB_npp_20190701-20190731_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201908_ops/DNB_npp_20190801-20190831_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201909_ops/DNB_npp_20190901-20190930_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201910_ops/DNB_npp_20191001-20191031_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201911_ops/DNB_npp_20191101-20191130_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_201912_ops/DNB_npp_20191201-20191231_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202001_ops/DNB_npp_20200101-20200131_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202002_ops/DNB_npp_20200201-20200229_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202003_ops/DNB_npp_20200301-20200331_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202004_ops/DNB_npp_20200401-20200430_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202005_ops/DNB_npp_20200501-20200531_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202006_ops/DNB_npp_20200601-20200630_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202007_ops/DNB_npp_20200701-20200731_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202008_ops/DNB_npp_20200801-20200831_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202009_ops/DNB_npp_20200901-20200930_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202010_ops/DNB_npp_20201001-20201031_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202011_ops/DNB_npp_20201101-20201130_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202012_ops/DNB_npp_20201201-20201231_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202101_ops/DNB_npp_20210101-20210131_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202102_ops/DNB_npp_20210201-20210228_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202103_ops/DNB_npp_20210301-20210331_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202104_ops/DNB_npp_20210401-20210430_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202105_ops/DNB_npp_20210501-20210531_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202106_ops/DNB_npp_20210601-20210630_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202107_ops/DNB_npp_20210701-20210731_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202109_ops/DNB_npp_20210901-20210930_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202110_ops/DNB_npp_20211001-20211031_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202111_ops/DNB_npp_20211101-20211130_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202112_ops/DNB_npp_20211201-20211231_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202201_ops/DNB_npp_20220101-20220131_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202202_ops/DNB_npp_20220201-20220228_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202203_ops/DNB_npp_20220301-20220331_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202204_ops/DNB_npp_20220401-20220430_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202205_ops/DNB_npp_20220501-20220531_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202207_ops/DNB_npp_20220701-20220731_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202211_ops/DNB_npp_20221101-20221130_global_ecm-slcorr_v10_ops.avg_rade9.tif',\n", + " 'https://globalnightlight.s3.amazonaws.com/composites/npp_202212_ops/DNB_npp_20221201-20221231_global_ecm-slcorr_v10_ops.avg_rade9.tif']" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get a list of the VIIRS images in S3. This example leverages the GOST teams S3 bucket\n", + "ntl_files = ntl.aws_search_ntl()\n", + "ntl_files" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "ntl.aws_search_ntl?" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "11:30:35\tDNB_npp_20120119-20120131_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:35\tDNB_npp_20120201-20120229_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:36\tDNB_npp_20120301-20120331_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:38\tDNB_npp_20120401-20120430_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:38\tDNB_npp_20120501-20120531_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:39\tDNB_npp_20120601-20120630_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:40\tDNB_npp_20120701-20120731_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:41\tDNB_npp_20120801-20120831_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:42\tDNB_npp_20120901-20120930_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:43\tDNB_npp_20121001-20121031_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:44\tDNB_npp_20121101-20121130_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:45\tDNB_npp_20121201-20121231_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:46\tDNB_npp_20130101-20130131_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:47\tDNB_npp_20130201-20130228_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:47\tDNB_npp_20130301-20130331_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:48\tDNB_npp_20130401-20130430_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:49\tDNB_npp_20130501-20130531_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:50\tDNB_npp_20130601-20130630_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:51\tDNB_npp_20130701-20221231_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:52\tDNB_npp_20130801-20130831_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:53\tDNB_npp_20130901-20130930_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:53\tDNB_npp_20131001-20131031_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:54\tDNB_npp_20131101-20131130_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:55\tDNB_npp_20131201-20131231_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:56\tDNB_npp_20140101-20140131_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:57\tDNB_npp_20140201-20140228_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:58\tDNB_npp_20140401-20140430_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:30:59\tDNB_npp_20140501-20140531_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:31:00\tDNB_npp_20140601-20140630_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:31:01\tDNB_npp_20140701-20140731_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:31:02\tDNB_npp_20140801-20140831_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:31:03\tDNB_npp_20140901-20140930_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:31:04\tDNB_npp_20141001-20141031_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:31:05\tDNB_npp_20141101-20141130_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:31:07\tDNB_npp_20141201-20141231_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:31:08\tDNB_npp_20150101-20150131_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:31:09\tDNB_npp_20150201-20150228_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:31:10\tDNB_npp_20150301-20150331_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:31:11\tDNB_npp_20150401-20150430_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:31:12\tDNB_npp_20150501-20150531_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:31:13\tDNB_npp_20150601-20150630_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:31:14\tDNB_npp_20150701-20150731_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:31:15\tDNB_npp_20150801-20150831_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:31:16\tDNB_npp_20150901-20150930_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:31:17\tDNB_npp_20151001-20151031_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:31:19\tDNB_npp_20151101-20151130_global_vcm-slcorr_v10_rp2.avg_rade9.tif\n", + "11:31:20\tDNB_npp_20151201-20151231_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:21\tDNB_npp_20160101-20160131_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:22\tDNB_npp_20160201-20160229_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:23\tDNB_npp_20160301-20160331_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:24\tDNB_npp_20160401-20160430_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:25\tDNB_npp_20160501-20160531_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:26\tDNB_npp_20160601-20160630_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:27\tDNB_npp_20160701-20160731_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:29\tDNB_npp_20160801-20160831_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:30\tDNB_npp_20160901-20160930_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:31\tDNB_npp_20161001-20161031_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:32\tDNB_npp_20161101-20161130_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:33\tDNB_npp_20161201-20161231_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:34\tDNB_npp_20170101-20170131_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:35\tDNB_npp_20170201-20170228_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:36\tDNB_npp_20170301-20170331_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:37\tDNB_npp_20170401-20170430_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:38\tDNB_npp_20170501-20170531_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:39\tDNB_npp_20170601-20170630_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:40\tDNB_npp_20170701-20170731_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:41\tDNB_npp_20170801-20170831_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:42\tDNB_npp_20170901-20170930_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:43\tDNB_npp_20171001-20171031_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:44\tDNB_npp_20171101-20171130_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:45\tDNB_npp_20171201-20171231_global_vcm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:46\tDNB_npp_20180101-20180131_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:47\tDNB_npp_20180201-20180228_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:49\tDNB_npp_20180301-20180331_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:50\tDNB_npp_20180401-20180430_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:51\tDNB_npp_20180501-20180531_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:52\tDNB_npp_20180601-20180630_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:53\tDNB_npp_20180701-20180731_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:54\tDNB_npp_20180801-20180831_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:55\tDNB_npp_20180901-20180930_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:56\tDNB_npp_20181001-20181031_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:57\tDNB_npp_20181101-20181130_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:31:59\tDNB_npp_20181201-20181231_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:00\tDNB_npp_20190101-20190131_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:01\tDNB_npp_20190201-20190228_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:02\tDNB_npp_20190301-20190331_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:03\tDNB_npp_20190401-20190430_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:04\tDNB_npp_20190501-20190531_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:05\tDNB_npp_20190601-20190630_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:06\tDNB_npp_20190701-20190731_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:07\tDNB_npp_20190801-20190831_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:08\tDNB_npp_20190901-20190930_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:09\tDNB_npp_20191001-20191031_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:10\tDNB_npp_20191101-20191130_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:11\tDNB_npp_20191201-20191231_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:12\tDNB_npp_20200101-20200131_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:13\tDNB_npp_20200201-20200229_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:14\tDNB_npp_20200301-20200331_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:15\tDNB_npp_20200401-20200430_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:16\tDNB_npp_20200501-20200531_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:17\tDNB_npp_20200601-20200630_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:18\tDNB_npp_20200701-20200731_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:19\tDNB_npp_20200801-20200831_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:20\tDNB_npp_20200901-20200930_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:22\tDNB_npp_20201001-20201031_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:23\tDNB_npp_20201101-20201130_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:24\tDNB_npp_20201201-20201231_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:25\tDNB_npp_20210101-20210131_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:26\tDNB_npp_20210201-20210228_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:27\tDNB_npp_20210301-20210331_global_ecm-slcorr_v10_ops.avg_rade9.tif\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "11:32:28\tDNB_npp_20210401-20210430_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:29\tDNB_npp_20210501-20210531_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:30\tDNB_npp_20210601-20210630_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:31\tDNB_npp_20210701-20210731_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:32\tDNB_npp_20210901-20210930_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:33\tDNB_npp_20211001-20211031_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:34\tDNB_npp_20211101-20211130_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:35\tDNB_npp_20211201-20211231_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:36\tDNB_npp_20220101-20220131_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:37\tDNB_npp_20220201-20220228_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:38\tDNB_npp_20220301-20220331_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:39\tDNB_npp_20220401-20220430_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:40\tDNB_npp_20220501-20220531_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:41\tDNB_npp_20220701-20220731_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:42\tDNB_npp_20221101-20221130_global_ecm-slcorr_v10_ops.avg_rade9.tif\n", + "11:32:43\tDNB_npp_20221201-20221231_global_ecm-slcorr_v10_ops.avg_rade9.tif\n" + ] + }, + { + "ename": "PermissionError", + "evalue": "[Errno 13] Permission denied: '/home/public/Data/GLOBAL/ADMIN/Admin0_Polys_NTL.csv'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mPermissionError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mtPrint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbasename\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcur_tif\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minD\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdrop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'geometry'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"{in_zones[:-4]}_NTL.csv\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/.conda/envs/ee/lib/python3.9/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36mto_csv\u001b[0;34m(self, path_or_buf, sep, na_rep, float_format, columns, header, index, index_label, mode, encoding, compression, quoting, quotechar, line_terminator, chunksize, date_format, doublequote, escapechar, decimal, errors, storage_options)\u001b[0m\n\u001b[1;32m 3385\u001b[0m )\n\u001b[1;32m 3386\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3387\u001b[0;31m return DataFrameRenderer(formatter).to_csv(\n\u001b[0m\u001b[1;32m 3388\u001b[0m \u001b[0mpath_or_buf\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3389\u001b[0m \u001b[0mline_terminator\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mline_terminator\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/ee/lib/python3.9/site-packages/pandas/io/formats/format.py\u001b[0m in \u001b[0;36mto_csv\u001b[0;34m(self, path_or_buf, encoding, sep, columns, index_label, mode, compression, quoting, quotechar, line_terminator, chunksize, date_format, doublequote, escapechar, errors, storage_options)\u001b[0m\n\u001b[1;32m 1081\u001b[0m \u001b[0mformatter\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfmt\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1082\u001b[0m )\n\u001b[0;32m-> 1083\u001b[0;31m \u001b[0mcsv_formatter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msave\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1084\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1085\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcreated_buffer\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/ee/lib/python3.9/site-packages/pandas/io/formats/csvs.py\u001b[0m in \u001b[0;36msave\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 226\u001b[0m \"\"\"\n\u001b[1;32m 227\u001b[0m \u001b[0;31m# apply compression and byte/text conversion\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 228\u001b[0;31m with get_handle(\n\u001b[0m\u001b[1;32m 229\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfilepath_or_buffer\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 230\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/ee/lib/python3.9/site-packages/pandas/io/common.py\u001b[0m in \u001b[0;36mget_handle\u001b[0;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[0m\n\u001b[1;32m 640\u001b[0m \u001b[0merrors\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"replace\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 641\u001b[0m \u001b[0;31m# Encoding\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 642\u001b[0;31m handle = open(\n\u001b[0m\u001b[1;32m 643\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 644\u001b[0m \u001b[0mioargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mPermissionError\u001b[0m: [Errno 13] Permission denied: '/home/public/Data/GLOBAL/ADMIN/Admin0_Polys_NTL.csv'" + ] + } + ], + "source": [ + "# Run zonal statistics against the define admin (in_zones)\n", + "in_zones = \"/home/public/Data/GLOBAL/ADMIN/Admin0_Polys.shp\"\n", + "inD = gpd.read_file(in_zones)\n", + "inD = inD.loc[inD['ISO3'] == \"URY\"]\n", + "inD = inD.to_crs(\"epsg:4326\")\n", + "\n", + "for cur_tif in ntl_files:\n", + " res = rMisc.zonalStats(inD, cur_tif, minVal=0.05, reProj=True)\n", + " res = pd.DataFrame(res,columns=['SUM','MIN','MAX','MEAN'])\n", + " inD[cur_tif.split(\"/\")[5]] = res['SUM']\n", + " tPrint(os.path.basename(cur_tif))\n", + " \n", + "pd.DataFrame(inD.drop(['geometry'], axis=1)).to_csv(f\"{in_zones[:-4]}_NTL.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# If you want to clip out the raster data for the below mapping, run this block\n", + "\n", + "in_zones = \"/home/public/Data/GLOBAL/ADMIN/Admin0_Polys.shp\"\n", + "inD = gpd.read_file(in_zones)\n", + "inD = inD.loc[inD['ISO3'] == \"URY\"]\n", + "inD = inD.to_crs(\"epsg:4326\")\n", + "\n", + "for cur_tif in ntl_files:\n", + " file = f'{cur_tif.split(\"/\")[-1]}.tif'\n", + " out_file = os.path.join(os.path.join(viirs_folder, \"%s\" % file))\n", + " curR = rasterio.open(cur_tif)\n", + " if not os.path.exists(out_file):\n", + " rMisc.clipRaster(curR, inD, out_file)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Clip out DMSP datasets\n", + "dmsp_folder = \"/home/public/Data/GLOBAL/NighttimeLights/DMSP/\"\n", + "for dmsp_file in os.listdir(dmsp_folder):\n", + " curR = rasterio.open(os.path.join(dmsp_folder, dmsp_file))\n", + " out_file = os.path.join(os.path.join(viirs_folder, \"%s\" % file))\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Generate maps automatically" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "from matplotlib.colors import ListedColormap, BoundaryNorm\n", + "import numpy as np\n", + "import xarray as xr\n", + "import rioxarray as rxr\n", + "#import earthpy as et\n", + "#import earthpy.plot as ep\n", + "\n", + "# Prettier plotting with seaborn\n", + "import seaborn as sns\n", + "sns.set(font_scale=1.5, style=\"whitegrid\")\n", + "\n", + "all_files = [os.path.join(viirs_folder, x) for x in os.listdir(viirs_folder)]\n", + "all_files.sort()\n", + "all_files[:5]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def map_viirs(cur_file, out_file=''):\n", + " ''' create map of viirs data\n", + " \n", + " INPUT\n", + " cur_file [string] - path to input geotif\n", + " [optional] out_file [string] - path to create output image\n", + " '''\n", + " # extract the year from the file name\n", + " year = cur_file.split(\"_\")[-1][:4]\n", + " \n", + " # Open the VIIRS data and reclassify \n", + " inR = rasterio.open(cur_file)\n", + " inD = inR.read()\n", + " ### TODO: play with class_bins to change the colour scale\n", + " class_bins = [-10,0.5,1,2,3,5,10,15,20,30,40,50]\n", + " inC = xr.apply_ufunc(np.digitize,inD,class_bins)\n", + "\n", + " # Plot the figure, remove grid and ticks\n", + " fig = plt.figure()\n", + " ax = fig.add_subplot(111)\n", + " ax.grid(False)\n", + " ax.set_xticks([])\n", + " ax.set_yticks([])\n", + " \n", + " ### TODO: add the year to the map, may need to experiment with the location depend on geography\n", + " ax.text(0,5, year, fontsize=40, color='white')\n", + "\n", + " plt.margins(0,0)\n", + " if out_file != '':\n", + " #plt.imsave(out_file, inC[0,:,:], cmap=plt.get_cmap('magma'))\n", + " plt.imshow(inC[0,:,:], cmap=plt.get_cmap('magma'))\n", + " fig.savefig(out_file, dpi=100, bbox_inches='tight', pad_inches=0)\n", + " else:\n", + " # https://matplotlib.org/stable/tutorials/colors/colormaps.html\n", + " plt.imshow(inC[0,:,:], cmap=plt.get_cmap('magma'))\n", + "\n", + "cur_file = all_files[0]\n", + "out_file = os.path.join(out_map_folder, os.path.basename(cur_file))\n", + "\n", + "print(out_file)\n", + "map_viirs(cur_file, '')\n", + "#map_viirs(cur_file, out_file)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for cur_file in all_files:\n", + " out_file = os.path.join(out_map_folder, os.path.basename(cur_file))\n", + " map_viirs(cur_file, out_file)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "kwargs = {'duration':0.3}\n", + "images = []\n", + "all_tifs = [os.path.join(out_map_folder, x) for x in os.listdir(out_map_folder)]\n", + "all_tifs.sort()\n", + "for filename in all_tifs:\n", + " images.append(imageio.imread(filename))\n", + " \n", + "imageio.mimsave(\"%s_timelapse.gif\" % out_map_folder, images, **kwargs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"%s_timelapse.gif\" % out_map_folder" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Earth Engine", + "language": "python", + "name": "ee" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/bibliography.ipynb b/notebooks/bibliography.ipynb deleted file mode 100644 index 17ab1a6..0000000 --- a/notebooks/bibliography.ipynb +++ /dev/null @@ -1,173 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "id": "90700fdc-fcc7-4e54-8c9e-449879d8c66d", - "metadata": { - "tags": [] - }, - "source": [ - "(bibliography)=\n", - "\n", - "# Including Bibliography" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "14e89727", - "metadata": {}, - "source": [ - "Including a bibliography is of utmost importance in any academic or research work. A bibliography serves as a comprehensive list of all the sources consulted and referenced during the creation of a paper, essay, or any scholarly project. It not only adds credibility to the work but also demonstrates the depth of research conducted by the author. By providing a bibliography, the author acknowledges the contributions of other scholars and researchers, thereby showing respect for intellectual property and avoiding plagiarism. \n", - "\n", - "Furthermore, a bibliography allows readers to delve deeper into the subject matter, explore related sources, and verify the accuracy and reliability of the information presented. In essence, the inclusion of a well-constructed bibliography is an essential aspect of scholarly writing that promotes transparency, authenticity, and the advancement of knowledge." - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "b4c0f3e8-7756-41bb-aa21-cc2eee5ff67f", - "metadata": {}, - "source": [ - "## Usage\n", - "\n", - "```{seealso}\n", - "[Jupyter Book: Citations and bibliographies](https://jupyterbook.org/en/stable/content/citations.html)\n", - "```\n", - "\n", - "The template includes [`docs/bibliography.bib`](docs/bibliography.bib) as example, containing an entry to the World Bank flagship publication [World Development Report 2021](https://www.worldbank.org/en/publication/wdr2021) in [BibTeX Format](http://www.bibtex.org/Format). \n", - "\n", - "To include a **citation**, we use the syntax as shown below.\n", - " \n", - "````md\n", - "{cite}`WorldBank2021WorldDevelopmentReport`\n", - "````\n", - "\n", - "Additionally, we can use different citation styles.\n", - "\n", - "- **{cite:t}**: {cite:t}`WorldBank2021WorldDevelopmentReport`\n", - "\n", - "- **{cite:p}**: {cite:p}`WorldBank2021WorldDevelopmentReport`\n", - "\n", - "\n", - "```{seealso}\n", - "For a more complete list of in-line citation styles, check out the [sphinxcontrib-bibtex](https://sphinxcontrib-bibtex.readthedocs.io/en/latest/usage.html#roles-and-directives).\n", - "```\n", - "\n", - "To include the **bibliography**, we use the syntax as shown below. Note that this will include all citations throughout the book. \n", - "\n", - "````md\n", - "```{bibliography}\n", - "```\n", - "````\n", - "\n", - "```{bibliography}\n", - "```\n", - "\n", - "To include only the **local bibliography**, we use the syntax as shown below. \n", - "\n", - "````md\n", - "```{bibliography}\n", - ":filter: docname in docnames\n", - "```\n", - "````\n", - "\n", - "```{bibliography}\n", - ":filter: docname in docnames\n", - "```\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "d0066241", - "metadata": {}, - "source": [ - "## Bibliography Styles\n", - "\n", - "\n", - "### `alpha`\n", - "\n", - "````md\n", - "```{bibliography}\n", - ":style: alpha\n", - "```\n", - "````\n", - "\n", - "```{bibliography}\n", - ":style: alpha\n", - "```\n", - "\n", - "### `plain`\n", - "\n", - "````md\n", - "```{bibliography}\n", - ":style: plain\n", - "```\n", - "````\n", - "\n", - "```{bibliography}\n", - ":style: plain\n", - "```\n", - "\n", - "### `unsrt`\n", - "\n", - "````md\n", - "```{bibliography}\n", - ":style: unsrt\n", - "```\n", - "````\n", - "\n", - "```{bibliography}\n", - ":style: unsrt\n", - "```\n", - "\n", - "### `unsrtalpha`\n", - "\n", - "````md\n", - "```{bibliography}\n", - ":style: unsrtalpha\n", - "```\n", - "````\n", - "\n", - "```{bibliography}\n", - ":style: unsrtalpha\n", - "```\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "b0e84fdb", - "metadata": {}, - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.12" - }, - "vscode": { - "interpreter": { - "hash": "b6702b69e93007336b96338c5a331192f07cedff01d36d4dcfa0f842adb718ad" - } - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/notebooks/environment.yml b/notebooks/environment.yml deleted file mode 100644 index 500c72c..0000000 --- a/notebooks/environment.yml +++ /dev/null @@ -1,10 +0,0 @@ -channels: - - conda-forge - - defaults -dependencies: - - python=3.10 - - bokeh - - pandas - - pip - - pip: - - requests==2.28.1 diff --git a/notebooks/metadata/META_DECAT_ExploringMetadataGeneration.ipynb b/notebooks/metadata/META_DECAT_ExploringMetadataGeneration.ipynb new file mode 100644 index 0000000..be10882 --- /dev/null +++ b/notebooks/metadata/META_DECAT_ExploringMetadataGeneration.ipynb @@ -0,0 +1,491 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [], + "source": [ + "import sys, os, importlib\n", + "import rasterio\n", + "\n", + "import geopandas as gpd\n", + "import pandas as pd\n", + "\n", + "sys.path.insert(0, \"../../src\")\n", + "\n", + "import GOSTRocks.metadataMisc as meta" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Could not import arcgis libraries\n" + ] + } + ], + "source": [ + "importlib.reload(meta)\n", + "in_folder = \"/home/wb411133/data/Projects/MR_Novel_Urbanization/Data/LSO_URBAN_DATA_new_naming\"\n", + "\n", + "make_meta = meta.metadata_gost(in_folder, os.path.join(in_folder, \"METADATA\"))\n", + "layers = make_meta.get_layers()\n", + "metadata = make_meta.generate_metadata()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
layer_namedata_typecrs_namecrs_codenum_dimensionsmin_lonmax_lonmin_latmax_latvector_shape_typevector_object_countfolderraster_widthraster_heightraster_reslayer_labeldescriptionsource_namesource_urldata_process_summary
6lso1k_gpoRasterWorld_MollweideNaN12.483000e+062.713000e+06-3.723000e+06-3.475000e+06NaNNaN248.0230.01000.000000
9lso_admRasterWorld_MollweideNaN12.483000e+062.713000e+06-3.722750e+06-3.475750e+06NaNNaN988.0920.0250.000000
13lso_cpo15RasterWGS 844326.012.702958e+012.946542e+01-3.066875e+01-2.857208e+01NaNNaN2516.02923.00.000833
14lso_cpo20RasterWGS 844326.012.702958e+012.946542e+01-3.066875e+01-2.857208e+01NaNNaN2516.02923.00.000833
15lso_desRasterWGS 844326.012.702222e+012.947222e+01-3.067500e+01-2.856667e+01NaNNaN759.0882.00.002778
...............................................................
34urban1k_popRasterWorld_MollweideNaN12.483000e+062.713000e+06-3.723000e+06-3.475000e+06NaNNaN/FINAL_STANDARD_1KM248.0230.01000.000000
52urban_popRasterWorld_MollweideNaN12.483000e+062.713000e+06-3.723000e+06-3.475000e+06NaNNaN/FINAL_STANDARD_1KM248.0230.01000.000000
0lso1k_admVectorWGS 844326.0132.702458e+012.947025e+01-3.067282e+01-2.856812e+01Polygon1.0NaNNaNNaNNaN
2lso_admVectorWGS 844326.0132.702458e+012.947025e+01-3.067282e+01-2.856812e+01Polygon1.0NaNNaNNaNNaN
1lso_admVectorWGS 844326.0132.702458e+012.947025e+01-3.067282e+01-2.856812e+01Polygon1.0NaNNaNNaNNaN
\n", + "

88 rows ร— 20 columns

\n", + "
" + ], + "text/plain": [ + " layer_name data_type crs_name crs_code num_dimensions \\\n", + "6 lso1k_gpo Raster World_Mollweide NaN 1 \n", + "9 lso_adm Raster World_Mollweide NaN 1 \n", + "13 lso_cpo15 Raster WGS 84 4326.0 1 \n", + "14 lso_cpo20 Raster WGS 84 4326.0 1 \n", + "15 lso_des Raster WGS 84 4326.0 1 \n", + ".. ... ... ... ... ... \n", + "34 urban1k_pop Raster World_Mollweide NaN 1 \n", + "52 urban_pop Raster World_Mollweide NaN 1 \n", + "0 lso1k_adm Vector WGS 84 4326.0 13 \n", + "2 lso_adm Vector WGS 84 4326.0 13 \n", + "1 lso_adm Vector WGS 84 4326.0 13 \n", + "\n", + " min_lon max_lon min_lat max_lat vector_shape_type \\\n", + "6 2.483000e+06 2.713000e+06 -3.723000e+06 -3.475000e+06 NaN \n", + "9 2.483000e+06 2.713000e+06 -3.722750e+06 -3.475750e+06 NaN \n", + "13 2.702958e+01 2.946542e+01 -3.066875e+01 -2.857208e+01 NaN \n", + "14 2.702958e+01 2.946542e+01 -3.066875e+01 -2.857208e+01 NaN \n", + "15 2.702222e+01 2.947222e+01 -3.067500e+01 -2.856667e+01 NaN \n", + ".. ... ... ... ... ... \n", + "34 2.483000e+06 2.713000e+06 -3.723000e+06 -3.475000e+06 NaN \n", + "52 2.483000e+06 2.713000e+06 -3.723000e+06 -3.475000e+06 NaN \n", + "0 2.702458e+01 2.947025e+01 -3.067282e+01 -2.856812e+01 Polygon \n", + "2 2.702458e+01 2.947025e+01 -3.067282e+01 -2.856812e+01 Polygon \n", + "1 2.702458e+01 2.947025e+01 -3.067282e+01 -2.856812e+01 Polygon \n", + "\n", + " vector_object_count folder raster_width raster_height \\\n", + "6 NaN 248.0 230.0 \n", + "9 NaN 988.0 920.0 \n", + "13 NaN 2516.0 2923.0 \n", + "14 NaN 2516.0 2923.0 \n", + "15 NaN 759.0 882.0 \n", + ".. ... ... ... ... \n", + "34 NaN /FINAL_STANDARD_1KM 248.0 230.0 \n", + "52 NaN /FINAL_STANDARD_1KM 248.0 230.0 \n", + "0 1.0 NaN NaN NaN \n", + "2 1.0 NaN NaN NaN \n", + "1 1.0 NaN NaN NaN \n", + "\n", + " raster_res layer_label description source_name source_url \\\n", + "6 1000.000000 \n", + "9 250.000000 \n", + "13 0.000833 \n", + "14 0.000833 \n", + "15 0.002778 \n", + ".. ... ... ... ... ... \n", + "34 1000.000000 \n", + "52 1000.000000 \n", + "0 NaN \n", + "2 NaN \n", + "1 NaN \n", + "\n", + " data_process_summary \n", + "6 \n", + "9 \n", + "13 \n", + "14 \n", + "15 \n", + ".. ... \n", + "34 \n", + "52 \n", + "0 \n", + "2 \n", + "1 \n", + "\n", + "[88 rows x 20 columns]" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Make changes to the metadata table here, if you want; changes can be made to resulting xls file later\n", + "metadata['metadata'].sort_values(['folder','layer_name'])" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "make_meta.write_metadata?" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "ename": "ValueError", + "evalue": "The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmake_meta\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrite_metadata\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0min_folder\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"METADATA\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'metadata.xlsx'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlayer_metadata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmetadata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'metadata'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/Code/gostrocks/src/GOSTRocks/metadataMisc.py\u001b[0m in \u001b[0;36mwrite_metadata\u001b[0;34m(self, out_file, layer_metadata, field_metadata, dataset_id, dataset_title, country, abstract, purpose, creation_date, release_date, owner, email)\u001b[0m\n\u001b[1;32m 85\u001b[0m \u001b[0mbase_pd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto_excel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mwriter\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'dataset info'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'utf8'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 86\u001b[0m \u001b[0mlayer_metadata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto_excel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mwriter\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'layer_summaries'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'utf8'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 87\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mfield_metadata\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 88\u001b[0m \u001b[0mfield_metadata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto_excel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mwriter\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'field_summaries'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'utf8'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 89\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/ee/lib/python3.9/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36m__nonzero__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1440\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mfinal\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1441\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__nonzero__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1442\u001b[0;31m raise ValueError(\n\u001b[0m\u001b[1;32m 1443\u001b[0m \u001b[0;34mf\"The truth value of a {type(self).__name__} is ambiguous. \"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1444\u001b[0m \u001b[0;34m\"Use a.empty, a.bool(), a.item(), a.any() or a.all().\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mValueError\u001b[0m: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()." + ] + } + ], + "source": [ + "make_meta.write_metadata(os.path.join(in_folder, \"METADATA\", 'metadata.xlsx'), layer_metadata = metadata['metadata'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Debugging" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Earth Engine", + "language": "python", + "name": "ee" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/nasa-apod.ipynb b/notebooks/nasa-apod.ipynb deleted file mode 100644 index 18553cb..0000000 --- a/notebooks/nasa-apod.ipynb +++ /dev/null @@ -1,282 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "90700fdc-fcc7-4e54-8c9e-449879d8c66d", - "metadata": { - "tags": [] - }, - "source": [ - "# Securely Using API Keys\n", - "\n", - "> The following are (opinionated) best practices to store and use API keys in your source code. If you disagree, please consider [contributing](https://github.com/worldbank/template/issues/new/choose). " - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "ac0ed1c0", - "metadata": {}, - "source": [ - "## Environment Variables\n", - "\n", - "An [environment variable](https://en.wikipedia.org/wiki/Environment_variable) is a dynamic-named value that can be used to store information on a computer. For instance, an environment variable can be used to store settings and/or privileged information (e.g. API keys) on your local computer or server.\n", - "\n", - "To set a environment variable to a new value, in **Unix-like** systems, you must pass a `name` and a `value` pair as shown below in the terminal.\n", - "\n", - "```shell\n", - "export SECRET_API_KEY = \n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "080bd097-f128-4759-946d-793368230804", - "metadata": { - "tags": [] - }, - "source": [ - "The `value` is accessible by the `name` without being exposed throughout the system. In particular, in [Python](https://python.org), the value can be retrieve as follows." - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "8d023b4e-496b-440c-91a7-199bceb44d7d", - "metadata": { - "tags": [] - }, - "source": [ - "```python\n", - "secret_api_key = os.getenv(\"SECRET_API_KEY\")\n", - "```" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "54a99582-d509-4ab8-be42-ddb4921c0f45", - "metadata": { - "tags": [] - }, - "source": [ - "Alternatively, it is customary to use a `.env` file to organize and load environments variables as needed. Packages such as [dotenv](https://www.npmjs.com/package/dotenv) and [python-dotenv](https://pypi.org/project/python-dotenv/) will automatically load environments variables for you from the `.env` file.\n", - "\n", - "```shell\n", - "source .env\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "3c0cc26a-2a99-49b0-a406-d57f31fff8ee", - "metadata": {}, - "source": [ - "With [Python](https://python.org)," - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "960398ce-eadb-45e3-b160-53e6c9250dd0", - "metadata": { - "tags": [ - "remove_output" - ] - }, - "outputs": [], - "source": [ - "from dotenv import load_dotenv\n", - "\n", - "load_dotenv()" - ] - }, - { - "cell_type": "markdown", - "id": "bda573d0-c877-42e6-8ee5-3000b780b4b7", - "metadata": { - "tags": [] - }, - "source": [ - "With [Jupyter](https://jupyter.org)," - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "2e700464-b50d-4b06-b0aa-afaafa17e68e", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "%load_ext dotenv\n", - "%dotenv" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "660db869", - "metadata": {}, - "source": [ - "The template includes `.env.example` as an example; to use, simply rename it to `.env` and add your settings and secrets to it. Please note that `.env` **must** never be committed/versioned (for example, to GitHub) and **should** be ignored on `.gitignore`. " - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "74484f7e", - "metadata": {}, - "source": [ - "```{tip}\n", - "While environments variables are a convenient way to minimize the security risk, it is important to emphasize secrets are still stored in plaintext in your computer. It is strongly recommended to use instead a secret manager, such as [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/) or [1Password](https://developer.1password.com/docs/cli/secret-references).\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "14e89727", - "metadata": {}, - "source": [ - "## Astronomy Picture of the Day" - ] - }, - { - "cell_type": "markdown", - "id": "b4c0f3e8-7756-41bb-aa21-cc2eee5ff67f", - "metadata": {}, - "source": [ - "One of the most popular APIs is NASA's [Astronomy Picture of the Day](https://apod.nasa.gov/apod/astropix.html). Let's see in the following example how to use the NASA API with a secret API key." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "d797ef77-6ca4-4f9d-a1f8-abbfd9884b07", - "metadata": { - "tags": [ - "hide-cell" - ] - }, - "outputs": [], - "source": [ - "import os\n", - "\n", - "import httpx\n", - "from IPython.display import Image" - ] - }, - { - "cell_type": "markdown", - "id": "ece37244", - "metadata": {}, - "source": [ - "First, you will have to [generate your API key](https://api.nasa.gov) and set up the environment variable `NASA_API_KEY` with its value. Now you are ready to use it in your code. For instance, in this example, we assign it to `api_key`. Please note that the value is never exposed and the notebook can be securely shared with anyone. " - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "7b914e66-7ae8-4d8b-9621-d6dc5ec49631", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "api_key = os.getenv(\"NASA_API_KEY\")" - ] - }, - { - "cell_type": "markdown", - "id": "10b5b12a", - "metadata": {}, - "source": [ - "Now, we are ready to make the request to the NASA API. According to the [documentation](https://github.com/nasa/apod-api#docs), the `api_key` is passed a parameter to the GET request. " - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "1990c3b9-f145-4c1f-bbb5-82f50801a011", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "async with httpx.AsyncClient() as client:\n", - " r = await client.get(\n", - " \"https://api.nasa.gov/planetary/apod\", params={\"api_key\": api_key}\n", - " )" - ] - }, - { - "cell_type": "markdown", - "id": "e952e343", - "metadata": {}, - "source": [ - "Voilร !" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "bd1cb597-0144-43e8-bed8-12145a831a0c", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Image(url=r.json()[\"hdurl\"])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8c7cb67e-c7ba-4ed3-bee0-36d303c1517d", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" - }, - "vscode": { - "interpreter": { - "hash": "ce6d896885f4e28373aa2ff7c44f136ed5a497e2abd203a79a632f5859ed7bb5" - } - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/notebooks/world-bank-api.ipynb b/notebooks/world-bank-api.ipynb deleted file mode 100644 index 7e4bbf0..0000000 --- a/notebooks/world-bank-api.ipynb +++ /dev/null @@ -1,721 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "90700fdc-fcc7-4e54-8c9e-449879d8c66d", - "metadata": { - "tags": [] - }, - "source": [ - "# World Bank Indicators API Example\n", - "\n", - "> The following is an example of a [Jupyter notebook](https://jupyter.org) - a tutorial of how to retrieve data from the [World Bank Indicators API](https://datahelpdesk.worldbank.org/knowledgebase/articles/889392-about-the-indicators-api-documentation) - that illustrates how to use computational content with the [template](https://worldbank.github.io/template). " - ] - }, - { - "cell_type": "markdown", - "id": "e0d992a6-f656-45ce-a025-f824901e8797", - "metadata": {}, - "source": [ - "## Requirements" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "1811080b-c4c6-43cb-9e46-5cfa65d54abf", - "metadata": {}, - "outputs": [], - "source": [ - "import itertools\n", - "\n", - "import pandas\n", - "import requests\n", - "from bokeh.palettes import Spectral6\n", - "from bokeh.plotting import figure, output_notebook, show" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "fb8d2738-535e-4957-b82a-987891955a7f", - "metadata": {}, - "source": [ - "## Data Retrieval\n", - "\n", - "In this example, we retrieve **Population, total** (`SP.POP.TOTL`) from the [World Bank Indicators](https://data.worldbank.org/indicator) for [BRICS](https://infobrics.org)." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "c955864a-1889-4f7f-a29e-108b0534846b", - "metadata": {}, - "outputs": [], - "source": [ - "url = \"https://api.worldbank.org/v2/country/chn;bra;ind;rus;zaf/indicator/SP.POP.TOTL?format=json&per_page=10000\"" - ] - }, - { - "cell_type": "markdown", - "id": "6b5aac7c-bf80-4daa-a4a4-eebe8edc97bb", - "metadata": {}, - "source": [ - "Let's use [requests](https://requests.readthedocs.io) to send a GET request," - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "8d699f28-853a-40a1-8ea9-8dd566962454", - "metadata": {}, - "outputs": [], - "source": [ - "r = requests.get(url)" - ] - }, - { - "cell_type": "markdown", - "id": "a21cf193-ec13-45b8-9726-bb960ac8586a", - "metadata": {}, - "source": [ - "Now, let's normalize and create `pandas.DataFrame` from the response," - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "3dc152b2-95ba-473a-a416-2c4d5bac7622", - "metadata": {}, - "outputs": [], - "source": [ - "# normalize\n", - "data = pandas.json_normalize(r.json()[-1])\n", - "\n", - "# create dataframe\n", - "df = pandas.DataFrame.from_dict(data)" - ] - }, - { - "cell_type": "markdown", - "id": "241904c0-35b9-4e43-a3f9-f97738ea9fd1", - "metadata": {}, - "source": [ - "```{tip}\n", - "Alternatively, the World Bank API supports downloading the data as an [archive](http://api.worldbank.org/v2/country/all/indicator/SP.POP.TOTL?date=2000&source=2&downloadformat=csv). \n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "bae3462b-f49c-4b8a-badb-8f580b4fc268", - "metadata": {}, - "source": [ - "Let's take a look at the dataframe, " - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "c0bbef2d-495c-4140-b8ac-45ee47772142", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
countryiso3codeBRACHNINDRUSZAF
date
196073.092515667.070445.954579119.89700016.520441
196175.330008660.330456.351876121.23600016.989464
196277.599218665.770467.024193122.59100017.503133
196379.915555682.335477.933619123.96000018.042215
196482.262794698.355489.059309125.34500018.603097
..................
2018210.1665921402.7601369.003306144.47785957.339635
2019211.7828781407.7451383.112050144.40626158.087055
2020213.1963041411.1001396.387127144.07313958.801927
2021214.3262231412.3601407.563842144.13048259.392255
2022215.3134981412.1751417.173173144.23693359.893885
\n", - "

63 rows ร— 5 columns

\n", - "
" - ], - "text/plain": [ - "countryiso3code BRA CHN IND RUS ZAF\n", - "date \n", - "1960 73.092515 667.070 445.954579 119.897000 16.520441\n", - "1961 75.330008 660.330 456.351876 121.236000 16.989464\n", - "1962 77.599218 665.770 467.024193 122.591000 17.503133\n", - "1963 79.915555 682.335 477.933619 123.960000 18.042215\n", - "1964 82.262794 698.355 489.059309 125.345000 18.603097\n", - "... ... ... ... ... ...\n", - "2018 210.166592 1402.760 1369.003306 144.477859 57.339635\n", - "2019 211.782878 1407.745 1383.112050 144.406261 58.087055\n", - "2020 213.196304 1411.100 1396.387127 144.073139 58.801927\n", - "2021 214.326223 1412.360 1407.563842 144.130482 59.392255\n", - "2022 215.313498 1412.175 1417.173173 144.236933 59.893885\n", - "\n", - "[63 rows x 5 columns]" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = df.pivot_table(values=\"value\", index=\"date\", columns=\"countryiso3code\")\n", - "df = df / 1e6 # scaling\n", - "df" - ] - }, - { - "cell_type": "markdown", - "id": "27f26a03-6d7a-4c86-8a02-1ea341d7ac5b", - "metadata": {}, - "source": [ - "## Visualization" - ] - }, - { - "cell_type": "markdown", - "id": "38e8582b-2a51-4908-8356-76cb6158fdc3", - "metadata": {}, - "source": [ - "Let's now plot the data as a time series using [Bokeh](https://docs.bokeh.org)." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "78041d94-56a6-43ff-a307-8e8a3b377858", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/html": [ - " \n", - "
\n", - " \n", - " Loading BokehJS ...\n", - "
\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/javascript": [ - "(function(root) {\n", - " function now() {\n", - " return new Date();\n", - " }\n", - "\n", - " const force = true;\n", - "\n", - " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n", - " root._bokeh_onload_callbacks = [];\n", - " root._bokeh_is_loading = undefined;\n", - " }\n", - "\n", - "const JS_MIME_TYPE = 'application/javascript';\n", - " const HTML_MIME_TYPE = 'text/html';\n", - " const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", - " const CLASS_NAME = 'output_bokeh rendered_html';\n", - "\n", - " /**\n", - " * Render data to the DOM node\n", - " */\n", - " function render(props, node) {\n", - " const script = document.createElement(\"script\");\n", - " node.appendChild(script);\n", - " }\n", - "\n", - " /**\n", - " * Handle when an output is cleared or removed\n", - " */\n", - " function handleClearOutput(event, handle) {\n", - " function drop(id) {\n", - " const view = Bokeh.index.get_by_id(id)\n", - " if (view != null) {\n", - " view.model.document.clear()\n", - " Bokeh.index.delete(view)\n", - " }\n", - " }\n", - "\n", - " const cell = handle.cell;\n", - "\n", - " const id = cell.output_area._bokeh_element_id;\n", - " const server_id = cell.output_area._bokeh_server_id;\n", - "\n", - " // Clean up Bokeh references\n", - " if (id != null) {\n", - " drop(id)\n", - " }\n", - "\n", - " if (server_id !== undefined) {\n", - " // Clean up Bokeh references\n", - " const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", - " cell.notebook.kernel.execute(cmd_clean, {\n", - " iopub: {\n", - " output: function(msg) {\n", - " const id = msg.content.text.trim()\n", - " drop(id)\n", - " }\n", - " }\n", - " });\n", - " // Destroy server and session\n", - " const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", - " cell.notebook.kernel.execute(cmd_destroy);\n", - " }\n", - " }\n", - "\n", - " /**\n", - " * Handle when a new output is added\n", - " */\n", - " function handleAddOutput(event, handle) {\n", - " const output_area = handle.output_area;\n", - " const output = handle.output;\n", - "\n", - " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", - " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n", - " return\n", - " }\n", - "\n", - " const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", - "\n", - " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", - " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", - " // store reference to embed id on output_area\n", - " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", - " }\n", - " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", - " const bk_div = document.createElement(\"div\");\n", - " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", - " const script_attrs = bk_div.children[0].attributes;\n", - " for (let i = 0; i < script_attrs.length; i++) {\n", - " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", - " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\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", - " function register_renderer(events, OutputArea) {\n", - "\n", - " function append_mime(data, metadata, element) {\n", - " // create a DOM node to render to\n", - " const 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", - " const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", - " render(props, toinsert[toinsert.length - 1]);\n", - " element.append(toinsert);\n", - " return toinsert\n", - " }\n", - "\n", - " /* Handle when an output is cleared or removed */\n", - " events.on('clear_output.CodeCell', handleClearOutput);\n", - " events.on('delete.Cell', handleClearOutput);\n", - "\n", - " /* Handle when a new output is added */\n", - " events.on('output_added.OutputArea', handleAddOutput);\n", - "\n", - " /**\n", - " * Register the mime type and append_mime function with output_area\n", - " */\n", - " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", - " /* Is output safe? */\n", - " safe: true,\n", - " /* Index of renderer in `output_area.display_order` */\n", - " index: 0\n", - " });\n", - " }\n", - "\n", - " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", - " if (root.Jupyter !== undefined) {\n", - " const events = require('base/js/events');\n", - " const OutputArea = require('notebook/js/outputarea').OutputArea;\n", - "\n", - " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", - " register_renderer(events, OutputArea);\n", - " }\n", - " }\n", - " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", - " root._bokeh_timeout = Date.now() + 5000;\n", - " root._bokeh_failed_load = false;\n", - " }\n", - "\n", - " const NB_LOAD_WARNING = {'data': {'text/html':\n", - " \"
\\n\"+\n", - " \"

\\n\"+\n", - " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", - " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", - " \"

\\n\"+\n", - " \"
    \\n\"+\n", - " \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n", - " \"
  • use INLINE resources instead, as so:
  • \\n\"+\n", - " \"
\\n\"+\n", - " \"\\n\"+\n", - " \"from bokeh.resources import INLINE\\n\"+\n", - " \"output_notebook(resources=INLINE)\\n\"+\n", - " \"\\n\"+\n", - " \"
\"}};\n", - "\n", - " function display_loaded() {\n", - " const el = document.getElementById(\"b627ae3b-1db0-4fe3-8762-32a285a44007\");\n", - " if (el != null) {\n", - " el.textContent = \"BokehJS is loading...\";\n", - " }\n", - " if (root.Bokeh !== undefined) {\n", - " if (el != null) {\n", - " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n", - " }\n", - " } else if (Date.now() < root._bokeh_timeout) {\n", - " setTimeout(display_loaded, 100)\n", - " }\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, callback) {\n", - " if (css_urls == null) css_urls = [];\n", - " if (js_urls == null) js_urls = [];\n", - "\n", - " root._bokeh_onload_callbacks.push(callback);\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 == null || js_urls.length === 0) {\n", - " run_callbacks();\n", - " return null;\n", - " }\n", - " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", - " root._bokeh_is_loading = css_urls.length + js_urls.length;\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", - "\n", - " function on_error(url) {\n", - " console.error(\"failed to load \" + url);\n", - " }\n", - "\n", - " for (let i = 0; i < css_urls.length; i++) {\n", - " const url = css_urls[i];\n", - " const element = document.createElement(\"link\");\n", - " element.onload = on_load;\n", - " element.onerror = on_error.bind(null, url);\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", - " }\n", - "\n", - " for (let i = 0; i < js_urls.length; i++) {\n", - " const url = js_urls[i];\n", - " const element = document.createElement('script');\n", - " element.onload = on_load;\n", - " element.onerror = on_error.bind(null, url);\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", - " };\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", - " const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.3.4.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.4.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.4.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.4.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.3.4.min.js\"];\n", - " const css_urls = [];\n", - "\n", - " const inline_js = [ function(Bokeh) {\n", - " Bokeh.set_log_level(\"info\");\n", - " },\n", - "function(Bokeh) {\n", - " }\n", - " ];\n", - "\n", - " function run_inline_js() {\n", - " if (root.Bokeh !== undefined || force === true) {\n", - " for (let i = 0; i < inline_js.length; i++) {\n", - " inline_js[i].call(root, root.Bokeh);\n", - " }\n", - "if (force === true) {\n", - " display_loaded();\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", - " } else if (force !== true) {\n", - " const cell = $(document.getElementById(\"b627ae3b-1db0-4fe3-8762-32a285a44007\")).parents('.cell').data().cell;\n", - " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", - " }\n", - " }\n", - "\n", - " if (root._bokeh_is_loading === 0) {\n", - " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", - " run_inline_js();\n", - " } else {\n", - " load_libs(css_urls, js_urls, function() {\n", - " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", - " run_inline_js();\n", - " });\n", - " }\n", - "}(window));" - ], - "application/vnd.bokehjs_load.v0+json": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n const el = document.getElementById(\"b627ae3b-1db0-4fe3-8762-32a285a44007\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\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, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\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 == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\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\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\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 }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\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 };\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 const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.3.4.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.4.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.4.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.4.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.3.4.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\nif (force === true) {\n display_loaded();\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 } else if (force !== true) {\n const cell = $(document.getElementById(\"b627ae3b-1db0-4fe3-8762-32a285a44007\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "\n", - "
\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/javascript": [ - "(function(root) {\n", - " function embed_document(root) {\n", - " const docs_json = {\"6c86f57c-0f70-4648-a27e-ed2b73c3308b\":{\"version\":\"3.3.4\",\"title\":\"Bokeh Application\",\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1001\",\"attributes\":{\"width\":700,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1002\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1003\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1011\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1012\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1004\",\"attributes\":{\"text\":\"Population, total (World Bank)\",\"text_font_size\":\"12pt\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1040\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1034\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1035\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1036\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":[\"1960\",\"1961\",\"1962\",\"1963\",\"1964\",\"1965\",\"1966\",\"1967\",\"1968\",\"1969\",\"1970\",\"1971\",\"1972\",\"1973\",\"1974\",\"1975\",\"1976\",\"1977\",\"1978\",\"1979\",\"1980\",\"1981\",\"1982\",\"1983\",\"1984\",\"1985\",\"1986\",\"1987\",\"1988\",\"1989\",\"1990\",\"1991\",\"1992\",\"1993\",\"1994\",\"1995\",\"1996\",\"1997\",\"1998\",\"1999\",\"2000\",\"2001\",\"2002\",\"2003\",\"2004\",\"2005\",\"2006\",\"2007\",\"2008\",\"2009\",\"2010\",\"2011\",\"2012\",\"2013\",\"2014\",\"2015\",\"2016\",\"2017\",\"2018\",\"2019\",\"2020\",\"2021\",\"2022\"],\"shape\":[63],\"dtype\":\"object\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"7dgIxOtFUkDH2t/ZHtVSQCtLdJZZZlNAHaz/c5j6U0Bx5eyd0ZBUQJl+iXjrJ1VA16Gakqy+VUAdzCbAsFRWQDSBIhYx6lZAjKIHPgaAV0DpJjEIrBdYQE7U0twKsVhAeSKI83BMWUCVZB2OrupZQAiRDDm2ilpA4NbdPNUsW0AVi98UVtJbQPj9mxcnfFxARYMUPIUqXUDGGcOcoNxdQDtu+N10kl5AAvG6fsFKX0BDBBxCFQJgQO5Cc51GX2BAFNBE2HC8YEAz3IDPDxlhQPuWOV2WdGFAq+l6ouvOYUAlIvyLIChiQEuuYvEbgGJAe0ykNJvWYkDj/E0oxCpjQAvSjEXTfGNA+FPjpRvOY0CZ1NAGYB9kQNJWJZF9cGRAyv55GjDBZEDRr62ffhFlQADICRNGYWVAUfUrnY+vZUCOO6WD9ftlQJq0qbrHRmZAza/mAEGPZkD0wp0LI9RmQMnp6/kaF2dApb+XwoNZZ0BPzeUGQ5pnQJz4akfx2GdAb/HwnoMVaEB7ouvCj1BoQLlsdM5Pi2hARbx1/u3FaEBAwjBgSf9oQKCKG7cYN2lAaLPqc7VuaUAz/n3GBaZpQI7LuKmB22lAObnfoSgQakDP+L64VEVqQEHYKVYNeWpAXoJTH0imakB/hjdrcMpqQJEr9SwI6mpA\"},\"shape\":[63],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1041\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1042\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1037\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#3288bd\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1038\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#3288bd\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1039\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#3288bd\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1051\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1045\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1046\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1047\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":[\"1960\",\"1961\",\"1962\",\"1963\",\"1964\",\"1965\",\"1966\",\"1967\",\"1968\",\"1969\",\"1970\",\"1971\",\"1972\",\"1973\",\"1974\",\"1975\",\"1976\",\"1977\",\"1978\",\"1979\",\"1980\",\"1981\",\"1982\",\"1983\",\"1984\",\"1985\",\"1986\",\"1987\",\"1988\",\"1989\",\"1990\",\"1991\",\"1992\",\"1993\",\"1994\",\"1995\",\"1996\",\"1997\",\"1998\",\"1999\",\"2000\",\"2001\",\"2002\",\"2003\",\"2004\",\"2005\",\"2006\",\"2007\",\"2008\",\"2009\",\"2010\",\"2011\",\"2012\",\"2013\",\"2014\",\"2015\",\"2016\",\"2017\",\"2018\",\"2019\",\"2020\",\"2021\",\"2022\"],\"shape\":[63],\"dtype\":\"object\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"w/UoXI/YhEBxPQrXo6KEQFyPwvUozoRASOF6FK5ShUCkcD0K19KFQBSuR+F6WYZAMzMzMzP7hkBmZmZmZpSHQK5H4XoUNIhAMzMzMzPgiEDsUbgehZKJQKRwPQrXSIpACtejcD3wikDsUbgehY+LQM3MzMzMIoxAXI/C9SijjEAUrkfhehWNQHE9Cteje41AuB6F61HhjUDXo3A9CkiOQHsUrkfhqY5ArkfhehQPj0DXo3A9CoWPQBSuR+F6+o9AzczMzEwzkEBcj8L1KGyQQFyPwvUoq5BAcT0K1yPwkEDsUbgehTaRQJqZmZmZepFACtejcL28kUCF61G4HvuRQHsUrkfhM5JA9ihcj8JpkkCkcD0KV5+SQFK4HoVr05JAMzMzMzMGk0DNzMzMTDiTQArXo3C9Z5NAPQrXo/CSk0CuR+F6lLqTQGZmZmZm35NAmpmZmZkBlECamZmZmSGUQM3MzMxMQJRAexSuR+FelECuR+F6FHyUQNejcD2Kl5RAhetRuJ6ylEDXo3A9Cs2UQLgehevR5pRAcT0K1yMElUD2KFyPwiiVQClcj8L1TJVAPQrXo3BvlUA9CtejcI+VQFyPwvUor5VAj8L1KNzQlUDXo3A9CuuVQBSuR+H6/pVAZmZmZmYMlkA9CtejcBGWQDMzMzOzEJZA\"},\"shape\":[63],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1052\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1053\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1048\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#99d594\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1049\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#99d594\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1050\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#99d594\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1061\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1055\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1056\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1057\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":[\"1960\",\"1961\",\"1962\",\"1963\",\"1964\",\"1965\",\"1966\",\"1967\",\"1968\",\"1969\",\"1970\",\"1971\",\"1972\",\"1973\",\"1974\",\"1975\",\"1976\",\"1977\",\"1978\",\"1979\",\"1980\",\"1981\",\"1982\",\"1983\",\"1984\",\"1985\",\"1986\",\"1987\",\"1988\",\"1989\",\"1990\",\"1991\",\"1992\",\"1993\",\"1994\",\"1995\",\"1996\",\"1997\",\"1998\",\"1999\",\"2000\",\"2001\",\"2002\",\"2003\",\"2004\",\"2005\",\"2006\",\"2007\",\"2008\",\"2009\",\"2010\",\"2011\",\"2012\",\"2013\",\"2014\",\"2015\",\"2016\",\"2017\",\"2018\",\"2019\",\"2020\",\"2021\",\"2022\"],\"shape\":[63],\"dtype\":\"object\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"LSeh9EXfe0D1g7pIoYV8QK38MhhjMH1Ayv55GvDefUC8df7t8pB+QNumeFzUQX9AQgddwuHvf0Aqj26E5U+AQMmutIx0q4BAQni0cYQKgUCeQxmqAmyBQBAHCVH+z4FAcy8wK7Q2gkACDwwg3KCCQITyPo7GDYNAiSe7mTF8g0DC3sSQnOuDQMZpiCp8XYRAatlaXyTShEAP7zmw/EmFQPqbUIigxoVA04OCUvRGhkBGfv0QW8mGQB41JsScTodAjIaMRynXh0AUd7zJ72GIQE5jey0I74hAyXa+n7p9iUAa/P1i1g2KQFZETfQZoIpAK/uuCJ4zi0B/pl63iMeLQGmKAKeXXIxAdzHNdM/yjEBol299GIqNQOwy/Kc7Io5AXwg57z+6jkAb9RCNrlKPQANd+wJ6649A8OAnDgBCkEAsZRniiI6QQNTRcTXi25BAfa1LjUApkUBF8wAWqXWRQE+Q2O4OwZFAH9rHCo4KkkCNDkjCflGSQFAYlGnElpJAnuv7cPDakkDUYBqGjx6TQLAgzVh0YpNAR1Z+GXymk0B8LH3o8umTQAzohTuHLJRArvTabPxslEBIMxZNd6uUQIyEtpyL6pRA7YFWYMgolUCG56ViA2SVQBE2PL1ynJVAmDEFa4zRlUByGMxfQf6VQDNOQ1SxJJZA\"},\"shape\":[63],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1062\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1063\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1058\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#e6f598\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1059\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#e6f598\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1060\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#e6f598\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1071\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1065\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1066\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1067\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":[\"1960\",\"1961\",\"1962\",\"1963\",\"1964\",\"1965\",\"1966\",\"1967\",\"1968\",\"1969\",\"1970\",\"1971\",\"1972\",\"1973\",\"1974\",\"1975\",\"1976\",\"1977\",\"1978\",\"1979\",\"1980\",\"1981\",\"1982\",\"1983\",\"1984\",\"1985\",\"1986\",\"1987\",\"1988\",\"1989\",\"1990\",\"1991\",\"1992\",\"1993\",\"1994\",\"1995\",\"1996\",\"1997\",\"1998\",\"1999\",\"2000\",\"2001\",\"2002\",\"2003\",\"2004\",\"2005\",\"2006\",\"2007\",\"2008\",\"2009\",\"2010\",\"2011\",\"2012\",\"2013\",\"2014\",\"2015\",\"2016\",\"2017\",\"2018\",\"2019\",\"2020\",\"2021\",\"2022\"],\"shape\":[63],\"dtype\":\"object\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"xSCwcmj5XUDJdr6fGk9eQOf7qfHSpV5APQrXo3D9XkCuR+F6FFZfQEjhehSur19Ay6FFtvPdX0CDwMqhRQZgQARWDi2yHWBAaJHtfD81YECwcmiR7UxgQClcj8L1ZGBADAIrhxZ9YEDFILByaJVgQOf7qfHSrWBAZmZmZmbGYEBiEFg5tORgQDMzMzMzA2FAUrgeheshYUC+nxov3UBhQLgehetRYGFAJzEIrBx+YUB1kxgEVpphQEw3iUFgtWFApHA9CtfXYUD6fmq8dPthQPhT46WbHGJAkxgEVg49YkCBlUOLbFtiQFCNl24Sd2JAbjDUYQV/YkDrcd9qnYxiQMU56ug4kWJABmUaTa6OYkCsdHedDY1iQGJodXIGjGJAhUTaxh+FYkAV4SajSn1iQMPVARB3dWJA5/7qcd9mYkDhXwSNGVNiQD/kLVc/P2JAT+rL0s4pYkAaM4l6wRRiQOxP4nMnAmJAn1bRH5rwYUB9dVWgluFhQKhxb37D2WFAMnVXdsHXYUBI3jmUIdlhQPTfg9cu22FA304iwr/eYUBTPZl/dOZhQIkHlE058GFAidNJtjr6YUDVPh2PGQNiQPSnjer0CmJAuvQvSeUPYkAtI/WeSg9iQH2UERcADWJA/aGZJ1cCYkDvVpboLARiQPvKg/SUB2JA\"},\"shape\":[63],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1072\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1073\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1068\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#fee08b\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1069\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#fee08b\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1070\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#fee08b\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1081\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1075\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1076\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1077\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":[\"1960\",\"1961\",\"1962\",\"1963\",\"1964\",\"1965\",\"1966\",\"1967\",\"1968\",\"1969\",\"1970\",\"1971\",\"1972\",\"1973\",\"1974\",\"1975\",\"1976\",\"1977\",\"1978\",\"1979\",\"1980\",\"1981\",\"1982\",\"1983\",\"1984\",\"1985\",\"1986\",\"1987\",\"1988\",\"1989\",\"1990\",\"1991\",\"1992\",\"1993\",\"1994\",\"1995\",\"1996\",\"1997\",\"1998\",\"1999\",\"2000\",\"2001\",\"2002\",\"2003\",\"2004\",\"2005\",\"2006\",\"2007\",\"2008\",\"2009\",\"2010\",\"2011\",\"2012\",\"2013\",\"2014\",\"2015\",\"2016\",\"2017\",\"2018\",\"2019\",\"2020\",\"2021\",\"2022\"],\"shape\":[63],\"dtype\":\"object\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"X38SnzuFMEDBkUCDTf0wQNKJBFPNgDFAkGYsms4KMkDTUKOQZJoyQOcBLPLrLzNAR1Sobi7KM0AqOLwgImk0QM0jfzDwDDVApmJjXke0NUCr61BNSV42QOjAcoQMCDdA7gbRWtGyN0B7Szlf7GE4QMxEEVK3EzlAIXcRpijHOUDQRNjw9Ho6QIB/SpUoMztAIZOMnIXxO0Cp2m6Cb7I8QPAXsyWrdj1AN1MhHok7PkDb39kevQU/QLtIoSx83T9Adcdim1RiQEBdiNUfYeBAQI+oUN1ccEFAsirCTUYPQkA7N23GabJCQOKt82+XVUNAsfm4NlTwQ0CZf/RNmnREQF6iemtg4URAUAEwnkFDRUBW9fI7TaJFQO+NIQA4/kVAvvc3aK9URkAm5e5zfKRGQK5hhsYT7UZAfTz03a0uR0BweawZGWhHQHi3skRnnUdATuyhfazUR0Brm+JxUQ1IQISgo1UtR0hAvRx23zGCSEBPzlDc8b5IQPTeGAKA/0hAmdcRh2xISUD76xUW3JVJQMh4lEp45ElA5j+k3744SkCe6/twkJJKQJShKqbS70pAzuFa7WFdS0AWaHdIMfBLQL75DRMNNkxAUHPyIhNSTEDayeAoeatMQAX6RJ4kC01Aw2M/i6VmTUCjWG5pNbJNQEax3NJq8k1A\"},\"shape\":[63],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1082\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1083\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1078\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#fc8d59\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1079\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#fc8d59\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1080\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#fc8d59\",\"line_alpha\":0.2,\"line_width\":2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1010\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1023\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1024\",\"attributes\":{\"renderers\":\"auto\"}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1025\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1026\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left\":{\"type\":\"number\",\"value\":\"nan\"},\"right\":{\"type\":\"number\",\"value\":\"nan\"},\"top\":{\"type\":\"number\",\"value\":\"nan\"},\"bottom\":{\"type\":\"number\",\"value\":\"nan\"},\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"top_units\":\"canvas\",\"bottom_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1031\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1032\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1033\"}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1018\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1019\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1020\"},\"axis_label\":\"Population, total (in millions)\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1021\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1013\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1014\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1015\"},\"axis_label\":\"Year\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1016\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1017\",\"attributes\":{\"axis\":{\"id\":\"p1013\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1022\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1018\"}}},{\"type\":\"object\",\"name\":\"Legend\",\"id\":\"p1043\",\"attributes\":{\"location\":\"right\",\"click_policy\":\"mute\",\"items\":[{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p1044\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"BRA\"},\"renderers\":[{\"id\":\"p1040\"}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p1054\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"CHN\"},\"renderers\":[{\"id\":\"p1051\"}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p1064\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"IND\"},\"renderers\":[{\"id\":\"p1061\"}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p1074\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"RUS\"},\"renderers\":[{\"id\":\"p1071\"}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p1084\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"ZAF\"},\"renderers\":[{\"id\":\"p1081\"}]}}]}}]}}]}};\n", - " const render_items = [{\"docid\":\"6c86f57c-0f70-4648-a27e-ed2b73c3308b\",\"roots\":{\"p1001\":\"d2127207-0be3-46fb-86fa-2b57704ab0fc\"},\"root_ids\":[\"p1001\"]}];\n", - " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", - " }\n", - " if (root.Bokeh !== undefined) {\n", - " embed_document(root);\n", - " } else {\n", - " let attempts = 0;\n", - " const timer = setInterval(function(root) {\n", - " if (root.Bokeh !== undefined) {\n", - " clearInterval(timer);\n", - " embed_document(root);\n", - " } else {\n", - " attempts++;\n", - " if (attempts > 100) {\n", - " clearInterval(timer);\n", - " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", - " }\n", - " }\n", - " }, 10, root)\n", - " }\n", - "})(window);" - ], - "application/vnd.bokehjs_exec.v0+json": "" - }, - "metadata": { - "application/vnd.bokehjs_exec.v0+json": { - "id": "p1001" - } - }, - "output_type": "display_data" - } - ], - "source": [ - "output_notebook()\n", - "\n", - "p = figure(title=\"Population, total (World Bank)\", width=700, height=600)\n", - "\n", - "# colors\n", - "colors = itertools.cycle(Spectral6)\n", - "\n", - "# plotting the line graph\n", - "for column, color in zip(df.columns, colors):\n", - " p.line(\n", - " df.index,\n", - " df[column],\n", - " legend_label=column,\n", - " color=color,\n", - " line_width=2,\n", - " )\n", - "\n", - "p.legend.location = \"right\"\n", - "p.legend.click_policy = \"mute\"\n", - "p.title.text_font_size = \"12pt\"\n", - "\n", - "p.xaxis.axis_label = \"Year\"\n", - "p.yaxis.axis_label = \"Population, total (in millions)\"\n", - "\n", - "show(p)" - ] - } - ], - "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.13" - }, - "vscode": { - "interpreter": { - "hash": "b6702b69e93007336b96338c5a331192f07cedff01d36d4dcfa0f842adb718ad" - } - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/notebooks/world-bank-package.ipynb b/notebooks/world-bank-package.ipynb deleted file mode 100644 index 60db8b7..0000000 --- a/notebooks/world-bank-package.ipynb +++ /dev/null @@ -1,524 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "90700fdc-fcc7-4e54-8c9e-449879d8c66d", - "metadata": { - "tags": [] - }, - "source": [ - "# Python Package Example\n", - "\n", - "> The following is an example of on how to use and distribute your project as a [Python package](https://packaging.python.org) using the example template. Remember mix and match to yout project's requirements. " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "ef92b033-81e2-4c5f-b56a-63f4f7a37247", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "import itertools\n", - "\n", - "from bokeh.palettes import Spectral6\n", - "from bokeh.plotting import figure, output_notebook, show" - ] - }, - { - "cell_type": "markdown", - "id": "14e89727", - "metadata": {}, - "source": [ - "## Usage" - ] - }, - { - "cell_type": "markdown", - "id": "b4c0f3e8-7756-41bb-aa21-cc2eee5ff67f", - "metadata": {}, - "source": [ - "Unlike the [previous example](https://worldbank.github.io/template/notebooks/world-bank-api.html), where the source code was contained on the Jupyter notebok itself, we (re)use a Python package - the [template](https://github.com/worldbank/template/tree/main/src/template) Python package - which will let us (re)use any attributes and methods in the following example.\n", - "\n", - "Let's start by importing `WorldBankIndicatorsAPI`, a Python API wrapper class created to facilitate the usage of the [World Bank Indicators API](https://datahelpdesk.worldbank.org/knowledgebase/articles/889392-about-the-indicators-api-documentation)." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "d797ef77-6ca4-4f9d-a1f8-abbfd9884b07", - "metadata": {}, - "outputs": [], - "source": [ - "from template.indicators import WorldBankIndicatorsAPI" - ] - }, - { - "cell_type": "markdown", - "id": "17f380e4-3854-4af6-940c-7afe9723a59a", - "metadata": {}, - "source": [ - "Let's continue by creating the API object. " - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "f911a5c3-6994-45a6-a049-4b398f5890c0", - "metadata": {}, - "outputs": [], - "source": [ - "api = WorldBankIndicatorsAPI()" - ] - }, - { - "cell_type": "markdown", - "id": "7fa96741-f4cd-4504-a5f8-6467f9a2345e", - "metadata": {}, - "source": [ - "The `api` wrapper object is now ready to use! We will invoke its `query` method to retrieve data from the [World Bank Indicators API](https://datahelpdesk.worldbank.org/knowledgebase/articles/889392-about-the-indicators-api-documentation). To learn how to use it, such as information about method signature, valid parameters and return value, we read `help`. Since [PEP 257](https://peps.python.org/pep-0257), Python offers *doctrings*, which are an easy and standard to create code documentation and it is a good practice adopt it. Documentating the source code is crucial to create a maintainable reliable and reproducicle code base and project.\n", - "\n", - "Let's see the `query` method's *docstring* as shown below." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "fb6ca314-d161-40e1-a376-a3013a0711eb", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Help on method query in module template.indicators:\n", - "\n", - "query(indicator, country: list = 'all', params: dict = {}) method of template.indicators.WorldBankIndicatorsAPI instance\n", - " Retrieve a response, valid JSON response or error, from the World Bank Indicators API.\n", - " \n", - " See also:\n", - " https://datahelpdesk.worldbank.org/knowledgebase/articles/889392-about-the-indicators-api-documentation\n", - " \n", - " Parameters\n", - " ----------\n", - " indicator : str\n", - " World Bank API Indicator.\n", - " country : list, optional\n", - " List of countries. The country name is converted to ISO 3166-1 alpha-3 country code.\n", - " params : dict, optional\n", - " World Bank API Indicator Query Strings.\n", - " \n", - " Returns\n", - " -------\n", - " pandas.core.frame.DataFrame\n", - " Return a Pandas DataFrame obtained with response data from World Bank Indicators API.\n", - "\n" - ] - } - ], - "source": [ - "help(api.query)" - ] - }, - { - "cell_type": "markdown", - "id": "e82fc342-165d-42d6-b3dc-7534c215ca1f", - "metadata": {}, - "source": [ - "The `query` method allows us to select an **indicator** (e.g, [World Development Indicators](https://datatopics.worldbank.org/world-development-indicators)), a list of countries and [query parameters](https://datahelpdesk.worldbank.org/knowledgebase/articles/898581#query-strings). Note that contrary to the [previous example](https://worldbank.github.io/template/notebooks/world-bank-api.html), the method expects a list of country names and converts them to [ISO 3166-1 alpha-3](https://www.iso.org/iso-3166-country-codes.html) automatically." - ] - }, - { - "cell_type": "markdown", - "id": "23b0a1eb-73c1-42e7-8903-98e362ef86de", - "metadata": {}, - "source": [ - "Let's invoke the `query` method and retrieve the results for `SP.POP.TOTL` for the [BRICS](https://infobrics.org) (as before)." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "7fb7daea-c5cf-42ea-b746-a565dd9ac4e1", - "metadata": {}, - "outputs": [], - "source": [ - "df = api.query(\n", - " \"SP.POP.TOTL\", country=[\"Brazil\", \"China\", \"India\", \"Russia\", \"South Africa\"]\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "46662c1b-4c19-424b-8a61-f651cb486c5b", - "metadata": {}, - "source": [ - "**Voilร !** We just (re)used the [template](https://github.com/worldbank/template/tree/main/src/template) Python package in our example delegating the maintenance and logic, making the notebook easier to understand and reproduce. \n", - "\n", - "```{tip}\n", - "In addition, the `template` makes any Python package automatically [pip installable](https://packaging.python.org/en/latest/tutorials/installing-packages/) and accessible to *anyone* and from *anywhere*!\n", - "\n", - "To install from source:\n", - "\n", - "\tpip install git+https://github.com/worldbank/template.git\n", - "\n", - "To install from version:\n", - "\n", - "\tpip install git+https://github.com/worldbank/template.git@v0.1.0\n", - "\t\n", - "\n", - "When distributing a project release, it is strongly recommended to adhere to release management good practices. It is recommended to create checklists, adopt versioning (e.g, [semantic versioning](https://semver.org/) and to release on [Python Package Index](https://pypi.org/) (instead of GitHub).\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "80887da5-0474-48b3-8c71-fbe3dbd3a8e8", - "metadata": {}, - "source": [ - "```{tip}\n", - "The template will automatically find and install any local `src` packages as long as the `setup.cfg` file is up-to-date.\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "daa4319a-8936-4195-b1fc-aad9c008325b", - "metadata": {}, - "source": [ - "```{caution}\n", - "The `template` Python package should be used for demonstration purposes only. For support, please see the [World Bank Indicators API Documentation](https://datahelpdesk.worldbank.org/knowledgebase/articles/889392-about-the-indicators-api-documentation).\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "e9f14239", - "metadata": {}, - "source": [ - "Finally, let's take a look at the retrieved data." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "b1d7cf70-bf0e-4c12-ae0d-fd26349291db", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "df = df.pivot_table(values=\"value\", index=\"date\", columns=\"country.value\")" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "699a0495-4f06-479c-b517-58336110547f", - "metadata": { - "tags": [ - "output_scroll" - ] - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
country.valueBrazilChinaIndiaRussian FederationSouth Africa
date
196073092515.06.670700e+084.459546e+08119897000.016520441.0
196175330008.06.603300e+084.563519e+08121236000.016989464.0
196277599218.06.657700e+084.670242e+08122591000.017503133.0
196379915555.06.823350e+084.779336e+08123960000.018042215.0
196482262794.06.983550e+084.890593e+08125345000.018603097.0
..................
2018210166592.01.402760e+091.369003e+09144477859.057339635.0
2019211782878.01.407745e+091.383112e+09144406261.058087055.0
2020213196304.01.411100e+091.396387e+09144073139.058801927.0
2021214326223.01.412360e+091.407564e+09144130482.059392255.0
2022215313498.01.412175e+091.417173e+09144236933.059893885.0
\n", - "

63 rows ร— 5 columns

\n", - "
" - ], - "text/plain": [ - "country.value Brazil China India Russian Federation \\\n", - "date \n", - "1960 73092515.0 6.670700e+08 4.459546e+08 119897000.0 \n", - "1961 75330008.0 6.603300e+08 4.563519e+08 121236000.0 \n", - "1962 77599218.0 6.657700e+08 4.670242e+08 122591000.0 \n", - "1963 79915555.0 6.823350e+08 4.779336e+08 123960000.0 \n", - "1964 82262794.0 6.983550e+08 4.890593e+08 125345000.0 \n", - "... ... ... ... ... \n", - "2018 210166592.0 1.402760e+09 1.369003e+09 144477859.0 \n", - "2019 211782878.0 1.407745e+09 1.383112e+09 144406261.0 \n", - "2020 213196304.0 1.411100e+09 1.396387e+09 144073139.0 \n", - "2021 214326223.0 1.412360e+09 1.407564e+09 144130482.0 \n", - "2022 215313498.0 1.412175e+09 1.417173e+09 144236933.0 \n", - "\n", - "country.value South Africa \n", - "date \n", - "1960 16520441.0 \n", - "1961 16989464.0 \n", - "1962 17503133.0 \n", - "1963 18042215.0 \n", - "1964 18603097.0 \n", - "... ... \n", - "2018 57339635.0 \n", - "2019 58087055.0 \n", - "2020 58801927.0 \n", - "2021 59392255.0 \n", - "2022 59893885.0 \n", - "\n", - "[63 rows x 5 columns]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df" - ] - }, - { - "cell_type": "markdown", - "id": "c5daa85a-004d-4e93-be84-72d064d0b83b", - "metadata": {}, - "source": [ - "## Visualization\n", - "\n", - "As before, let's now plot the data as a time series using [Bokeh](https://docs.bokeh.org)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "60219760", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - " \n", - "
\n", - " \n", - " Loading BokehJS ...\n", - "
\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/javascript": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\nconst JS_MIME_TYPE = 'application/javascript';\n const HTML_MIME_TYPE = 'text/html';\n const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n const CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n const script = document.createElement(\"script\");\n node.appendChild(script);\n }\n\n /**\n * Handle when an output is cleared or removed\n */\n function handleClearOutput(event, handle) {\n function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\n const cell = handle.cell;\n\n const id = cell.output_area._bokeh_element_id;\n const server_id = cell.output_area._bokeh_server_id;\n\n // Clean up Bokeh references\n if (id != null) {\n drop(id)\n }\n\n if (server_id !== undefined) {\n // Clean up Bokeh references\n const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n cell.notebook.kernel.execute(cmd_clean, {\n iopub: {\n output: function(msg) {\n const id = msg.content.text.trim()\n drop(id)\n }\n }\n });\n // Destroy server and session\n const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd_destroy);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n const output_area = handle.output_area;\n const output = handle.output;\n\n // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n return\n }\n\n const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n\n if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n // store reference to embed id on output_area\n output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n }\n if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n const bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n const script_attrs = bk_div.children[0].attributes;\n for (let i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\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 function register_renderer(events, OutputArea) {\n\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n const 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 const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[toinsert.length - 1]);\n element.append(toinsert);\n return toinsert\n }\n\n /* Handle when an output is cleared or removed */\n events.on('clear_output.CodeCell', handleClearOutput);\n events.on('delete.Cell', handleClearOutput);\n\n /* Handle when a new output is added */\n events.on('output_added.OutputArea', handleAddOutput);\n\n /**\n * Register the mime type and append_mime function with output_area\n */\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n /* Is output safe? */\n safe: true,\n /* Index of renderer in `output_area.display_order` */\n index: 0\n });\n }\n\n // register the mime type if in Jupyter Notebook environment and previously unregistered\n if (root.Jupyter !== undefined) {\n const events = require('base/js/events');\n const OutputArea = require('notebook/js/outputarea').OutputArea;\n\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n }\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n const el = document.getElementById(\"b627ae3b-1db0-4fe3-8762-32a285a44007\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\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, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\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 == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\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\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\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 }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\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 };\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 const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.3.4.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.4.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.4.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.4.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.3.4.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\nif (force === true) {\n display_loaded();\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 } else if (force !== true) {\n const cell = $(document.getElementById(\"b627ae3b-1db0-4fe3-8762-32a285a44007\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));", - "application/vnd.bokehjs_load.v0+json": "" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "\n", - "
\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/javascript": "(function(root) {\n function embed_document(root) {\n const docs_json = {\"6c86f57c-0f70-4648-a27e-ed2b73c3308b\":{\"version\":\"3.3.4\",\"title\":\"Bokeh Application\",\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1001\",\"attributes\":{\"width\":700,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1002\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1003\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1011\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1012\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1004\",\"attributes\":{\"text\":\"Population, total (World Bank)\",\"text_font_size\":\"12pt\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1040\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1034\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1035\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1036\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":[\"1960\",\"1961\",\"1962\",\"1963\",\"1964\",\"1965\",\"1966\",\"1967\",\"1968\",\"1969\",\"1970\",\"1971\",\"1972\",\"1973\",\"1974\",\"1975\",\"1976\",\"1977\",\"1978\",\"1979\",\"1980\",\"1981\",\"1982\",\"1983\",\"1984\",\"1985\",\"1986\",\"1987\",\"1988\",\"1989\",\"1990\",\"1991\",\"1992\",\"1993\",\"1994\",\"1995\",\"1996\",\"1997\",\"1998\",\"1999\",\"2000\",\"2001\",\"2002\",\"2003\",\"2004\",\"2005\",\"2006\",\"2007\",\"2008\",\"2009\",\"2010\",\"2011\",\"2012\",\"2013\",\"2014\",\"2015\",\"2016\",\"2017\",\"2018\",\"2019\",\"2020\",\"2021\",\"2022\"],\"shape\":[63],\"dtype\":\"object\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"7dgIxOtFUkDH2t/ZHtVSQCtLdJZZZlNAHaz/c5j6U0Bx5eyd0ZBUQJl+iXjrJ1VA16Gakqy+VUAdzCbAsFRWQDSBIhYx6lZAjKIHPgaAV0DpJjEIrBdYQE7U0twKsVhAeSKI83BMWUCVZB2OrupZQAiRDDm2ilpA4NbdPNUsW0AVi98UVtJbQPj9mxcnfFxARYMUPIUqXUDGGcOcoNxdQDtu+N10kl5AAvG6fsFKX0BDBBxCFQJgQO5Cc51GX2BAFNBE2HC8YEAz3IDPDxlhQPuWOV2WdGFAq+l6ouvOYUAlIvyLIChiQEuuYvEbgGJAe0ykNJvWYkDj/E0oxCpjQAvSjEXTfGNA+FPjpRvOY0CZ1NAGYB9kQNJWJZF9cGRAyv55GjDBZEDRr62ffhFlQADICRNGYWVAUfUrnY+vZUCOO6WD9ftlQJq0qbrHRmZAza/mAEGPZkD0wp0LI9RmQMnp6/kaF2dApb+XwoNZZ0BPzeUGQ5pnQJz4akfx2GdAb/HwnoMVaEB7ouvCj1BoQLlsdM5Pi2hARbx1/u3FaEBAwjBgSf9oQKCKG7cYN2lAaLPqc7VuaUAz/n3GBaZpQI7LuKmB22lAObnfoSgQakDP+L64VEVqQEHYKVYNeWpAXoJTH0imakB/hjdrcMpqQJEr9SwI6mpA\"},\"shape\":[63],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1041\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1042\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1037\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#3288bd\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1038\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#3288bd\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1039\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#3288bd\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1051\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1045\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1046\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1047\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":[\"1960\",\"1961\",\"1962\",\"1963\",\"1964\",\"1965\",\"1966\",\"1967\",\"1968\",\"1969\",\"1970\",\"1971\",\"1972\",\"1973\",\"1974\",\"1975\",\"1976\",\"1977\",\"1978\",\"1979\",\"1980\",\"1981\",\"1982\",\"1983\",\"1984\",\"1985\",\"1986\",\"1987\",\"1988\",\"1989\",\"1990\",\"1991\",\"1992\",\"1993\",\"1994\",\"1995\",\"1996\",\"1997\",\"1998\",\"1999\",\"2000\",\"2001\",\"2002\",\"2003\",\"2004\",\"2005\",\"2006\",\"2007\",\"2008\",\"2009\",\"2010\",\"2011\",\"2012\",\"2013\",\"2014\",\"2015\",\"2016\",\"2017\",\"2018\",\"2019\",\"2020\",\"2021\",\"2022\"],\"shape\":[63],\"dtype\":\"object\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"w/UoXI/YhEBxPQrXo6KEQFyPwvUozoRASOF6FK5ShUCkcD0K19KFQBSuR+F6WYZAMzMzMzP7hkBmZmZmZpSHQK5H4XoUNIhAMzMzMzPgiEDsUbgehZKJQKRwPQrXSIpACtejcD3wikDsUbgehY+LQM3MzMzMIoxAXI/C9SijjEAUrkfhehWNQHE9Cteje41AuB6F61HhjUDXo3A9CkiOQHsUrkfhqY5ArkfhehQPj0DXo3A9CoWPQBSuR+F6+o9AzczMzEwzkEBcj8L1KGyQQFyPwvUoq5BAcT0K1yPwkEDsUbgehTaRQJqZmZmZepFACtejcL28kUCF61G4HvuRQHsUrkfhM5JA9ihcj8JpkkCkcD0KV5+SQFK4HoVr05JAMzMzMzMGk0DNzMzMTDiTQArXo3C9Z5NAPQrXo/CSk0CuR+F6lLqTQGZmZmZm35NAmpmZmZkBlECamZmZmSGUQM3MzMxMQJRAexSuR+FelECuR+F6FHyUQNejcD2Kl5RAhetRuJ6ylEDXo3A9Cs2UQLgehevR5pRAcT0K1yMElUD2KFyPwiiVQClcj8L1TJVAPQrXo3BvlUA9CtejcI+VQFyPwvUor5VAj8L1KNzQlUDXo3A9CuuVQBSuR+H6/pVAZmZmZmYMlkA9CtejcBGWQDMzMzOzEJZA\"},\"shape\":[63],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1052\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1053\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1048\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#99d594\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1049\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#99d594\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1050\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#99d594\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1061\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1055\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1056\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1057\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":[\"1960\",\"1961\",\"1962\",\"1963\",\"1964\",\"1965\",\"1966\",\"1967\",\"1968\",\"1969\",\"1970\",\"1971\",\"1972\",\"1973\",\"1974\",\"1975\",\"1976\",\"1977\",\"1978\",\"1979\",\"1980\",\"1981\",\"1982\",\"1983\",\"1984\",\"1985\",\"1986\",\"1987\",\"1988\",\"1989\",\"1990\",\"1991\",\"1992\",\"1993\",\"1994\",\"1995\",\"1996\",\"1997\",\"1998\",\"1999\",\"2000\",\"2001\",\"2002\",\"2003\",\"2004\",\"2005\",\"2006\",\"2007\",\"2008\",\"2009\",\"2010\",\"2011\",\"2012\",\"2013\",\"2014\",\"2015\",\"2016\",\"2017\",\"2018\",\"2019\",\"2020\",\"2021\",\"2022\"],\"shape\":[63],\"dtype\":\"object\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"LSeh9EXfe0D1g7pIoYV8QK38MhhjMH1Ayv55GvDefUC8df7t8pB+QNumeFzUQX9AQgddwuHvf0Aqj26E5U+AQMmutIx0q4BAQni0cYQKgUCeQxmqAmyBQBAHCVH+z4FAcy8wK7Q2gkACDwwg3KCCQITyPo7GDYNAiSe7mTF8g0DC3sSQnOuDQMZpiCp8XYRAatlaXyTShEAP7zmw/EmFQPqbUIigxoVA04OCUvRGhkBGfv0QW8mGQB41JsScTodAjIaMRynXh0AUd7zJ72GIQE5jey0I74hAyXa+n7p9iUAa/P1i1g2KQFZETfQZoIpAK/uuCJ4zi0B/pl63iMeLQGmKAKeXXIxAdzHNdM/yjEBol299GIqNQOwy/Kc7Io5AXwg57z+6jkAb9RCNrlKPQANd+wJ6649A8OAnDgBCkEAsZRniiI6QQNTRcTXi25BAfa1LjUApkUBF8wAWqXWRQE+Q2O4OwZFAH9rHCo4KkkCNDkjCflGSQFAYlGnElpJAnuv7cPDakkDUYBqGjx6TQLAgzVh0YpNAR1Z+GXymk0B8LH3o8umTQAzohTuHLJRArvTabPxslEBIMxZNd6uUQIyEtpyL6pRA7YFWYMgolUCG56ViA2SVQBE2PL1ynJVAmDEFa4zRlUByGMxfQf6VQDNOQ1SxJJZA\"},\"shape\":[63],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1062\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1063\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1058\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#e6f598\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1059\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#e6f598\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1060\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#e6f598\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1071\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1065\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1066\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1067\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":[\"1960\",\"1961\",\"1962\",\"1963\",\"1964\",\"1965\",\"1966\",\"1967\",\"1968\",\"1969\",\"1970\",\"1971\",\"1972\",\"1973\",\"1974\",\"1975\",\"1976\",\"1977\",\"1978\",\"1979\",\"1980\",\"1981\",\"1982\",\"1983\",\"1984\",\"1985\",\"1986\",\"1987\",\"1988\",\"1989\",\"1990\",\"1991\",\"1992\",\"1993\",\"1994\",\"1995\",\"1996\",\"1997\",\"1998\",\"1999\",\"2000\",\"2001\",\"2002\",\"2003\",\"2004\",\"2005\",\"2006\",\"2007\",\"2008\",\"2009\",\"2010\",\"2011\",\"2012\",\"2013\",\"2014\",\"2015\",\"2016\",\"2017\",\"2018\",\"2019\",\"2020\",\"2021\",\"2022\"],\"shape\":[63],\"dtype\":\"object\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"xSCwcmj5XUDJdr6fGk9eQOf7qfHSpV5APQrXo3D9XkCuR+F6FFZfQEjhehSur19Ay6FFtvPdX0CDwMqhRQZgQARWDi2yHWBAaJHtfD81YECwcmiR7UxgQClcj8L1ZGBADAIrhxZ9YEDFILByaJVgQOf7qfHSrWBAZmZmZmbGYEBiEFg5tORgQDMzMzMzA2FAUrgeheshYUC+nxov3UBhQLgehetRYGFAJzEIrBx+YUB1kxgEVpphQEw3iUFgtWFApHA9CtfXYUD6fmq8dPthQPhT46WbHGJAkxgEVg49YkCBlUOLbFtiQFCNl24Sd2JAbjDUYQV/YkDrcd9qnYxiQMU56ug4kWJABmUaTa6OYkCsdHedDY1iQGJodXIGjGJAhUTaxh+FYkAV4SajSn1iQMPVARB3dWJA5/7qcd9mYkDhXwSNGVNiQD/kLVc/P2JAT+rL0s4pYkAaM4l6wRRiQOxP4nMnAmJAn1bRH5rwYUB9dVWgluFhQKhxb37D2WFAMnVXdsHXYUBI3jmUIdlhQPTfg9cu22FA304iwr/eYUBTPZl/dOZhQIkHlE058GFAidNJtjr6YUDVPh2PGQNiQPSnjer0CmJAuvQvSeUPYkAtI/WeSg9iQH2UERcADWJA/aGZJ1cCYkDvVpboLARiQPvKg/SUB2JA\"},\"shape\":[63],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1072\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1073\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1068\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#fee08b\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1069\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#fee08b\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1070\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#fee08b\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1081\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1075\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1076\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1077\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":[\"1960\",\"1961\",\"1962\",\"1963\",\"1964\",\"1965\",\"1966\",\"1967\",\"1968\",\"1969\",\"1970\",\"1971\",\"1972\",\"1973\",\"1974\",\"1975\",\"1976\",\"1977\",\"1978\",\"1979\",\"1980\",\"1981\",\"1982\",\"1983\",\"1984\",\"1985\",\"1986\",\"1987\",\"1988\",\"1989\",\"1990\",\"1991\",\"1992\",\"1993\",\"1994\",\"1995\",\"1996\",\"1997\",\"1998\",\"1999\",\"2000\",\"2001\",\"2002\",\"2003\",\"2004\",\"2005\",\"2006\",\"2007\",\"2008\",\"2009\",\"2010\",\"2011\",\"2012\",\"2013\",\"2014\",\"2015\",\"2016\",\"2017\",\"2018\",\"2019\",\"2020\",\"2021\",\"2022\"],\"shape\":[63],\"dtype\":\"object\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"X38SnzuFMEDBkUCDTf0wQNKJBFPNgDFAkGYsms4KMkDTUKOQZJoyQOcBLPLrLzNAR1Sobi7KM0AqOLwgImk0QM0jfzDwDDVApmJjXke0NUCr61BNSV42QOjAcoQMCDdA7gbRWtGyN0B7Szlf7GE4QMxEEVK3EzlAIXcRpijHOUDQRNjw9Ho6QIB/SpUoMztAIZOMnIXxO0Cp2m6Cb7I8QPAXsyWrdj1AN1MhHok7PkDb39kevQU/QLtIoSx83T9Adcdim1RiQEBdiNUfYeBAQI+oUN1ccEFAsirCTUYPQkA7N23GabJCQOKt82+XVUNAsfm4NlTwQ0CZf/RNmnREQF6iemtg4URAUAEwnkFDRUBW9fI7TaJFQO+NIQA4/kVAvvc3aK9URkAm5e5zfKRGQK5hhsYT7UZAfTz03a0uR0BweawZGWhHQHi3skRnnUdATuyhfazUR0Brm+JxUQ1IQISgo1UtR0hAvRx23zGCSEBPzlDc8b5IQPTeGAKA/0hAmdcRh2xISUD76xUW3JVJQMh4lEp45ElA5j+k3744SkCe6/twkJJKQJShKqbS70pAzuFa7WFdS0AWaHdIMfBLQL75DRMNNkxAUHPyIhNSTEDayeAoeatMQAX6RJ4kC01Aw2M/i6VmTUCjWG5pNbJNQEax3NJq8k1A\"},\"shape\":[63],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1082\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1083\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1078\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#fc8d59\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1079\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#fc8d59\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1080\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#fc8d59\",\"line_alpha\":0.2,\"line_width\":2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1010\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1023\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1024\",\"attributes\":{\"renderers\":\"auto\"}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1025\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1026\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left\":{\"type\":\"number\",\"value\":\"nan\"},\"right\":{\"type\":\"number\",\"value\":\"nan\"},\"top\":{\"type\":\"number\",\"value\":\"nan\"},\"bottom\":{\"type\":\"number\",\"value\":\"nan\"},\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"top_units\":\"canvas\",\"bottom_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1031\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1032\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1033\"}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1018\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1019\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1020\"},\"axis_label\":\"Population, total (in millions)\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1021\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1013\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1014\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1015\"},\"axis_label\":\"Year\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1016\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1017\",\"attributes\":{\"axis\":{\"id\":\"p1013\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1022\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1018\"}}},{\"type\":\"object\",\"name\":\"Legend\",\"id\":\"p1043\",\"attributes\":{\"location\":\"right\",\"click_policy\":\"mute\",\"items\":[{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p1044\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"BRA\"},\"renderers\":[{\"id\":\"p1040\"}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p1054\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"CHN\"},\"renderers\":[{\"id\":\"p1051\"}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p1064\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"IND\"},\"renderers\":[{\"id\":\"p1061\"}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p1074\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"RUS\"},\"renderers\":[{\"id\":\"p1071\"}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p1084\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"ZAF\"},\"renderers\":[{\"id\":\"p1081\"}]}}]}}]}}]}};\n const render_items = [{\"docid\":\"6c86f57c-0f70-4648-a27e-ed2b73c3308b\",\"roots\":{\"p1001\":\"d2127207-0be3-46fb-86fa-2b57704ab0fc\"},\"root_ids\":[\"p1001\"]}];\n root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n }\n if (root.Bokeh !== undefined) {\n embed_document(root);\n } else {\n let attempts = 0;\n const timer = setInterval(function(root) {\n if (root.Bokeh !== undefined) {\n clearInterval(timer);\n embed_document(root);\n } else {\n attempts++;\n if (attempts > 100) {\n clearInterval(timer);\n console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n }\n }\n }, 10, root)\n }\n})(window);", - "application/vnd.bokehjs_exec.v0+json": "" - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "output_notebook()\n", - "\n", - "# instantiating the figure object\n", - "p = figure(title=\"Population, total (World Bank)\", width=700, height=600)\n", - "\n", - "# colors\n", - "colors = itertools.cycle(Spectral6)\n", - "\n", - "# plotting the line graph\n", - "for column, color in zip(df.columns, colors):\n", - " p.line(\n", - " df.index,\n", - " df[column],\n", - " legend_label=column,\n", - " color=color,\n", - " line_width=2,\n", - " )\n", - "\n", - "p.legend.location = \"right\"\n", - "p.legend.click_policy = \"mute\"\n", - "p.title.text_font_size = \"12pt\"\n", - "\n", - "p.xaxis.axis_label = \"Year\"\n", - "p.yaxis.axis_label = \"Population, total (in millions)\"\n", - "\n", - "show(p)" - ] - } - ], - "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.13" - }, - "vscode": { - "interpreter": { - "hash": "b6702b69e93007336b96338c5a331192f07cedff01d36d4dcfa0f842adb718ad" - } - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/pyproject.toml b/pyproject.toml index eb967b9..4a146bb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,12 +3,16 @@ requires = ["hatchling>=1.21.0", "hatch-vcs>=0.3.0"] build-backend = "hatchling.build" [project] -name = "template" -description = "A template Python package from the World Bank Data Lab" +name = "GOSTrocks" +description = "Miscellaneous geospatial functions concerning vector, raster, and network analysis" readme = { file = "README.md", content-type = "text/markdown" } license = { file = "LICENSE" } -keywords = ["template", "reproducibility"] -authors = [{ name = "Development Data Group", email = "datalab@worldbank.org" }] +keywords = ["gostrocks", "raster", "GOST"] + +authors = [ + { name = "Benjamin P. Stewart", email = "ben.gis.stewart@gmail.com" }, + { name = "Andres Chamorro", email = "afche18@gmail.com" } +] classifiers = [ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", @@ -22,10 +26,13 @@ classifiers = [ "Intended Audience :: Developers", "Topic :: Scientific/Engineering", ] -dynamic = ["version"] +dynamic = ["dependencies", "version"] requires-python = ">=3.7" -dependencies = ["requests>=2.28.1", "pandas>=2", "pycountry>=22.3.5"] + +[tool.setuptools.dynamic] +dependencies = {file = ["requirements.txt"]} + [project.optional-dependencies] docs = [ "docutils==0.17.1", # https://jupyterbook.org/en/stable/content/citations.html?highlight=docutils#citations-and-bibliographies @@ -33,9 +40,9 @@ docs = [ ] [project.urls] -"Homepage" = "https://github.com/worldbank/template" -"Bug Reports" = "https://github.com/worldbank/template/issues" -"Source" = "https://github.com/worldbank/template" +"Homepage" = "https://github.com/worldbank/GOSTrocks" +"Bug Reports" = "https://github.com/worldbank/GOSTrocks/issues" +"Source" = "https://github.com/worldbank/GOSTrocks" [tool.codespell] skip = 'docs/_build,docs/references.bib,*.png,*.gz,*.whl' @@ -45,5 +52,8 @@ ignore-words-list = "gost," [tool.hatch.version] source = "vcs" +[tool.hatch.build.hooks.vcs] +version-file = "src/GOSTrocks/_version.py" + [tool.ruff.lint.pydocstyle] convention = "numpy" diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b9ee704 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,22 @@ +rasterio +geopandas +pandas +numexpr > 2.6.8 +numpy +pyproj +seaborn +boto3 +botocore +contextily +matplotlib +tqdm +xarray +osmnx +affine +PyOpenSSL >= 23.2 +click +Sphinx +coverage +awscli +flake8 +python-dotenv>=0.5.1 diff --git a/src/template/__init__.py b/src/GOSTrocks/__init__.py similarity index 77% rename from src/template/__init__.py rename to src/GOSTrocks/__init__.py index a535a10..4708e3e 100644 --- a/src/template/__init__.py +++ b/src/GOSTrocks/__init__.py @@ -1,7 +1,7 @@ from importlib.metadata import version, PackageNotFoundError try: - __version__ = version("datalab") + __version__ = version("GOSTrocks") except PackageNotFoundError: # package is not installed pass diff --git a/src/GOSTrocks/covid/DataDictionary_v2.json b/src/GOSTrocks/covid/DataDictionary_v2.json new file mode 100644 index 0000000..60101b3 --- /dev/null +++ b/src/GOSTrocks/covid/DataDictionary_v2.json @@ -0,0 +1,348 @@ +{ + "P1": { + "Name":"Urban_Population", + "raster_file":"WP_2020_1km_urban_pop.tif", + "vars":["SUM"], + "description":"A derivative of WorldPop 2020 population density at 1km2. This vector layer applies the newly adopted UN defiinition of Urban to the WorldPop grid. https://unstats.un.org/unsd/statcom/50th-session/ This people centric definition of Urban each grid cell is evaluated on two dimensions, the number of people in the cell must be greater than 300 and it must be contiguous with similarly populated cells in an area with an accumulated population of 5000 people." }, + "P2": { + "Name":"Demographics", + "raster_file":"WP2020_vulnerability_map.tif", + "vars":["SUM"], + "description":"This is the sum of all counts of each person in the age cohort according to the Age Incident Curve published by IHME" }, + "P3": { + "Name":"Age_incident_curve", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Derived from the Outbreak and Pandemic Preparedness team at the Institute for Health Metrics and Evaluation, University of Washington Contact: pigottdm@uw.edu https://github.com/beoutbreakprepared/nCoV2019" }, + "P4": { + "Name":"Obesity", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"The DHS Program STATcompiler makes custom tables based on demographic and health surveys in 90+ countries: https://www.statcompiler.com/en/" }, + "P5": { + "Name":"HeartDisease", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"The DHS Program STATcompiler makes custom tables based on demographic and health surveys in 90+ countries: https://www.statcompiler.com/en/" }, + "P6": { + "Name":"Diabetes?", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"The DHS Program STATcompiler makes custom tables based on demographic and health surveys in 90+ countries: https://www.statcompiler.com/en/" }, + "P7": { + "Name":"ImmuneComp", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"The DHS Program STATcompiler makes custom tables based on demographic and health surveys in 90+ countries: https://www.statcompiler.com/en/" }, + "P8": { + "Name":"Cancer", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"The DHS Program STATcompiler makes custom tables based on demographic and health surveys in 90+ countries: https://www.statcompiler.com/en/" }, + "A1": { + "Name":"Water_fountain_public", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"The DHS Program STATcompiler makes custom tables based on demographic and health surveys in 90+ countries: https://www.statcompiler.com/en/" }, + "A2": { + "Name":"Water_fountain_shared", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"The DHS Program STATcompiler makes custom tables based on demographic and health surveys in 90+ countries: https://www.statcompiler.com/en/" }, + "A3": { + "Name":"Water_toilet_public", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"The DHS Program STATcompiler makes custom tables based on demographic and health surveys in 90+ countries: https://www.statcompiler.com/en/" }, + "A4": { + "Name":"Water_toilet_shared", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"The DHS Program STATcompiler makes custom tables based on demographic and health surveys in 90+ countries: https://www.statcompiler.com/en/" }, + "A5": { + "Name":"Transport_public", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"The DHS Program STATcompiler makes custom tables based on demographic and health surveys in 90+ countries: https://www.statcompiler.com/en/" }, + "P4_fraym": { + "Name":"Obesity", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Fraym https://go.fraym.io/coviddatafraym The Fraym approach takes data from DHS and other professionally enumerated household surveys and uses machine learning to search for geospatial covariates in satellite imagery and other geostatistical datasets to disaggregate and re-aggregate as needed to cover geographically bounded area with a finer resolution estimation of the distribution of the needed indicator. " }, + "P5_fraym": { + "Name":"HeartDisease", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Fraym https://go.fraym.io/coviddatafraym The Fraym approach takes data from DHS and other professionally enumerated household surveys and uses machine learning to search for geospatial covariates in satellite imagery and other geostatistical datasets to disaggregate and re-aggregate as needed to cover geographically bounded area with a finer resolution estimation of the distribution of the needed indicator. " }, + "P6_fraym": { + "Name":"Diabetes?", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Fraym https://go.fraym.io/coviddatafraym The Fraym approach takes data from DHS and other professionally enumerated household surveys and uses machine learning to search for geospatial covariates in satellite imagery and other geostatistical datasets to disaggregate and re-aggregate as needed to cover geographically bounded area with a finer resolution estimation of the distribution of the needed indicator. " }, + "P7_fraym": { + "Name":"ImmuneComp", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Fraym https://go.fraym.io/coviddatafraym The Fraym approach takes data from DHS and other professionally enumerated household surveys and uses machine learning to search for geospatial covariates in satellite imagery and other geostatistical datasets to disaggregate and re-aggregate as needed to cover geographically bounded area with a finer resolution estimation of the distribution of the needed indicator. " }, + "P8_fraym": { + "Name":"Cancer", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Fraym https://go.fraym.io/coviddatafraym The Fraym approach takes data from DHS and other professionally enumerated household surveys and uses machine learning to search for geospatial covariates in satellite imagery and other geostatistical datasets to disaggregate and re-aggregate as needed to cover geographically bounded area with a finer resolution estimation of the distribution of the needed indicator. " }, + "A1_fraym": { + "Name":"Water_fountain_public", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Fraym https://go.fraym.io/coviddatafraym The Fraym approach takes data from DHS and other professionally enumerated household surveys and uses machine learning to search for geospatial covariates in satellite imagery and other geostatistical datasets to disaggregate and re-aggregate as needed to cover geographically bounded area with a finer resolution estimation of the distribution of the needed indicator. " }, + "A2_fraym": { + "Name":"Water_fountain_shared", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Fraym https://go.fraym.io/coviddatafraym The Fraym approach takes data from DHS and other professionally enumerated household surveys and uses machine learning to search for geospatial covariates in satellite imagery and other geostatistical datasets to disaggregate and re-aggregate as needed to cover geographically bounded area with a finer resolution estimation of the distribution of the needed indicator. " }, + "A3_fraym": { + "Name":"Water_toilet_public", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Fraym https://go.fraym.io/coviddatafraym The Fraym approach takes data from DHS and other professionally enumerated household surveys and uses machine learning to search for geospatial covariates in satellite imagery and other geostatistical datasets to disaggregate and re-aggregate as needed to cover geographically bounded area with a finer resolution estimation of the distribution of the needed indicator. " }, + "A4_fraym": { + "Name":"Water_toilet_shared", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Fraym https://go.fraym.io/coviddatafraym The Fraym approach takes data from DHS and other professionally enumerated household surveys and uses machine learning to search for geospatial covariates in satellite imagery and other geostatistical datasets to disaggregate and re-aggregate as needed to cover geographically bounded area with a finer resolution estimation of the distribution of the needed indicator. " }, + "A5_fraym": { + "Name":"Transport_public", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Fraym https://go.fraym.io/coviddatafraym The Fraym approach takes data from DHS and other professionally enumerated household surveys and uses machine learning to search for geospatial covariates in satellite imagery and other geostatistical datasets to disaggregate and re-aggregate as needed to cover geographically bounded area with a finer resolution estimation of the distribution of the needed indicator. " }, + "R12": { + "Name":"GHS-POP", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":" This spatial raster dataset depicts the distribution of population, expressed as the number of people per cell. Residential population estimates for target years 1975, 1990, 2000 and 2015 provided by CIESIN GPWv4.10 were disaggregated from census or administrative units to grid cells, informed by the distribution and density of built-up as mapped in the Global Human Settlement Layer (GHSL) global layer per corresponding epoch. https://ghsl.jrc.ec.europa.eu/ghs_pop2019.php" }, + "S1": { + "Name":"Case_Rates_by_Age_Severe?", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Derived from the Outbreak and Pandemic Preparedness team at the Institute for Health Metrics and Evaluation, University of Washington Contact: pigottdm@uw.edu https://github.com/beoutbreakprepared/nCoV2019" }, + "S2": { + "Name":"Case_Rates_by_Age_Death?", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Derived from the Outbreak and Pandemic Preparedness team at the Institute for Health Metrics and Evaluation, University of Washington Contact: pigottdm@uw.edu https://github.com/beoutbreakprepared/nCoV2019" }, + "S3": { + "Name":"Case_Rates_by_Gender_Severe?", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Derived from the Outbreak and Pandemic Preparedness team at the Institute for Health Metrics and Evaluation, University of Washington Contact: pigottdm@uw.edu https://github.com/beoutbreakprepared/nCoV2019" }, + "S4": { + "Name":"Case_Rates_by_Gender_Death?", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Derived from the Outbreak and Pandemic Preparedness team at the Institute for Health Metrics and Evaluation, University of Washington Contact: pigottdm@uw.edu https://github.com/beoutbreakprepared/nCoV2019" }, + "S5": { + "Name":"Case_Rates_Recovered", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"WHO Health Emergency Dashboard https://covid19.who.int/" }, + "S6": { + "Name":"Tests_total?", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Institute for Health Metrics and Evaluation, University of Washington: http://www.healthdata.org/covid/data-downloads" }, + "S7": { + "Name":"Tests_positive?", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"_INPUT_" }, + "S8": { + "Name":"Tests_negetive", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"_INPUT_" }, + "S9": { + "Name":"Tests_inconclusive", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"_INPUT_" }, + "C1": { + "Name":"Close_school ", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Institute for Health Metrics and Evaluation, University of Washington: http://www.healthdata.org/covid/data-downloads" }, + "C2": { + "Name":"Close_workplaces", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Thomas Hale, Sam Webster, Anna Petherick, Toby Phillips, and Beatriz Kira. (2020). Oxford COVID-19 Government Response Tracker. Blavatnik School of Government. See https://github.com/OxCGRT/covid-policy-tracker/" }, + "C3": { + "Name":"Cancel_events", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Thomas Hale, Sam Webster, Anna Petherick, Toby Phillips, and Beatriz Kira. (2020). Oxford COVID-19 Government Response Tracker. Blavatnik School of Government. See https://github.com/OxCGRT/covid-policy-tracker/" }, + "C4": { + "Name":"Limit_gathering_size", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Thomas Hale, Sam Webster, Anna Petherick, Toby Phillips, and Beatriz Kira. (2020). Oxford COVID-19 Government Response Tracker. Blavatnik School of Government. See https://github.com/OxCGRT/covid-policy-tracker/" }, + "C5": { + "Name":"Close_transit_public", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Thomas Hale, Sam Webster, Anna Petherick, Toby Phillips, and Beatriz Kira. (2020). Oxford COVID-19 Government Response Tracker. Blavatnik School of Government. See https://github.com/OxCGRT/covid-policy-tracker/" }, + "C6": { + "Name":"Stay_home_requirements", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Thomas Hale, Sam Webster, Anna Petherick, Toby Phillips, and Beatriz Kira. (2020). Oxford COVID-19 Government Response Tracker. Blavatnik School of Government. See https://github.com/OxCGRT/covid-policy-tracker/" }, + "C7": { + "Name":"Limit_movement", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Thomas Hale, Sam Webster, Anna Petherick, Toby Phillips, and Beatriz Kira. (2020). Oxford COVID-19 Government Response Tracker. Blavatnik School of Government. See https://github.com/OxCGRT/covid-policy-tracker/" }, + "C8": { + "Name":"Limit_international_travel", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Thomas Hale, Sam Webster, Anna Petherick, Toby Phillips, and Beatriz Kira. (2020). Oxford COVID-19 Government Response Tracker. Blavatnik School of Government. See https://github.com/OxCGRT/covid-policy-tracker/" }, + "E1": { + "Name":"Econ_support_debt", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Thomas Hale, Sam Webster, Anna Petherick, Toby Phillips, and Beatriz Kira. (2020). Oxford COVID-19 Government Response Tracker. Blavatnik School of Government. See https://github.com/OxCGRT/covid-policy-tracker/" }, + "E3": { + "Name":"Econ_support_econ", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Thomas Hale, Sam Webster, Anna Petherick, Toby Phillips, and Beatriz Kira. (2020). Oxford COVID-19 Government Response Tracker. Blavatnik School of Government. See https://github.com/OxCGRT/covid-policy-tracker/" }, + "E2": { + "Name":"Econ_support_income", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Thomas Hale, Sam Webster, Anna Petherick, Toby Phillips, and Beatriz Kira. (2020). Oxford COVID-19 Government Response Tracker. Blavatnik School of Government. See https://github.com/OxCGRT/covid-policy-tracker/" }, + "E4": { + "Name":"Econ_support_allies", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Thomas Hale, Sam Webster, Anna Petherick, Toby Phillips, and Beatriz Kira. (2020). Oxford COVID-19 Government Response Tracker. Blavatnik School of Government. See https://github.com/OxCGRT/covid-policy-tracker/" }, + "H1": { + "Name":"Health_engage_public", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Thomas Hale, Sam Webster, Anna Petherick, Toby Phillips, and Beatriz Kira. (2020). Oxford COVID-19 Government Response Tracker. Blavatnik School of Government. See https://github.com/OxCGRT/covid-policy-tracker/" }, + "H2": { + "Name":"Health_policy_testing", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Thomas Hale, Sam Webster, Anna Petherick, Toby Phillips, and Beatriz Kira. (2020). Oxford COVID-19 Government Response Tracker. Blavatnik School of Government. See https://github.com/OxCGRT/covid-policy-tracker/" }, + "H3": { + "Name":"Health_policy_contact_tracing ", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Thomas Hale, Sam Webster, Anna Petherick, Toby Phillips, and Beatriz Kira. (2020). Oxford COVID-19 Government Response Tracker. Blavatnik School of Government. See https://github.com/OxCGRT/covid-policy-tracker/" }, + "H4": { + "Name":"Health_support_healthcare", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Thomas Hale, Sam Webster, Anna Petherick, Toby Phillips, and Beatriz Kira. (2020). Oxford COVID-19 Government Response Tracker. Blavatnik School of Government. See https://github.com/OxCGRT/covid-policy-tracker/" }, + "H5": { + "Name":"Health_support_vaccination", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Thomas Hale, Sam Webster, Anna Petherick, Toby Phillips, and Beatriz Kira. (2020). Oxford COVID-19 Government Response Tracker. Blavatnik School of Government. See https://github.com/OxCGRT/covid-policy-tracker/" }, + "F1": { + "Name":"Hsptl_Beds", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"This data is often incomplete. Unless otherwise stated in a specific country case, this data was drawn from the Institute for Health Metrics and Evaluation, University of Washington: http://www.healthdata.org/covid/data-downloads" }, + "F2": { + "Name":"Hsptl_location", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":" World Health Organization's Public Sector Health Facilities database: https://www.who.int/malaria/areas/surveillance/public-sector-health-facilities-ss-africa/en/ The excel file itself can be directly obtained here: https://github.com/worldbank/WB_COVID_Response/wiki/Annotated-Bibliography" }, + "F3": { + "Name":"Hsptl_icu", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"This data is often incomplete. Unless otherwise stated in a specific country case, this data was drawn from the Institute for Health Metrics and Evaluation, University of Washington: http://www.healthdata.org/covid/data-downloads" }, + "F4": { + "Name":"Hsptl_respirators", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"This data is often incomplete. Unless otherwise stated in a specific country case, this data was drawn from the Institute for Health Metrics and Evaluation, University of Washington: http://www.healthdata.org/covid/data-downloads" }, + "F5": { + "Name":"Hsptl_doctors", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"This data is often incomplete. Unless otherwise stated in a specific country case, this data was drawn from the Institute for Health Metrics and Evaluation, University of Washington: http://www.healthdata.org/covid/data-downloads" }, + "F6": { + "Name":"Hsptl_nurses", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"This data is often incomplete. Unless otherwise stated in a specific country case, this data was drawn from the Institute for Health Metrics and Evaluation, University of Washington: http://www.healthdata.org/covid/data-downloads" }, + "F7": { + "Name":"Hsptl_supply_ppe", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"This data is often incomplete. Unless otherwise stated in a specific country case, this data was drawn from the Institute for Health Metrics and Evaluation, University of Washington: http://www.healthdata.org/covid/data-downloads" }, + "F8": { + "Name":"Hsptl_supply_tests", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"This data is often incomplete. Unless otherwise stated in a specific country case, this data was drawn from the Institute for Health Metrics and Evaluation, University of Washington: http://www.healthdata.org/covid/data-downloads" }, + "M12": { + "Name":"Percent_change_sentiment", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"WBG DECAT analysis of GDELT, Twitter and other social media positings intended to assess the popultion's attitude toward a particular topic, in this case compliance with Non Pharmaceutical Interventions. See Sam Fraiberger at sfraiberger@worldbank.org" }, + "R1": { + "Name":"Fraym", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Fraym https://go.fraym.io/coviddatafraym This is Fraym's assessment of the places and populations most at risk from COVID-19 based on their available data and an equal weighting of the risk factors. This model does not consider the available capacity to respond at these locations. " }, + "R3": { + "Name":"DLR", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"Deutsches Zentrum fรผr Luft- und Raumfahr (German Aerospace Center +)'s assessment of building height/volume in a given city block. This is an input to a model by Somik Lall and Maria Soppelsa, and implimented by Guarav Bhardwaj and Benjamin Stewart designed to assess the infrastructure derived limits of physical distancing relative to the population density. Contact Dr.-Ing. Mattia Marconcini mattia.marconcini@dlr.de for technical details on methods of production of the building volume assessment and Somik Lall and Ben Stewart for technical details on methods of analytical application." }, + "R4": { + "Name":"DHS", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"The DHS Program STATcompiler makes custom tables based on demographic and health surveys in 90+ countries: https://www.statcompiler.com/en/" }, + "R5": { + "Name":"Census", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"WB derivative of publically availalbe national census datasets" }, + "R6": { + "Name":"Unacast", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"_INPUT_" }, + "R7": { + "Name":"Xmode", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"_INPUT_" }, + "R8": { + "Name":"Cubiq", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"_INPUT_" }, + "R9": { + "Name":"Facebook", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"_INPUT_" }, + "R10": { + "Name":"WorldPop", + "raster_file":"WP_2020_1km.tif", + "vars":["SUM"], + "description":"Tatem, Andrew J. 2017 'WorldPop, open data for spatial demography' Scientific Data, 170004,vol. 4, Issue 1 - High resolution, contemporary data on human population distributions, their characteristics and changes over time are a prerequisite for the accurate measurement of the impacts of population growth, for monitoring changes and for planning interventions. WorldPop aims to meet these needs through the provision of detailed and open access spatial demographic datasets built using transparent approaches. The Scientific Data WorldPop collection brings together descriptor papers on these datasets and is introduced here. SN - 2052-4463 https://doi.org/10.1038/sdata.2017.4" }, + "V2": { + "Name":"PM25", + "raster_file":"_INPUT_", + "vars":["_INPUT_"], + "description":"_INPUT_" } +} diff --git a/src/GOSTrocks/covid/covid_data_extraction.py b/src/GOSTrocks/covid/covid_data_extraction.py new file mode 100644 index 0000000..ba1144a --- /dev/null +++ b/src/GOSTrocks/covid/covid_data_extraction.py @@ -0,0 +1,484 @@ +import os, sys, importlib, subprocess, copy, multiprocessing +import rasterio, geohash + +import geopandas as gpd +import pandas as pd +import numpy as np + +from shapely.geometry import Point +from shapely.wkt import loads +from rasterio import features +from collections import Counter +from multiprocessing import Pool + +try: + from . import vulnerability_mapping as vulmap + from . import misc + from . import rasterMisc as rMisc + from . import UrbanRaster as urban +except: + import vulnerability_mapping as vulmap + import misc + import rasterMisc as rMisc + import UrbanRaster as urban +''' +import vulnerability_mapping as vulmap +import misc as misc +import osmMisc as osm +import UrbanRaster as urban +''' +# https://mrc-ide.github.io/global-lmic-reports/parameters.html +# https://www.cdc.gov/mmwr/volumes/69/wr/mm6912e2.htm +vul_def = {'0-5' :0.001, + '6-10' :0.001, + '11-15':0.001, + '16-20':0.002, + '21-25':0.005, + '26-30':0.010, + '31-35':0.016, + '36-40':0.023, + '41-45':0.029, + '46-50':0.039, + '51-55':0.058, + '56-60':0.072, + '61-65':0.102, + '66-70':0.117, + '71-75':0.146, + '76-80':0.177, + '81-100':0.180} + +hnp_categories = { + 'R10': { + 'Name':'WorldPop', + 'raster_file':'WP_2020_1km.tif', + 'vars':['SUM'], + 'description':'WorldPop total population in 2020' + }, + 'P1': { + 'Name': 'Urban_Population', + 'raster_file':'WP_2020_1km_urban_pop.tif', + 'vars':['SUM'], + 'description':'WorldPop total urban population in 2020' + }, + 'P2': { + 'Name':'Demographics', + 'raster_file':'WP2020_vulnerability_map.tif', + 'vars':['SUM'], + 'description':'Total potential hospitalization load based on WorldPop demographics and published CoVID hospitalization rates' + }, + 'LC': { + 'Name':'Landcover', + 'raster_file':'LC.tif', + 'vars':['C'], + 'unqVals':[11,14,20,30,40,50,60,70,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230], + 'description':'Landcover dataset from Globcover' + } +} + +def create_fishnet(extents_file, out_folder, prefix, verbose=True): + ''' Create a 1 km fishnet inside each feature in the input extents_file + + INPUT + extents_file [string] - path to urban extents + out_folder [string path] - where output shapefiles should be written + prefix [string] - will be appended to each fidhnet shapefile + ''' + urban_extents = gpd.read_file(extents_file) + #sel_cities = urban_extents.sort_values(['Pop'], ascending=False).iloc[0:5] + sel_cities = urban_extents.sort_values(['Pop'], ascending=False) + try: + sel_cities = misc.project_UTM(sel_cities) + except: + sel_cities = sel_cities.to_crs({"init":"epsg:3857"}) + + for idx, row in sel_cities.iterrows(): + out_fishnet = os.path.join(out_folder, "%s_%s.shp" % (prefix, row['ID'])) + if not os.path.exists(out_fishnet): + b = row['geometry'].bounds + crs_num = sel_cities.crs['init'].split(":")[-1] + crs_num = int(crs_num) + misc.createFishnet(out_fishnet, b[0], b[2], b[1], b[3], 1000, 1000, crsNum=crs_num) + fishnet = gpd.read_file(out_fishnet) + fishnet = fishnet[fishnet.intersects(row['geometry'])] + fishnet = fishnet.to_crs({'init':'epsg:4326'}) + fishnet['geohash'] = fishnet['geometry'].apply(lambda x: geohash.encode(x.centroid.y, x.centroid.x)) + fishnet.to_file(out_fishnet) + if verbose: + misc.tPrint("%s: %s" % (prefix, row['ID'])) + +def create_urban_data(iso3, country_folder, country_bounds, inR, calc_urban=True, calc_hd_urban=True, verbose=False, + urb_dens=300, urb_pop=5000, hd_urb_dens=1500, hd_urb_pop=50000): + ''' Extract urban areas from gridded population data following the EC density methodology + + INPUTS: + iso3 [string] - iso3 code for country of interest + country_folder [string] - path to output folder + country_bounds [geopandas dataframe] - boundary within which to extract + inR [rasterio object] - population datasets from which country specific pop layer is extracted + [optional] calc_urban [boolean] - whether to calculate urban (lower density) extents + [optional] calc_hd_urban [boolean] - whether to calculate hd urban (higher density) extents + [optional] urb_dens/hd_urb_dens [int] - population density threshold for calculating urban areas IN THE PER PIXEL UNITS OF inR + [optional] urb_pop/hd_urb_pop [int] - total population threshold for calculating urban areas + + RETURNS: + NA - the function calculates a number of files in the folder country_folder: + -- WP_2020_1km.tif: population dataaset clipped from inR + -- urban_areas.shp: vectorization of urban areas calculation + -- urban_areas_hd.shp: vectorization of high density urban areas calculation + -- urban_fishnets/URBAN_XX.shp: a 1 km fishnet is created over the five highest population areas in urban_areas.shp + -- hd_urban_fishnets/HD_URBAN_XX.shp: a 1 km fishnet is created over the five highest population areas in hd_urban_areas.shp + ''' + + country_pop = os.path.join(country_folder, "WP_2020_1km.tif") + urban_pop = os.path.join(country_folder, "WP_2020_1km_urban_pop.tif") + hd_urban_pop = os.path.join(country_folder, "WP_2020_1km_hd_urban_pop.tif") + urb_bounds = os.path.join(country_folder, "urban_areas.shp") + hd_urb_bounds = os.path.join(country_folder, "urban_areas_hd.shp") + urban_fishnets = os.path.join(country_folder, "urban_fishnets") + hd_urban_fishnets = os.path.join(country_folder, "hd_urban_fishnets") + + # Clip pop raster + if not os.path.exists(country_pop): + rMisc.clipRaster(inR, country_bounds, country_pop) + + if not os.path.exists(urban_pop) and calc_urban: + urbanR = urban.urbanGriddedPop(country_pop) + urban_vec = urbanR.calculateUrban(densVal = urb_dens, + totalPopThresh = urb_pop, + smooth = True, + queen = False, + raster_pop = urban_pop) + urban_vec.to_file(urb_bounds) + + if not os.path.exists(hd_urban_pop) and calc_hd_urban: + urbanR = urban.urbanGriddedPop(country_pop) + urban_vec = urbanR.calculateUrban(densVal = hd_urb_dens, + totalPopThresh = hd_urb_pop, + smooth = True, + queen = True, + raster_pop = urban_pop) + urban_vec.to_file(hd_urb_bounds) + #Generate Fishnets + if not os.path.exists(urban_fishnets): + os.makedirs(urban_fishnets) + + if not os.path.exists(hd_urban_fishnets): + os.makedirs(hd_urban_fishnets) + + if calc_urban: + create_fishnet(urb_bounds, urban_fishnets, "URBAN") + if calc_hd_urban: + create_fishnet(hd_urb_bounds, hd_urban_fishnets, "HD_URBAN") + +def calculate_vulnerability(iso3, country_folder, country_bounds, pop_folder, pop_files): + ''' The hospitalization rates listed in the vul_def dictionary (at the top of this script) are + combined to create a vulnerability layer + + INPUTS + iso3 [string] - iso3 code for country of interest + country_folder [string] - path to output folder + country_bounds [geopandas dataframe] - boundary within which to extract + pop_files [list of file paths] - list of global demographic rasters which are clipped out with country_bounds + RETURNS + NA - creates a file called WP2020_vulnerability_map.tif in country_folder + ''' + + # clip out the temporary vulnerability metrics + out_vulnerability = os.path.join(country_folder, "WP2020_vulnerability_map.tif") + if not os.path.exists(out_vulnerability): + wp_files = [] + if not os.path.exists(country_folder): + os.makedirs(country_folder) + for pFile in pop_files: + curR = rasterio.open((os.path.join(pop_folder, pFile))) + out_file = os.path.join(country_folder, pFile) + if not os.path.exists(out_file): + rMisc.clipRaster(curR, country_bounds, out_file) + wp_files.append(out_file) + #Calculate vulnerability + wp_file_objects = [vulmap.wp_demographics(os.path.join(country_folder, x)) for x in wp_files] + vul = vulmap.wp_vulnerability(wp_file_objects, vul_def) + vul.calculate_vulnerability() + vul.combine_results(out_vulnerability, '') + for f in wp_files: + os.remove(f) + +def extract_osm(sel_country, out_folder, + global_osm_pbf = '/home/public/Data/GLOBAL/OSM/GLOBAL/planet-latest.osm.pbf'): + ''' Extract a national osm pbf from the global file + INPUTS + sel_country [shapely object] - extent to clip + out_folder [string folder path] - output folder for creating the osm.osm.pbf + ''' + + osm_extractor = osm.osmExtraction(osmosisCmd = "/home/wb411133/Code/Osmosis/bin/osmosis", + tempFile = '/home/wb411133/temp/osmosis.sh') + out_pbf = os.path.join(out_folder, "osm.osm.pbf") + out_roads = os.path.join(out_folder, "OSM_roads.shp") + if not os.path.exists(out_pbf): + cmds = osm_extractor.extractBoundingBox(global_osm_pbf, sel_country, out_pbf, execute=False) + subprocess.check_call(cmds.split(" ")) + if not os.path.exists(out_roads): + roads = osm.convertOSMPBF_DataFrame(out_pbf, "lines") + roads_sel = roads.loc[:,["geometry","highway","Length","osm_id"]] + roads_sel = roads_sel.loc[[not x is None for x in roads['highway']]] + roads_sel.to_file(out_roads) + +def run_zonal(admin_shapes, rasters, out_suffix='', iso3=''): + ''' Calculate zonal results for submitted admin and raster + + INPUTS + admin_shapes [geopandas] - features within which to calculate statistics + rasters [dictionary] - data dictionary containing the raster and the required information + { 'HNP_Var1':{ + 'raster_file': 'path_to_raster', + 'vars':['SUM','MEAN'], + 'description':'Lorem Ipsum' + } + } + out_suffix [string] - text to append to output zonal file + ''' + for shp in admin_shapes: + inD = gpd.read_file(shp) + out_zonal = shp.replace(".shp", "_zonal%s.csv" % out_suffix) + misc.tPrint(f"Processed: {iso3} {os.path.basename(shp)}") + write_out = False + if not os.path.exists(out_zonal): + for var_name, definition in rasters.items(): + if os.path.exists(definition['raster_file']): + write_out = True + if definition['vars'][0] == 'C': + uVals = definition['unqVals'] + res = rMisc.zonalStats(inD, definition['raster_file'], rastType='C', unqVals=uVals, reProj=True) + res = pd.DataFrame(res, columns=['LC_%s' % x for x in uVals]) + for column in res.columns: + inD[column] = res[column] + else: + # Zonal stats + res = rMisc.zonalStats(inD, definition['raster_file'], minVal=0, reProj=True) + res = pd.DataFrame(res, columns=['SUM','MIN','MAX','MEAN']) + res.columns = [f"{var_name}_{x}" for x in res.columns] + for var in definition['vars']: + inD[f"{var_name}_{var}"] = res[f"{var_name}_{var}"] + if write_out: + inD.drop(['geometry'], axis=1, inplace=True) + pd.DataFrame(inD).to_csv(out_zonal) + +def check_zonal(country_folder, remove_bad = False): + ''' Check the results of the zonal statistics + ''' + + stat_files = [] + for root, dirs, files in os.walk(country_folder): + if not "FINAL" in root: + for f in files: + if f[-4:] == ".csv": + stat_files.append(os.path.join(root, f)) + + res = {} + for stat_file in stat_files: + if "DHS" in stat_file: + good_col = "age_final_0_4_househ_SUM" + bad_col = "R10_SUM" + else: + good_col = "R10_SUM" + bad_col = "age_final_0_4_househ_SUM" + xx = pd.read_csv(stat_file) + cols = list(xx.columns) + val = 0 + if good_col in cols: + val += 1 + if bad_col in cols: + val += 10 + res[stat_file] = val + + if remove_bad: + for f, score in res.items(): + if score in [0, 10]: + os.remove(f) + + return(res) + +def combine_dhs_pop(popRaster, dhs_raster, out_file, factor=100): + ''' + INPUT + popRaster [rasterio] + dhs_raster [rasterio] + out_file [string] + [optional] factor [int] - number to divide dhs_raster (converts percentage to fraction) + ''' + inP = popRaster.read() + dhs = dhs_raster.read() + if factor != 1: + dhs = dhs / factor + dhs_pop = inP * (dhs) + + with rasterio.open(out_file, 'w', **popRaster.meta) as outR: + outR.write(dhs_pop) + +def summarize_DHS(template, dhs_files, country_folder, iso3): + ''' combine DHS data with WorldPop population and run zonal stats + + INPUT + template [string] - template raster upon which to base rasterization of DHS + dhs_files [dictionary] - defines DHS files to process {filename:geopandas} + country_folder [string to path] - folder to create output + ''' + # Process DHS data + inP = rasterio.open(template) + # get a list of unique columns in the DHS data + total_columns = 0 + try: + del(all_columns) + except: + pass + # get a list of all unique columns + for key, inD in dhs_files.items(): + cur_columns = list(inD.columns.values) + try: + all_columns = all_columns + cur_columns + except: + all_columns = cur_columns + + col_count = Counter(all_columns) + unq_columns = [key for key, value in col_count.items() if value == 1] + + dhs_rasters = {} + for key, inD in dhs_files.items(): + sel_dhs = inD.loc[inD['ISO3'] == iso3] + if sel_dhs.shape[0] > 0: + for field in inD.columns: + if field in unq_columns: + out_file = os.path.join(country_folder, f'{key}_{field}.tif') + out_file_pop = os.path.join(country_folder, f'{key}_{field}_pop.tif') + try: + # rasterize the desired field in the inputDHS data + if not os.path.exists(out_file) and not os.path.exists(out_file_pop): + rMisc.rasterizeDataFrame(inD, out_file, idField=field, templateRaster = template) + + #Multiply the rasterized data frame by the population layer + if not os.path.exists(out_file_pop): + combine_dhs_pop(inP, rasterio.open(out_file), out_file_pop, factor=100) + if os.path.exists(out_file): + os.remove(out_file) + misc.tPrint(f'{iso3}_{key}: {field}') + dhs_rasters[f'{key}_{field}'] = { + 'raster_file': f'{key}_{field}_pop.tif', + 'vars': ['SUM', 'MEAN'], + 'description': f'{key}_{field}' + } + except: + misc.tPrint(f"Error processing {key} - {field}") + return(dhs_rasters) + +def extract_data(inG, inG1, inG2, inL, inR): + country_folder = os.path.join(output_folder, iso3) + adm0_file = os.path.join(country_folder, "adm0.shp") + adm1_file = os.path.join(country_folder, "adm1.shp") + adm2_file = os.path.join(country_folder, "adm2.shp") + lc_file = os.path.join(country_folder, "LC.tif") + + if not os.path.exists(country_folder): + os.makedirs(country_folder) + country_bounds = inG.loc[inG['ISO3'] == iso3].to_crs({'init':'epsg:4326'}) + if not os.path.exists(adm0_file): + country_bounds.to_file(adm0_file) + if not os.path.exists(adm1_file): + try: + country_adm1 = inG1.loc[inG1['ISO3'] == iso3].to_crs({'init':'epsg:4326'}) + country_adm1.to_file(adm1_file) + except: + misc.tPrint("%s Could not extract ADMIN 1" % iso3) + if not os.path.exists(adm2_file): + try: + country_adm2 = inG2.loc[inG2['ISO3'] == iso3].to_crs({'init':'epsg:4326'}) + country_adm2.to_file(adm2_file) + except: + misc.tPrint("%s Could not extract ADMIN 2" % iso3) + if not os.path.exists(lc_file): + rMisc.clipRaster(inL, gpd.read_file(adm0_file), lc_file) + + calculate_vulnerability(iso3, country_folder, country_bounds, pop_folder, pop_files) + misc.tPrint("***%s Calculated Vulnerability" % iso3) + try: + create_urban_data(iso3, country_folder, country_bounds, inR, calc_urban=False) + misc.tPrint("***%s Calculated Urban Extents" % iso3) + except: + misc.tPrint("%s errored on HD clusters" % iso3) + try: + create_urban_data(iso3, country_folder, country_bounds, inR, calc_urban=True, calc_hd_urban=False) + except: + misc.tPrint("%s errored on all clusters" % iso3) + #extract_osm(country_bounds, country_folder) + #misc.tPrint("***Extracted OSM") + + +def run_all(iso3, output_folder, dhs_files): + country_folder = os.path.join(output_folder, iso3) + # extract national bounds + misc.tPrint("Processing %s" % iso3) + #summarize DHS + country_pop = os.path.join(country_folder, "WP_2020_1km.tif") + dhs_rasters = summarize_DHS(country_pop, dhs_files, country_folder, iso3) + + #Run zonal stats + cur_rasters = copy.deepcopy(hnp_categories) + for key, values in cur_rasters.items(): + values['raster_file'] = os.path.join(country_folder, values['raster_file']) + cur_rasters[key] = values + + cur_dhs = copy.deepcopy(dhs_rasters) + for key, values in dhs_rasters.items(): + values['raster_file'] = os.path.join(country_folder, values['raster_file']) + cur_dhs[key] = values + + all_shps = [] + for root, dirs, files, in os.walk(country_folder): + for f in files: + if f[-4:] == ".shp" and not "zonal" in f: + all_shps.append(os.path.join(root, f)) + + run_zonal(all_shps, cur_rasters, out_suffix="_BASE", iso3 = iso3) + misc.tPrint("***%s Calculated Base Zonal" % iso3) + run_zonal(all_shps, cur_dhs, out_suffix="_DHS", iso3 = iso3) + misc.tPrint("***%s Calculated DHS Zonal" % iso3) + +def main(): + # define the input datasets + global_bounds = "/home/public/Data/GLOBAL/ADMIN/Admin0_Polys.shp" + global_adm1 = "/home/public/Data/GLOBAL/ADMIN/Admin1_Polys.shp" + global_adm2 = "/home/public/Data/GLOBAL/ADMIN/Admin2_Polys.shp" + pop_folder = "/home/public/Data/GLOBAL/Population/WorldPop_PPP_2020/GLOBAL_1km_Demographics" + output_folder = "/home/wb411133/data/Projects/CoVID" + population_raster = "/home/public/Data/GLOBAL/Population/WorldPop_PPP_2020/ppp_2020_1km_Aggregated.tif" + lcRaster = "/home/public/Data/GLOBAL/LANDCOVER/GLOBCOVER/2015/ESACCI-LC-L4-LCCS-Map-300m-P1Y-2015-v2.0.7.tif" + dhs_folder = '/home/public/Data/PROJECTS/CoVID/DHS' + dhs_files = {} + for root, dirs, files in os.walk(dhs_folder): + for f in files: + if f[-4:] == ".shp": + dhs_files[f.replace(".shp", "")] = gpd.read_file(os.path.join(os.path.join(root, f))) + + # Read in the global datasets + pop_files = os.listdir(pop_folder) + inG = gpd.read_file(global_bounds) + inG1 = gpd.read_file(global_adm1) + inG2 = gpd.read_file(global_adm2) + inR = rasterio.open(population_raster) + inL = rasterio.open(lcRaster) + + countries = ['ARG', 'PAK', 'ZAF', 'COL', 'ZWE', 'MNG', 'SLE', 'CPV', 'KEN', 'GHA', 'AFG', 'YEM', 'ECU', 'PRY', 'MRT', 'MDV', 'KGZ', 'HTI', 'DJI', 'KHM', 'TJK', 'GMB', 'LKA', 'SEN', 'STP', 'SLV', 'VEN', 'MLI', 'RWA', 'BOL', 'TZA', 'MAR', 'IND', 'IDN', 'SDN', 'AGO', 'BEN', 'BWA', 'BFA', 'BDI', 'CMR', 'CAF', 'TCD', 'COM', 'COG', 'CIV', 'COD', 'SSD', 'ERI', 'ETH', 'GAB', 'GNB', 'GIN', 'LSO', 'LBR', 'MDG', 'MWI', 'MUS', 'MOZ', 'NAM', 'NER', 'NGA', 'SYC', 'SOM', 'SWZ', 'TGO', 'UGA', 'ZMB', 'LCA', 'PHL', 'GTM', 'BGD', 'BRA', 'MEX', 'EGY', 'UKR', 'PER', 'LAO', 'PSE', 'NPL', 'PNG', 'DZA', 'BLR', 'BTN', 'BIH', 'NIC', 'FJI', 'GEO', 'HND', 'JOR', 'MHL', 'MDA', 'MMR', 'MKD', 'PAN', 'WSM', 'SLB', 'TUN', 'TUR', 'URY', 'UZB', 'ALB', 'HRV', 'IRN', 'SRB', 'TTO', 'ATG', 'CHN', 'IRQ'] + countries = ['EGY','PHL','BGD'] + countries = set(countries) + nCountries = len(countries) + idx = 0 + all_commands = [] + for iso3 in countries: + all_commands.append([iso3, output_folder, dhs_files]) + + with Pool(round(multiprocessing.cpu_count() * 0.8)) as p: + res = p.starmap(run_all, all_commands) + +if __name__ == "__main__": + main() + diff --git a/src/GOSTrocks/covid/vulnerability_mapping.py b/src/GOSTrocks/covid/vulnerability_mapping.py new file mode 100644 index 0000000..d23f7f6 --- /dev/null +++ b/src/GOSTrocks/covid/vulnerability_mapping.py @@ -0,0 +1,84 @@ +import sys, os +import rasterio + +import numpy as np + + +class wp_demographics(object): + def __init__(self, wp_file): + self.wp_file = wp_file + self.age = os.path.basename(wp_file).split("_")[2] + self.gender = os.path.basename(wp_file).split("_")[1] + self.country = os.path.basename(wp_file).split("_")[0] + self.raster = rasterio.open(wp_file) + def __str__(self): + return(f"{self.country} - {self.gender} - {self.age}") + + +class wp_vulnerability(object): + def __init__(self, wp_files, vulnerability_definition): + ''' Process the wp demographic information into a single map of vulnerability + + INPUT + wp_files [list of wp_demographics] + vulnerability [dictionary of definitions] + ''' + self.wp_files = wp_files + self.v_def = vulnerability_definition + #classify wp_files into categories + vul_files = {} + for key, value in vulnerability_definition.items(): + min_val = int(key.split("-")[0]) + max_val = int(key.split("-")[1]) + for f in wp_files: + #print(f'{f.age}: {min_val}') + if (int(f.age) > min_val) and (int(f.age) <= max_val): + try: + vul_files[key].append(f) + except: + vul_files[key] = [f] + self.vul_files = vul_files + + def calculate_total_pop(self): + vul_results = {} + for key, values in self.vul_files.items(): + for wp in values: + curR = wp.raster.read() + try: + final = final + curR + except: + final = curR + self.total_pop = final + + def calculate_vulnerability(self): + vul_results = {} + for key, values in self.vul_files.items(): + vul_value = self.v_def[key] + for wp in values: + curR = wp.raster.read() + curR = curR * vul_value + try: + vul_results[key] = vul_results[key] + curR + except: + vul_results[key] = curR + self.vul_res = vul_results + + def combine_results(self, out_vulnerability='', out_pop=''): + for key, values in self.vul_res.items(): + for v in values: + try: + final = final + v + except: + final = v + final[final<0] = np.nan + if out_vulnerability != '': + with rasterio.open(out_vulnerability, 'w', **self.wp_files[0].raster.meta) as outR: + outR.write_band(1, final) + else: + return(final) + + if out_pop != '': + with rasterio.open(out_pop, 'w', **self.wp_files[0].raster.meta) as outR: + outR.write(self.total_pop) + + \ No newline at end of file diff --git a/src/GOSTrocks/dataMisc.py b/src/GOSTrocks/dataMisc.py new file mode 100644 index 0000000..ac47a6c --- /dev/null +++ b/src/GOSTrocks/dataMisc.py @@ -0,0 +1,70 @@ +import json, urllib +import boto3 + +import geopandas as gpd +import pandas as pd + +from botocore.config import Config +from botocore import UNSIGNED + + +def aws_search_ntl(bucket='globalnightlight', prefix='composites', region='us-east-1', unsigned=True, verbose=False): + """get list of nighttime lights files from open AWS bucket - https://registry.opendata.aws/wb-light-every-night/ + + :param bucket: bucket to search for imagery, defaults to 'globalnightlight' + :type bucket: str, optional + :param prefix: prefix storing images. Not required for LEN, defaults to 'composites' + :type prefix: str, optional + :param region: AWS region for bucket, defaults to 'us-east-1' + :type region: str, optional + :param unsigned: if True, search buckets without stored boto credentials, defaults to True + :type unsigned: bool, optional + :param verbose: print additional support messages, defaults to False + :type verbose: bool, optional + """ + if unsigned: + s3client = boto3.client('s3', config=Config(signature_version=UNSIGNED)) + else: + s3client = boto3.client('s3') + + # Loop through the S3 bucket and get all the keys for files that are .tif + more_results = True + loops = 0 + good_res = [] + while more_results: + if verbose: + print(f"Completed loop: {loops}") + if loops > 0: + objects = s3client.list_objects_v2(Bucket=bucket, Prefix=prefix, ContinuationToken=token) + else: + objects = s3client.list_objects_v2(Bucket=bucket, Prefix=prefix) + more_results = objects['IsTruncated'] + if more_results: + token = objects['NextContinuationToken'] + loops += 1 + for res in objects['Contents']: + if res['Key'].endswith('avg_rade9.tif') and ("slcorr" in res['Key']): + good_res.append(f"https://globalnightlight.s3.amazonaws.com/{res['Key']}") + + return(good_res) + +def get_geoboundaries(iso3, level, geo_api = "https://www.geoboundaries.org/api/current/gbOpen/{iso3}/{adm}/"): + """ Download boundaries dataset from geobounadries + + :param iso3: ISO3 code of country to download + :type iso3: str + :param level: Admin code to download in format of "ADM1" or "ADM2" + :type level: str + :return: spatial data representing the administrative boundaries + :rtype: gpd.GeoDataFrame + """ + cur_url = geo_api.format(iso3=iso3, adm=level) + try: + with urllib.request.urlopen(cur_url) as url: + data = json.load(url) + geo_data = gpd.read_file(data['gjDownloadURL']) + return(geo_data) + except: + all_url = geo_api.format(iso3=iso3, adm='ALL') + raise(ValueError(f"Cannot find admin dataset {cur_url}. Check out {all_url} for details on what is available")) + \ No newline at end of file diff --git a/src/GOSTrocks/ghslMisc.py b/src/GOSTrocks/ghslMisc.py new file mode 100644 index 0000000..13cd64d --- /dev/null +++ b/src/GOSTrocks/ghslMisc.py @@ -0,0 +1,67 @@ +import sys, os, inspect +import rasterio + +import pandas as pd +import numpy as np +import xarray as xr +import matplotlib.pyplot as plt + +from GOSTRocks.misc import tPrint + +curPath = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0])) +if not curPath in sys.path: + sys.path.append(curPath) + + + +def combine_ghsl_annual(ghsl_files, built_thresh=0.1, ghsl_files_labels=[], out_file = ''): + """_summary_ + + :param ghsl_files: list of ghsl annual files to process + :type ghsl_files: list of strings (paths to ghsl files) + :param built_thresh: minimum percetn built to be considered bult, defaults to 0.1 which is 10% + :type built_thresh: float, optional + :param ghsl_files_labels: list of numbers to define values in output raster, defaults to [] which means numbers will be extracted from the files. + :type ghsl_files_labels: list of ints + :param out_file: location to write output integer file, defaults to '' which does not write anything + :type out_file: str, optional + :returns: list of ghsl values and rasterio profile + :rtype: list of [numpy array, dictionary] + """ + + # open all the ghsl files, extract data and labels + ghsl_rasters = [] + ghsl_years = [] + idx = 0 + for ghsl_file in ghsl_files: + cur_r = rasterio.open(ghsl_file) + out_meta = cur_r.profile.copy() + cur_d = cur_r.read()[0,:,:] + cur_d[cur_d == cur_r.profile['nodata']] = 0 + if len(ghsl_files_labels) > 0: + cur_year = ghsl_files_labels[idx] + cur_year = ghsl_file.split("_")[-7][1:] + + # Convert built area to dataset with single value of the current year + cur_d = ((cur_d >= built_thresh) * int(cur_year)).astype(float) + cur_d[cur_d == 0] = np.nan + + ghsl_rasters.append(cur_d) + ghsl_years.append(cur_year) + + tPrint(f"*** {idx} completed {cur_year}") + idx += 1 + + # stack the ghsl files + all_ghsl = np.dstack(ghsl_rasters) + ghsl_final = np.nanmin(all_ghsl, axis=2) + + ghsl_int = ghsl_final.astype(int) + ghsl_int[ghsl_int < 0] = int(out_meta['nodata']) + + # write output + if out_file != '': + with rasterio.open(out_file, 'w', **out_meta) as out_r: + out_r.write_band(1, ghsl_int) + + return([ghsl_int, out_meta]) diff --git a/src/GOSTrocks/infra/aggregator.py b/src/GOSTrocks/infra/aggregator.py new file mode 100644 index 0000000..20ddd6b --- /dev/null +++ b/src/GOSTrocks/infra/aggregator.py @@ -0,0 +1,174 @@ +''' +The following module contains a number of functions to aggregate geospatial outputs into tables for InfraSAP analytics. +''' +import geopandas as gpd +import pandas as pd +import rasterio as rio +from rasterio import features +from rasterstats import zonal_stats +import numpy as np +from shapely.wkt import loads + +def rasterize_gdf(inD, field, template, outFile=None, nodata=np.nan): + ''' Convert geopandas geo data frame to raster of equal size/res to template raster + + INPUT + inD [ geopandas data frame / path ] + outFile [ string ] - path to save output raster + field [ string ] - field to rasterize + template [ string ] - path to template raster + nodata [ int ] - value for no data + + RETURNS + Raster file. If no outFile is specified, the function returns burned features as numpy array + ''' + raster_template = rio.open(template) + # get info from template file + xRes = raster_template.res[1] + yRes = raster_template.res[0] + trans = raster_template.transform + x_pixels = raster_template.shape[1] + y_pixels = raster_template.shape[0] + raster_template.close() + + shapes = ((row.geometry,row[field]) for idx, row in inD.iterrows()) + burned = features.rasterize(shapes=shapes, fill=nodata, out_shape=raster_template.shape, transform=trans) + burned = burned.astype(str(inD[field].dtype)) + + if outFile: + with rio.open( + outFile, 'w', driver = 'GTiff', + height = y_pixels, width = x_pixels, + count=1, dtype=str(inD[field].dtype), + crs=raster_template.crs, + transform=trans, nodata=nodata + ) as new_dataset: + new_dataset.write_band(1, burned) + else: + return burned + +def pop_weighted_average(target, data_raster, pop_raster, new_field, table=None): + '''Calculate population weighted average from a raster dataset to a target shapefile + + INPUT + target [ GDF ] - Target geo data frame + data_raster [ path ] + pop_raster [ path ] + new_field [ string ] - + + RETURNS + Target GDF with new fields + ''' + # Load inputs + if type(target) == str: + target = gpd.read_file(target) + + pop = rio.open(pop_raster) + pop_crs = pop.crs.to_string() + pop_array = pop.read(1, masked=True) + + if pop_crs!=target.crs.to_string(): + target = target.to_crs(pop_crs) + + # Calculate weights + zs_sum_pop = pd.DataFrame(zonal_stats(target, pop_array, affine=pop.transform, stats='sum', nodata=pop.nodata)).rename(columns={'sum':'pop_sum'}) + target_temp = target.join(zs_sum_pop) + pop_sum_array = rasterize_gdf(inD=target_temp, field='pop_sum',template=pop_raster) + weights = pop_array/pop_sum_array + + # Apply weights + data = rio.open(data_raster).read(1, masked=True) + data_weighted = weights*data + + zs_sum_data = pd.DataFrame(zonal_stats(target, data_weighted.filled(), affine=pop.transform, stats='sum', nodata=pop.nodata)).rename(columns={'sum':new_field}) + + if table is not None: + table = table.join(zs_sum_data) + return table + else: + target = target.join(zs_sum_data) + return target + +def pop_weighted_average_national(data_raster, pop_raster, label, table=None): + '''Calculate population weighted average from a raster dataset to a target shapefile + + INPUT + data_raster [ path ] + pop_raster [ path ] + new_field [ string ] - + + RETURNS + Target GDF with new fields + ''' + pop = rio.open(pop_raster) + pop_crs = pop.crs.to_string() + pop_array = pop.read(1, masked=True) + + # Calculate weights + pop_sum_array = pop_array.sum() + weights = pop_array/pop_sum_array + + # Apply weights + data = rio.open(data_raster).read(1, masked=True) + data_weighted = weights*data + + sum_data = data_weighted.sum() + results = pd.DataFrame(data = [sum_data], index = [label], columns = ['pop weighted average']) + if table is not None: + table = pd.concat([table, results]) + return table + else: + return results + +def calculate_access_percentages(OD, target, dest_type, rural=False, urban_extents=None, pop_threshold=None, thresholds=[0,30,60,120,180,240,300,360,2000], capital=None): + + if type(target) == str: + target = gpd.read_file(target).reset_index(drop=True) + if type(OD) == str: + OD = pd.read_csv(OD, header=[0,1], index_col=0) + if type(urban_extents) == str: + urban_extents = gpd.read_file(urban_extents) + + origins_geom = OD['origin'][['geometry']].copy() + origins_geom.loc[:,'geometry'] = origins_geom['geometry'].apply(lambda x: loads(x)) + origins_geom = gpd.GeoDataFrame(origins_geom, crs = 'EPSG:4326', geometry='geometry') + + origins_sj = gpd.sjoin(origins_geom, target[['geometry']], how='left', op='intersects') + OD.loc[:,('origin','target_idx')] = origins_sj['index_right'] + + if rural: + origins_sj2 = gpd.sjoin(origins_geom, urban_extents, how='left', op='intersects') + OD.loc[:,('origin','rural')] = origins_sj2['index_right'].apply(lambda x: 1 if pd.isna(x) else 0) + OD = OD.loc[OD[('origin','rural')] == 1].copy() + + OD_dest = OD[dest_type] + if pop_threshold: + major_cities = [str(x) for x in urban_extents.loc[urban_extents.Pop>=pop_threshold].index] + OD_dest = OD_dest.loc[:,major_cities] + if capital: + OD_dest = OD_dest.loc[:,[capital]] + + min_df = OD['origin'].join(pd.DataFrame(OD_dest.min(axis=1), columns=["tt_min"])) # .apply(lambda x: (x/60)) + min_df = min_df.loc[~pd.isna(min_df.target_idx)] + min_df.loc[:,"target_idx"] = min_df.target_idx.astype(int) + min_df.loc[:,'tt_min_cut'] = pd.cut(min_df.tt_min, bins=thresholds) + + summary = min_df.groupby(['target_idx','tt_min_cut'])[['pointid']].sum().unstack().fillna(0) + summary.columns = summary.columns.get_level_values(1) + summary_pct = summary.apply(lambda x: x/(summary.sum(axis=1))).fillna(0) +# summary_pct.columns = summary_pct.columns.get_level_values(1) + results = target.join(summary_pct).join(summary, rsuffix=' pop') + + return results + +def agregate_to_country(summary, indicator, table=None): + + pop_cols = summary.columns[['pop' in x for x in summary.columns]] + national = summary[pop_cols].sum(axis=0) + national_pct = pd.DataFrame(national.apply(lambda x: x/(national.sum())), columns=[indicator]).transpose() + + if table is not None: + table = pd.concat([table, national_pct]) + return table + else: + return national_pct \ No newline at end of file diff --git a/src/GOSTrocks/infra/gsm_rasterizer.py b/src/GOSTrocks/infra/gsm_rasterizer.py new file mode 100644 index 0000000..3af6d1f --- /dev/null +++ b/src/GOSTrocks/infra/gsm_rasterizer.py @@ -0,0 +1,97 @@ +import os, sys, importlib +import rasterio, affine + +import geopandas as gpd + +from rasterio import features +from affine import Affine +from shapely.geometry import box + +class gsm_rasterizer(object): + def __init__(self, gsm_files, out_folder): + ''' Used to open, process, and extract GSM coverage files on a country by country basis + + :param gsm_files: list of string paths defining the GSM coverage data + ''' + raw_gsm = {} + for f in gsm_files: + gsm_name = os.path.basename(f).replace(".shp", "") + raw_gsm[gsm_name] = f + self.gsm_files = raw_gsm + self.out_folder = out_folder + if not os.path.exists(self.out_folder): + os.makedirs(out_folder) + + def initial_read_in(self, gsm_files=[]): + if len(gsm_files) == 0: + gsm_files = self.gsm_files + gsm_data = {} + + for key, value in gsm_files.items(): + gsm_data[key] = gpd.read_file(value) + + self.gsm_data = gsm_data + + def get_exact_shape(self, x, boundary): + if boundary.contains(x): + return(x) + else: + try: + return(boundary.intersection(x)) + except: + x = x.buffer(0) + return(boundary.intersection(x)) + + + def extract_country_vectors(self, iso3, global_data, out_folder = ""): + country_data = global_data[global_data['ISO3'] == iso3] + sample_key = list(self.gsm_data.keys())[0] + if country_data.crs != self.gsm_data[sample_key].crs: + country_data = country_data.to_crs(self.gsm_data[sample_key].crs) + if out_folder == "": + out_folder = self.out_folder + self.country_data = country_data + + c_shp = box(*country_data.total_bounds) + self.c_shp = c_shp + out_gsm_files = [] + + for key, gsm in self.gsm_data.items(): + out_file = os.path.join(out_folder, "%s.shp" % key) + out_gsm_files.append(out_file) + if not os.path.exists(out_file): + select = gsm[gsm.intersects(c_shp)] + if select.shape[0] > 0: + # clip geometries for features to actual boundary + select['geometry'] = select['geometry'].apply(lambda x: self.get_exact_shape(x, c_shp)) + select.to_file(out_file) + else: + pass + self.out_gsm_files = out_gsm_files + + def rasterize_gsm_vectors(self): + for vec_file in self.out_gsm_files: + if os.path.exists(vec_file): + gsmD = gpd.read_file(vec_file) + self.rasterize_gsm(gsmD, vec_file.replace(".shp", ".tif")) + + def rasterize_gsm(self, gsm, out_tif, cell_width = 0.01): + bounds = gsm.total_bounds + width_cells = int(round((bounds[2] - bounds[0]) / cell_width)) + height_cells = int(round(((bounds[3] - bounds[1]) / cell_width))) + cAffine = affine.Affine(cell_width, 0, bounds[0], 0, cell_width*-1, bounds[3]) + cMeta = {'count':1, 'crs': gsm.crs, 'dtype':'uint8', 'affine':cAffine, 'driver':'GTiff', + 'transform':cAffine, + 'height':height_cells, 'width':width_cells} + shapes = ((row.geometry,1) for idx, row in gsm.iterrows()) + with rasterio.open(out_tif, 'w', **cMeta) as out: + burned = features.rasterize(shapes=shapes, fill=0., + out_shape=(cMeta['height'], cMeta['width']), + transform=out.transform) + burned = burned.astype(cMeta['dtype']) + out.write_band(1, burned) + + + + + diff --git a/src/GOSTrocks/infra/infra_helper.py b/src/GOSTrocks/infra/infra_helper.py new file mode 100644 index 0000000..6915122 --- /dev/null +++ b/src/GOSTrocks/infra/infra_helper.py @@ -0,0 +1,20 @@ +import os, sys, time, subprocess, argparse, logging + +import geopandas as gpd +import pandas as pd + +from shapely.geometry import box, LineString, Point + +def extract_power_plants(power_plants_database, country_bounds): + pp_d = pd.read_csv(power_plants_database) + pp_geom = [Point(x) for x in zip(pp_d['longitude'], pp_d['latitude'])] + pp_d = gpd.GeoDataFrame(pp_d, geometry=pp_geom, crs={'init':'epsg:4326'}) + + selected_pp = pp_d[pp_d.intersects(country_bounds.unary_union)] + return(selected_pp) + + +def extract_transmission_lines(grid_line_file, out_bounds): + lines = gpd.read_file(grid_line_file) + sel_lines = lines[lines.intersects(out_bounds.unary_union)] + return(sel_lines) \ No newline at end of file diff --git a/src/GOSTrocks/infra/mapbox_helper.py b/src/GOSTrocks/infra/mapbox_helper.py new file mode 100644 index 0000000..b4defc4 --- /dev/null +++ b/src/GOSTrocks/infra/mapbox_helper.py @@ -0,0 +1,214 @@ +import json, sys, os, time, argparse, logging +import shapely + +import pandas as pd +import numpy as np +import urllib.request as url + +### README +### This code has been adpated from the earlier Market Access tools written by Charles Fox. +### Some simple adjustments were made to work with the InfraSAP inputs, but I have not had enough time to re-write this as it's quite complicated. + +def CreateODMatrix(input_df, input_df2, lat_name = 'Lat', lon_name = 'Lon', UID = 'ID', + Pop = 'Pop', call_type = 'OSRM', rescue = 0, rescue_num = 0, MB_Toke = '', + sleepTime = 5, osrmHeader = ''): + ''' + TODO: make the function flexible for MapBox endpoint - add back MB token / different formatting + ''' +# ffpath = os.path.dirname(infile) + start = time.time() + print('\nChosen server: %s\n\nStart time: %s' % (call_type, time.ctime(start))) +# print('Origins: %s' % infile) +# print('Destinations: %s\n' % infile_2) + + # Save settings + save_rate = 5 + def save(returns, j, i, numcalls, rescue_num): + elapsed_mins = (time.time() - start)/60 + elapsed_secs = (time.time() - start)%60 + total = ((numcalls / float(i)) * (time.time() - start)/60.0) + remaining = total - elapsed_mins + print ('\n______________________________________\n') + print ('\nSave point %s. Running for: %d minutes %d seconds' % (j, elapsed_mins, elapsed_secs)) + print ('\ncalls completed: %d of %d. Est. run time: %d minutes. Time remaining: %d' % (i-1, numcalls, total, remaining)) + print ('\npercentage complete: %d percent' % (((i-1) / float(numcalls)*100))) + print ('\n______________________________________\n') + try: + df = pd.concat(returns) + except: + df = returns + curOutput = os.path.join(ffpath,'temp_file_%d.csv' % rescue_num) + df.to_csv(curOutput) + + + # Function for calling OSRM server. + def Call(O_list, D_list, i, O_IDs, D_IDs, header): + # Convert origins to HTTP request string + Os = ';'.join(str(coord).replace("'", "").replace(";", "") for coord in O_list) + # Destinations to HTTP request string + Ds = ';'.join(str(coord).replace("'", "").replace(";", "") for coord in D_list) + # Join them together + data = Os+';'+Ds + + # Define which coords in data string are origins, and which are destinations + sources = ['%d' % x for x in range(0,len(O_list))] + sources = ';'.join(str(x).replace("'", "") for x in sources) + lenth = len(O_list)+len(D_list) + destinations = ['%d' % x for x in range(len(O_list),lenth)] + destinations = ';'.join(str(x).replace("'", "") for x in destinations) + + # Build request string + request = header+data+'?sources='+sources+'&destinations='+destinations+'?&access_token='+MB_Toke + # Pass request to interweb + + try: + r = url.urlopen(request) + except: + print(request) + time.sleep(5) + r = url.urlopen(request) + + # Error handle + try: + # Convert Bytes response to readable Json + MB_TelTest_json = json.loads(r.read().decode('utf-8')) + data_block = MB_TelTest_json['durations'] + except: + data_block = 'null' + + # Build df from JSON + #sources_label = [str(i['location']) for i in MB_TelTest_json['sources']] + #dest_label = [str(i['location']) for i in MB_TelTest_json['destinations']] + sources_label = O_IDs + dest_label = D_IDs + chunk = pd.DataFrame(data = data_block, columns = dest_label, index = sources_label) + # Convert to minutes, stack 2D array to 1D array + chunk = chunk.stack(level =-1) + chunk.columns = ['O','D','DIST'] + return(chunk) + + # Generate appropriately split source and destination lists + def split_and_bundle(in_list,break_size): + new_list = [] + for i in range (0,(int(max(len(in_list)/break_size,1)))): + upper = (i+1) * break_size + lower = (upper - break_size) + objs = in_list[lower:upper] + new_list.append(objs) + if len(in_list) > break_size: + rem = len(in_list) % break_size + if rem > 0: + final = upper+rem + new_list.append(in_list[upper:final]) + return new_list + + # File Import for sources file +# input_df = pd.read_csv(infile) + input_df['source_list'] = input_df[lon_name].map(str).str.cat(input_df[lat_name].map(str), sep = ',') + input_df['source_list'] = input_df['source_list']+';' + source_list = input_df['source_list'].values.tolist() + source_UIDs = input_df[UID].values.tolist() + #input_df['source_point'] = input_df.apply(lambda x: Point(x[lon_name],x[lat_name]), axis = 1) + #source_points = input_df['source_point'].tolist() + + # Look to import separate file for destinations; if not, set destinations = sources +# input_df2 = pd.read_csv(infile_2) + input_df2['dest_list'] = input_df2[lon_name].map(str).str.cat(input_df2[lat_name].map(str), sep = ',') + input_df2['dest_list'] = input_df2['dest_list']+';' + dest_list = input_df2['dest_list'].values.tolist() + dest_UIDs = input_df2[UID].values.tolist() + + if call_type == 'MBT' : + sources_list = split_and_bundle(source_list, 5) + dests_list = split_and_bundle(dest_list, 5) + sources_UIDs = split_and_bundle(source_UIDs, 5) + dests_UIDs = split_and_bundle(dest_UIDs, 5) + elif call_type == 'MB'or call_type == 'OSRM': + sources_list = split_and_bundle(source_list, 12) + dests_list = split_and_bundle(dest_list, 13) + sources_UIDs = split_and_bundle(source_UIDs, 12) + dests_UIDs = split_and_bundle(dest_UIDs, 13) + else: + pass + + # Run function call across the O-D matrix; output is 'df' + returns = [] + numcalls = (len(sources_list) * len(dests_list)) + s , d = sources_list, dests_list + i, j = 1 + (rescue * len(sources_list)), 1 + rescue + + ### Making Calls + if call_type == 'Euclid': + df = EuclidCall(source_list,dest_list,source_points,dest_points) + else: + if rescue > 0: + s = s[rescue:] # possibly rescue -1 + sources_UIDs = sources_UIDs[rescue:] + print('source list: %s' % len(source_list)) + print('sources list: %s' % len(sources_list)) + print('dest list: %s' % len(dest_list)) + print('dests list: %s' % len(dests_list)) + numcalls_rem = (len(s) * len(d)) + print('\nEstimated remaining calls to chosen server: %d\n' % numcalls_rem) + print('save points will occur every %d calls\n' % (len(dests_list))) + if sleepTime > 0: + time.sleep(sleepTime) + for O_list in s: + O_IDs = sources_UIDs[s.index(O_list)] + for D_list in d: + if sleepTime > 0: + time.sleep(sleepTime) + D_IDs = dests_UIDs[d.index(D_list)] + if call_type == 'MB': + header = 'https://api.mapbox.com/directions-matrix/v1/mapbox/driving/' + elif call_type == 'MBT': + header = 'https://api.mapbox.com/directions-matrix/v1/mapbox/driving-traffic/' + elif call_type == 'OSRM': + header = 'http://router.project-osrm.org/table/v1/driving/' + if osrmHeader != '': + header = osrmHeader + try: + # prevent server annoyance + print('Call to OSRM server number: %d of %s' % (i, numcalls_rem)) + returns.append(Call(O_list,D_list,i,O_IDs,D_IDs, header)) + i += 1 + j += 1 + except: + logging.warning("Error Processing OSRM for i:%s and j:%s" % (i, j)) + save(returns, j, i, numcalls, rescue_num) + try: + df = pd.concat(returns) + except: + df = returns + + # re-attach the population of origins and destinations, prep dataframe + all_matrices = [] + if rescue_num > 0: + for r in range(0,rescue_num): + rescued_matrix = pd.read_csv(os.path.join(ffpath,'temp_file_%d.csv' % (r)),header=None) + rescued_matrix.columns = ['O_UID','D_UID','DIST'] + all_matrices.append(rescued_matrix) + df = df.reset_index() + df.columns = ['O_UID','D_UID','DIST'] + all_matrices.append(df) + new = pd.concat(all_matrices) + new = new.set_index('O_UID') + new['DIST'] = new['DIST'].apply(pd.to_numeric) + popdf = input_df[[UID,Pop]].set_index(UID) + new['O_POP'] = popdf[Pop] + new = new.reset_index() + new = new.set_index('D_UID') + if dest_list == source_list: + new['D_POP'] = popdf[Pop] + new = new.reset_index() + else: + popdf_dest = input_df2[[UID,Pop]].set_index(UID) + new['D_POP'] = popdf_dest[Pop] + new = new.reset_index() + new['O_UID'] = new['O_UID'].astype(str) + new['D_UID'] = new['D_UID'].astype(str) + new['combo'] = new['O_UID']+'_X_'+new['D_UID'] + new = new.drop_duplicates('combo') + new = new.drop(['combo'], axis = 1) + + return new \ No newline at end of file diff --git a/src/GOSTrocks/infra/process_flows.py b/src/GOSTrocks/infra/process_flows.py new file mode 100644 index 0000000..9dfaea4 --- /dev/null +++ b/src/GOSTrocks/infra/process_flows.py @@ -0,0 +1,196 @@ +import sys, os + +import pandas as pd +import geopandas as gpd +from geographiclib.geodesic import Geodesic +from shapely.geometry import Point, LineString + +def get_centroid(iso,boundaries): + try: + selected_country = boundaries.loc[boundaries['ISO3'] == iso] + if selected_country.shape[0] == 1: + return(selected_country.iloc[0]['geometry']) + elif selected_country.shape[0] > 1: + selected_country = selected_country.sort_values('Shape_Area', ascending=False) + return(selected_country.iloc[0]['geometry']) + else: + return(None) + except: + return(None) + +def generate_great_circle(from_pt, to_pt, interim_steps=15): + ''' + ''' + geod = Geodesic.WGS84 + g = geod.Inverse(from_pt.x, from_pt.y, to_pt.x, to_pt.y) + l = geod.Line(g['lat1'], g['lon1'], g['azi1']) + num = interim_steps # 15 intermediate steps + list_of_points = [from_pt] + for i in range(num+1): + pos = l.Position(i * g['s12'] / num) + list_of_points.append(Point(pos['lat2'], pos['lon2'])) + list_of_points.append(to_pt) + return(LineString(list_of_points)) + +def generate_line_string(row, type='normal'): + try: + if type == 'normal': + if row['Trade Flow'] == "Export": + return(LineString([row['Reporter_Pt'], row['Partner_Pt']])) + else: + return(LineString([row['Partner_Pt'], row['Reporter_Pt']])) + elif type == 'great': + if row['Trade Flow'] == "Export": + return(generate_great_circle(row['Reporter_Pt'], row['Partner_Pt'])) + else: + return(generate_great_circle(row['Partner_Pt'], row['Reporter_Pt'])) + + except: + #print("Error processing %s and %s" % (row['Reporter ISO'], row['Partner ISO'])) + return(None) + +class comtrade_flow(object): + ''' Used to process comtrade flows of energy (etc.) trade flows between countries + + :param: comtrade_csv - string path to the csv containing the raw comtrade results + :param: type - string describing the type of comtrade + + ''' + + def __init__(self, comtrade_csv, type, + good_columns = ['Qty Unit Code','Year','Trade Flow','Reporter ISO', 'Partner ISO', 'Commodity', 'Qty', 'Trade Value (US$)','Reporter_Pt', 'Partner_Pt', 'TOE'] + ): + ''' + initiates the comtrade_flow object, see help(comtrade_flow) for more information + ''' + self.type = type + self.csv_file = comtrade_csv + self.type = type + self.good_columns = good_columns + self.raw_data = gpd.read_file(self.csv_file) + self.raw_data.crs = {'init':'epsg:4326'} + + def initialize(self, good_quantity_code, inB, line_type="normal"): + ''' + Read in comtrade data, filter data without units, etc. + + :param: good_quantity_code - array of numbers describing the values in the column 'Qty Unit Code' that are acceptable + :param: inB - geopandas data frame of national centroids. Must contain columns "ISO3" and "geometry" + :param: line_type - connection type between flows. Can be set to "great" to generate great circles + ''' + + good_quantity_code = [str(x) for x in good_quantity_code] + inD = self.raw_data + for n_field in ['Trade Value (US$)', 'Qty', 'TOE']: + try: + inD[n_field] = inD[n_field].astype(float) + except: + inD[n_field] = inD[n_field].replace('','0').astype(float) + try: + inD[n_field] = inD[n_field].astype(float) + except: + inD[n_field] = inD[n_field].replace('','0').astype(float) + # filter out bad data + if len(good_quantity_code) > 0: + inD = inD.loc[inD['Qty Unit Code'].isin(good_quantity_code), self.good_columns] + + #Collapse commodities into single rows + inD = inD.groupby(['Reporter ISO', 'Partner ISO', 'Year', 'Trade Flow'])['Qty', 'Trade Value (US$)','TOE'].sum().reset_index() + + inD['Reporter_Pt'] = inD['Reporter ISO'].apply(lambda x: get_centroid(x, inB)) + inD['Partner_Pt'] = inD['Partner ISO'].apply(lambda x: get_centroid(x, inB)) + + #generate country flows geometry + country_flows = inD.loc[inD['Partner ISO'] != "WLD"] + country_flows['geometry'] = country_flows.apply(lambda x: generate_line_string(x, line_type), axis=1) + country_summary = inD.loc[inD['Partner ISO'] == "WLD"] + + # store data + self.complete_data = inD + self.country_flows = country_flows + self.country_summary = country_summary + + def save_simple_layers(self, out_folder, out_type="SHP"): + ''' + Extract the most important layers from the country_flows and country_summary + and save to disk in order to put on GIM + ''' + if not os.path.exists(out_folder): + os.makedirs(out_folder) + + self.clean_fields() + self.country_summary['Value per unit'] = self.country_summary['Trade Value (US$)'] / self.country_summary['Qty'] + self.country_flows['Value per unit'] = self.country_flows['Trade Value (US$)'] / self.country_flows['Qty'] + + + # Summarize country summaries + agg = self.country_summary.groupby(['Reporter ISO', "Trade Flow"]) + most_recent = agg.last().reset_index() + most_recent_import = most_recent.loc[most_recent['Trade Flow'] == "Import"] + most_recent_export = most_recent.loc[most_recent['Trade Flow'] == "Export"] + # Summarize country summaries + agg_flow = self.country_flows.groupby(['Reporter ISO', "Partner ISO", "Trade Flow"]) + most_recent_flow = agg_flow.last().reset_index() + most_recent_import_flow = most_recent_flow.loc[most_recent_flow['Trade Flow'] == "Import"] + most_recent_export_flow = most_recent_flow.loc[most_recent_flow['Trade Flow'] == "Export"] + + if out_type == 'CSV': + geom_driver = "CSV" + out_type = "csv" + elif out_type == "SHP": + geom_driver = "ESRI Shapefile" + out_type = "shp" + elif out_type == "GEOJSON": + geom_driver = "GeoJSON" + out_type = "geojson" + + for fileDef in [[most_recent_import, os.path.join(out_folder, f"country_summary_imports.{out_type}")], + [most_recent_export, os.path.join(out_folder, f"country_summary_exports.{out_type}")], + [most_recent_import_flow, os.path.join(out_folder, f"country_flows_imports.{out_type}")], + [most_recent_export_flow, os.path.join(out_folder, f"country_flows_exports.{out_type}")]]: + xx = fileDef[0] + xx = gpd.GeoDataFrame(xx, geometry="geometry", crs = {'init':'epsg:4326'}) + xx.to_file(fileDef[1], driver=geom_driver) + + + def clean_fields(self): + ''' + ''' + #Convert geometry columns to text + self.country_flows['Reporter_Pt'] = self.country_flows['Reporter_Pt'].apply(str) + self.country_flows['Partner_Pt'] = self.country_flows['Partner_Pt'].apply(str) + + #Convert country summary columns to geometry + if 'Reporter_Pt' in self.country_summary.columns: + country_summary_geom = self.country_summary['Reporter_Pt'] + self.country_summary.drop(['Reporter_Pt'], axis=1, inplace=True) + self.country_summary['geometry'] = country_summary_geom + + def save(self, out_folder, out_type = "CSV"): + ''' + Save all the outputs to a folder + + :param: out_folder - string path to output folder; will be created if it does not exist + :param: out_type - string to determine the format to save the results. Default is CSV, optionally "SHP" + import fiona + fiona.supported_drivers + ''' + if not os.path.exists(out_folder): + os.makedirs(out_folder) + + self.clean_fields() + + if out_type == 'CSV': + geom_driver = "CSV" + out_type = "csv" + country_flows_file = os.path.join(out_folder, f"country_flows.{out_type}") + country_summary_file = os.path.join(out_folder, f"country_summary.{out_type}") + self.country_flows.to_csv(country_flows_file) + self.country_summary.to_csv(country_summary_file) + if out_type == "SHP": + geom_driver = "ESRI Shapefile" + out_type = "shp" + country_flows_file = os.path.join(out_folder, f"country_flows.{out_type}") + country_summary_file = os.path.join(out_folder, f"country_summary.{out_type}") + self.country_flows.to_file(country_flows_file) + self.country_summary.to_file(country_summary_file) \ No newline at end of file diff --git a/src/GOSTrocks/infra/rai_calculator.py b/src/GOSTrocks/infra/rai_calculator.py new file mode 100644 index 0000000..36a453e --- /dev/null +++ b/src/GOSTrocks/infra/rai_calculator.py @@ -0,0 +1,82 @@ +import os, sys, time, subprocess, argparse, logging +import rasterio.mask + +import geopandas as gpd +import osmnx as ox +import pandas as pd + +import GOSTnets as gn +import GOSTnets.load_osm as losm + +from . import osm_extractor as osm +from . import rasterMisc as rMisc + +from shapely.geometry import box + +def extract_rai_network(focal_osm, epsg=3857, rai_buffer=2000): + ''' extract road network from OSM PBF + + INPUTS + focal_osm [string] - path to osm pbf to be used for calculations + epsg [int] - epsg code for metres-based measurement codes + rai_buffer [number] + + RETURNS + [geopandas data frame] + ''' + G_loader = losm.OSM_to_network(focal_osm) + G_loader.generateRoadsGDF() + roadsGPD = G_loader.roadsGPD + roadsGPD.set_geometry("Wkt", inplace=True) + roadsGPD = roadsGPD.to_crs({'init':'epsg:%s' % epsg}) + roadsGPD_rai = roadsGPD.copy() + roadsGPD_rai['Wkt'] = roadsGPD_rai['Wkt'].apply(lambda x: x.buffer(rai_buffer)) + + roadsGPD_rai['OSMLR'] = roadsGPD_rai['infra_type'].map(osm.OSMLR_Classes) + def get_num(x): + try: + return(int(x)) + except: + return(5) + roadsGPD_rai['OSMLR_num'] = roadsGPD_rai['OSMLR'].apply(lambda x: get_num(str(x)[-1])) + + return(roadsGPD_rai) + +def calculate_rai(out_bounds, out_bounds_id, wp_data, roadsGPD_rai, rai_folder): + ''' Calculate RAI + + INPUT + out_bounds [geopandas dataframe] - admin boundaries within which to summarize RAI + out_bounds_id [string] - column name in out_bounds containing INDETIFIER + wp_data [rasterio raster] - gridded population dataset from which to calculate RAI + roadsGPD_rai [geopandas data frame] - generated from function .extract_rai_network() + + RETURNS + [pandas dataframe] + ''' + actual_pop = rMisc.zonalStats(out_bounds, wp_data, minVal=0) + actual_pop = pd.DataFrame(actual_pop, columns=['SUM','MIN','MAX','STDEV']) + # Generate OSMLR level road maps + all_res = {} + for road_count in [1,2,3,4]: + rai_pop = os.path.join(rai_folder, "WP_RAI_%s.tif" % road_count) + # Generate pop map within RAI pop + if not os.path.exists(rai_pop): + cur_roads = roadsGPD_rai.loc[roadsGPD_rai['OSMLR_num'] <= road_count] + roads_mask = rasterio.mask.mask(wp_data, [cur_roads.unary_union], invert=False) + with rasterio.open(rai_pop, 'w', **wp_data.meta) as out: + out.write(roads_mask[0]) + rai_pop = rMisc.zonalStats(out_bounds, rai_pop, minVal=0) + + rai_pop = pd.DataFrame(rai_pop, columns=['SUM','MIN','MAX','STDEV']) + rai_pop['ID'] = out_bounds[out_bounds_id] + rai_pop = rai_pop[['SUM','ID']] + rai_pop.columns = ['RAI_POP_%s' % road_count, 'ID'] + all_res[road_count] = rai_pop + + final = all_res[1] + final['RAI_POP_2'] = all_res[2]['RAI_POP_2'] + final['RAI_POP_3'] = all_res[3]['RAI_POP_3'] + final['RAI_POP_4'] = all_res[4]['RAI_POP_4'] + final['POP'] = actual_pop['SUM'] + return(final) diff --git a/src/GOSTrocks/mapMisc.py b/src/GOSTrocks/mapMisc.py new file mode 100644 index 0000000..7549451 --- /dev/null +++ b/src/GOSTrocks/mapMisc.py @@ -0,0 +1,144 @@ +import contextily as ctx +import matplotlib.pyplot as plt +import pandas as pd +import geopandas as gpd +import numpy as np +import matplotlib.patches as mpatches + +from matplotlib.patches import Patch + +def static_map_vector(v_data, map_column, colormap="Reds", edgecolor='darker', + reverse_colormap=False, thresh=None, + legend_loc="upper right", figsize=(10,10), out_file='', set_title=True): + """Simple plot of vector data; most arguments expect + + :param v_data: input geopandas dataset to map + :type v_data: gpd.GeoDataFrame + :param map_column: Column label in v_data to map + :type map_column: str + :param colormap: Name of colour ramp to send to matplotlib.pyplot, defaults to "Reds" + :type colormap: str, optional + :param edgecolor: Optional parameter to change edge colour of polygons. + Optional values are match, darker, or a single provided colour, defaults to 'darker' + :type edgecolor: str, optional + :param reverse_colormap: Optionally reverse the colormap colorramp, defaults to False + :type reverse_colormap: bool, optional + :param thresh: List of thresholds to categorize values in v_data[map_column], defaults to equal interval 6 classes + :type thresh: List of int, optional + :param legend_loc: Where to place legend in plot, plugs into ax.legend, defaults to "upper right" + :type legend_loc: str, optional + :param figsize: Size of image, defaults to (10,10) + :type figsize: tuple, optional + :param out_file: path to create output image, defaults to '', which creates no output file + :type out_file: str, optional + :return: matplotlib object containing all maps + :rtype: matplotlib.pyplot + """ + geom_type = v_data['geometry'].geom_type.iloc[0] + + if v_data.crs.to_epsg() != 3857: + v_data = v_data.to_crs(3857) + # classify the data into categories if threshold is defined + try: + if thresh: + v_data['tomap'] = pd.cut(v_data[map_column], thresh, labels=list(range(0, len(thresh)-1))) + else: + v_data['tomap'] = pd.cut(v_data[map_column], 6, labels=[0,1,2,3,4,5]) + except: + print("Error mapping specified column, defaulting to index") + map_column = 'fake_index' + v_data[map_column] = list(v_data.index) + v_data['tomap'] = pd.cut(v_data[map_column], 6, labels=[0,1,2,3,4,5]) + fig, ax = plt.subplots(figsize=figsize) + cm = plt.cm.get_cmap(colormap) + if reverse_colormap: + cm = cm.reversed() + all_labels = [] + for label, mdata in v_data.groupby('tomap'): + if mdata.shape[0] > 0: + color = cm(label/v_data['tomap'].max()) + # Determine edge color + if edgecolor == 'match': + c_edge = color + elif edgecolor == 'darker': + c_edge = (color[0] * 0.7, color[1] * 0.7, color[2] * 0.7, color[3]) + else: + c_edge = edgecolor + + if geom_type == 'Point': + mdata.plot(color=color, ax=ax, label=label, edgecolor=c_edge, markersize=300) + elif geom_type == 'Polygon': + mdata.plot(color=color, ax=ax, label=label, edgecolor=c_edge) + else: # should handle lines; not yet tested + mdata.plot(color=color, ax=ax, label=label, edgecolor=c_edge) + try: + cLabel = f'{round(mdata[map_column].min())} - {round(mdata[map_column].max())}' + except: + cLabel = 'LABEL' + cur_patch = mpatches.Patch(color=color, label=cLabel) + all_labels.append(cur_patch) + try: + ctx.add_basemap(ax, source=ctx.providers.Stamen.TonerBackground) #zorder=-10, 'EPSG:4326' + except: + print("Error adding basemap") + ax.legend(handles=all_labels, loc=legend_loc) + ax = ax.set_axis_off() + + if set_title: + plt.title(map_column) + + if out_file != '': + plt.savefig(out_file, dpi=300, bbox_inches='tight') + + return(plt) + + +def static_map_raster(r_data, colormap='magma', reverse_colormap=False, thresh=None, legend_loc="upper right", + figsize=(10,10), out_file=''): + """Simple plot of raster data + + :param r_data: Raster data to map, plots the first bad in the raster dataset + :type r_data: rasterio.RasterDatasetReader + :param colormap: Name of colour ramp to send to matplotlib.pyplot, defaults to "Reds" + :type colormap: str, optional + :param reverse_colormap: Optionally reverse the colormap colorramp, defaults to False + :type reverse_colormap: bool, optional + :param thresh: List of thresholds to categorize values in v_data[map_column], defaults to equal interval 6 classes + :type thresh: List of int, optional + :param legend_loc: Where to place legend in plot, plugs into ax.legend, defaults to "upper right" + :type legend_loc: str, optional + :param figsize: Size of image, defaults to (10,10) + :type figsize: tuple, optional + :param vector_mask: _description_, defaults to None + :type vector_mask: _type_, optional + :param out_file: path to create output image, defaults to '', which creates no output file + :type out_file: str, optional + :return: matplotlib object containing all maps + :rtype: matplotlib.pyplot + """ + + map_data = r_data.read()[0,:,:] + map_data = np.nan_to_num(map_data, neginf=0, posinf=2000) + cm = plt.cm.get_cmap(colormap) + if reverse_colormap: + cm = cm.reversed() + + if thresh: + map_data = np.digitize(map_data, thresh) + fig, ax = plt.subplots(figsize=figsize) + chm_plot = ax.imshow(map_data, cmap=cm) + + legend_labels = [ + [cm(0), "Low"], + [cm(0.5), "Medium"], + [cm(1), "High"] + ] + if thresh: + legend_labels = [ [cm(x/max(thresh)), str(x)] for x in thresh ] + + patches = [Patch(color=x[0], label=x[1]) for x in legend_labels] + ax.legend(handles=patches, loc=legend_loc, facecolor="white") + ax.set_axis_off() + if out_file != '': + plt.savefig(out_file, dpi=300, bbox_inches='tight') + return(plt) diff --git a/src/GOSTrocks/metadataMisc.py b/src/GOSTrocks/metadataMisc.py new file mode 100644 index 0000000..7002f21 --- /dev/null +++ b/src/GOSTrocks/metadataMisc.py @@ -0,0 +1,287 @@ +import os, logging + +import rasterio # v1.0.21 (latest v1.2.10) + +import pandas as pd # v1.0.3 (latest v1.4.1) +import geopandas as gpd # v0.6.3 (latest v0.10.2) + +import seaborn as sns + +from rasterio.plot import show +from shapely.geometry import shape +from shapely.wkt import loads +from tqdm import tqdm +from pyproj.crs.crs import CRS + +try: + import arcpy # v2.6 + from arcgis.features import GeoAccessor, GeoSeriesAccessor +except: + print("METADATA Library: Could not import arcgis libraries") + +vector_file_types = ['.shp','.kml','.geojson'] +raster_file_types = ['.TIF','.tif','.tiff','.geotiff','.geotif'] + + +### TODO: +# 1. Add searching through ESRI geodatabases +# 2. Add support to include tables (xlsx, csv) + +class metadata_gost: + ''' Create standardized metadata for folders of geospatial data + ''' + + def __init__(self, input_dir, output_dir, type="Folder"): + """ Create standardized metadata for folders of geospatial data + + :param input_dir: Folder to search for geospatial layers + :type input_dir: str + :param output_dir: Where to create output metadata files + :type output_dir: str + :param type: What we are searching, defaults to "Folder" + :type type: str, optional + """ + self.input_dir = input_dir + if not os.path.exists(input_dir): + raise(ValueError("Input directory does not exist")) + self.output_dir = output_dir + if not os.path.exists(output_dir): + os.makedirs(output_dir) + + def get_layers(self): + ''' Iterate through self.input_dir and get list of vector and raster data ''' + vector_files = [] + raster_files = [] + + for root, dirs, files in os.walk(self.input_dir): + for f in files: + file_type = os.path.splitext(f)[-1] + if file_type in vector_file_types: + vector_files.append(os.path.join(root, f)) + if file_type in raster_file_types: + raster_files.append(os.path.join(root, f)) + self.vector_files = vector_files + self.raster_files = raster_files + return({'vector':vector_files, 'raster':raster_files}) + + def write_metadata(self, out_file, layer_metadata=None, field_metadata=None, + dataset_id='', dataset_title='', country='', abstract='', + purpose='', creation_date='', release_date='', owner='', email=''): + # create first sheet of baseline info + base_info = {'dataset ID':dataset_id, + 'dataset title':dataset_title, + 'country':country, + 'abstract':abstract, + 'purpose':purpose, + 'creation date':creation_date, + 'release date':release_date, + 'owner name':owner, + 'owner email':email} + base_pd = pd.DataFrame([base_info]).transpose() + if layer_metadata is None: + layer_metadata = self.metaPD + if field_metadata is None: + field_metadata = self.fieldsPD + + with pd.ExcelWriter(out_file, engine='openpyxl', mode='w', if_sheet_exists='replace') as writer: + base_pd.to_excel(writer, 'dataset info', encoding='utf8') + layer_metadata.to_excel(writer, 'layer_summaries', encoding='utf8') + field_metadata.to_excel(writer, 'field_summaries', encoding='utf8') + + def generate_metadata(self, vector_files=None, raster_files=None): + ''' Generate metadata for vector and raster files + + Args: + vector_files [optional, list] - list of paths to vector_files, if none, defaults to list generated through get_list_of_layers + raster_files [optional, list] - list of paths to raster_files, if none, defaults to list generated through get_list_of_layers + + Returns: + [geopandas DataFrame] + + Details: + Standard Fields + layer_name - name of layer (filename without extension) + data_type - vector, raster, or table + crs_name + crs_code + num_dimensions - Number of fields in dataset, or bands in raster dataset + min_lon + max_lon + min_lat + max_lat + Vector Fields: + vector_shape_type + vector_object_count + table_num_rows + Raster Fields: + raster_width + raster_height + + Manual Input + layer_label + description + source_name + source_url + data_process_summary + ''' + if vector_files is None: + vector_files = self.vector_files + if raster_files is None: + raster_files = self.raster_files + + metadata = [] + field_defs = [] + for vector_file in vector_files: + try: + cur_meta = vector_file_metadata(vector_file, in_folder=self.input_dir) + metadata.append(cur_meta.get_metadata()) + field_defs.append(cur_meta.get_field_summaries()) + except: + logging.error(f"Cannot log {vector_file}") + + for raster_file in raster_files: + try: + cur_meta = raster_file_metadata(raster_file, in_folder=self.input_dir) + metadata.append(cur_meta.get_metadata()) + except: + logging.error(f"Cannot log {raster_file}") + + metaPD = pd.DataFrame(metadata) + metaPD['layer_label'] = '' + metaPD['description'] = '' + metaPD['source_name'] = '' + metaPD['source_url'] = '' + metaPD['data_process_summary'] = '' + self.metaPD = metaPD + try: + del final + except: + pass + for cur_fields in field_defs: + cur_pd = pd.DataFrame(cur_fields) + try: + final = final.append(cur_pd) + except: + final = cur_pd + try: + fieldsPD = final.reset_index() + self.fieldsPD = fieldsPD + except: + fieldsPD = None + self.fieldsPD = None + self.metaPD.sort_values(['folder',"layer_name"], inplace=True) + self.fieldsPD.sort_values(["layer_name", "field_name"], inplace=True) + + return({'metadata':metaPD, 'fields':fieldsPD}) + +class raster_file_metadata: + def __init__(self, path, in_folder=''): + self.path = path + self.layer_name = os.path.splitext((os.path.basename(path)))[0] + if in_folder == '': + self.dir_name = os.path.dirname(path) + else: + self.dir_name = os.path.dirname(path).replace(in_folder, '') + self.data_type = "Raster" + + curR = rasterio.open(path) + + cur_crs = CRS.from_wkt(curR.crs.wkt) + self.crs_name = cur_crs.name + self.crs_code = curR.crs.to_epsg() + + rShape = curR.shape + if len(rShape) == 2: + self.num_dimensions = 1 + self.raster_width = curR.shape[0] + self.raster_height= curR.shape[1] + else: + self.num_dimensions = curR.shape[0] + self.raster_width = curR.shape[1] + self.raster_height= curR.shape[2] + + self.raster_res = curR.res[0] + b = curR.bounds + self.min_lon = b[0] + self.min_lat = b[1] + self.max_lon = b[2] + self.max_lat = b[3] + + def get_metadata(self): + return({'layer_name': self.layer_name, + 'folder': self.dir_name, + 'data_type': self.data_type, + 'crs_name': self.crs_name, 'crs_code': self.crs_code, + 'num_dimensions': self.num_dimensions, + 'min_lon': self.min_lon, + 'max_lon': self.max_lon, + 'min_lat': self.min_lat, + 'max_lat': self.max_lat, + 'raster_width': self.raster_width, + 'raster_height': self.raster_height, + 'raster_res': self.raster_res}) + +class vector_file_metadata: + def __init__(self, path, in_folder=''): + self.path = path + self.in_folder = '' + self.layer_name = os.path.splitext((os.path.basename(path)))[0] + if in_folder == '': + self.dir_name = os.path.dirname(path) + else: + self.dir_name = os.path.dirname(path).replace(in_folder, '') + self.data_type = "Vector" + + curD = gpd.read_file(path) + self.curD = curD + self.crs_name = curD.crs.name + self.crs_code = curD.crs.to_epsg() + self.num_dimensions = curD.shape[1] + self.vector_object_count = curD.shape[0] + + b = curD.total_bounds + self.min_lon = b[0] + self.min_lat = b[1] + self.max_lon = b[2] + self.max_lat = b[3] + self.vector_shape_type = curD.geom_type.value_counts().index[0] + + def get_field_summaries(self): + ''' Generate field metadata + layer_name + field_name + field_label + definition + domain + type + num_unique_values + first_10_unique_values + ''' + cur_field_defs = [] + for idx, col in self.curD.iteritems(): + cur_defs = {'layer_name': self.layer_name, + 'field_name': idx, + 'type':col.dtype, + 'field_label': '', + 'definition': '', + 'domain':'', + 'num_unique_values':len(col.unique()), + 'first_10_unique_values': col.values[:10] + } + cur_field_defs.append(cur_defs) + return(cur_field_defs) + + + def get_metadata(self): + return({ 'layer_name': self.layer_name, + 'data_type': self.data_type, + 'crs_name': self.crs_name, 'crs_code': self.crs_code, + 'num_dimensions': self.num_dimensions, + 'min_lon': self.min_lon, + 'max_lon': self.max_lon, + 'min_lat': self.min_lat, + 'max_lat': self.max_lat, + 'vector_shape_type': self.vector_shape_type, + 'vector_object_count': self.vector_object_count}) + + \ No newline at end of file diff --git a/src/GOSTrocks/misc.py b/src/GOSTrocks/misc.py new file mode 100644 index 0000000..66628b8 --- /dev/null +++ b/src/GOSTrocks/misc.py @@ -0,0 +1,215 @@ +import time, math, logging + +import geopandas as gpd +import pandas as pd +import numpy as np + +from math import ceil +from shapely.geometry import Point, Polygon + +wgs84 = {'init':'epsg:4326'} + +def loggingInfo(lvl = logging.INFO): + """ Set logging settings to info (default) and print useful information + + :param lvl: logging level for setting, defaults to logging.INFO + :type lvl: logging.INFO + """ + logging.basicConfig(format='%(asctime)s:%(levelname)s: %(message)s', level=lvl) + + +def tPrint(s): + '''prints the time along with the message''' + print("%s\t%s" % (time.strftime("%H:%M:%S"), s)) + +def round_to_1(x): + return(round(x, -int(math.floor(math.log10(x))))) + +def drange(start, stop, step): + ''' Create an interable range made with decimal point steps ''' + r = start + while r < stop: + yield r + r += step + +def getHistIndex(hIdx, val): + """ Get the index of a specific [val] within a list of histogram values + + :param hIdx: list of values (from histogram calculation) + :type hIdx: list of numbers + :param val: value to search for + :type val: number + :return: index in hIdx where val falls + :rtype: int + """ + lastH = 0 + for h in range(0, len(hIdx)): + curH = hIdx[h] + if curH > val: + return(lastH) + lastH = h + return(len(hIdx) -1) + +def listSum(inD): + """get sum of values in list + + :param inD: list of numbers + :type inD: list + """ + total = 0 + for x in inD: + total += x + return(total) + +def getHistPer(inD): + ''' Convert a list of values into a percent of total + + :param inD: list of values + :type inD: list of numbers + :return: list of values of same length of inD. + :rtype: list of float + ''' + tSum = listSum(inD) + for hIdx in range(0,len(inD)): + inD[hIdx] = inD[hIdx] / tSum + return(inD) + +def tabulateUnq(unqResults, verbose=False, columnPrefix="c"): + allVals = [] + for r in unqResults: + allVals.append(r[0].tolist()) + flattened = [val for sublist in allVals for val in sublist] + unq = np.unique(np.array(flattened)).tolist() + #unqCols = ["c_%s" % xxx for xxx in unq] + allRes = [] + for r in unqResults: + try: + curRes = [0] * len(unq) + for idx in range(0, len(r[0].tolist())): + curRes[unq.index(r[0].tolist()[idx])] = r[1].tolist()[idx] + except: + print (r) + allRes.append(curRes) + return pd.DataFrame(allRes, columns=["%s_%s" % (columnPrefix, xxx) for xxx in unq]) + +def createFishnet(xmin,xmax,ymin,ymax,gridHeight,gridWidth,type='POLY',crsNum=4326,outputGridfn=''): + """ Create a fishnet shapefile inside the defined coordinates + + :param xmin: minimum longitude + :type xmin: float + :param xmax: maximum longitude + :type xmax: float + :param ymin: minimum latitude + :type ymin: float + :param ymax: maximum latitude + :type ymax: float + :param gridHeight: resolution of the grid cells in crsNum units + :type gridHeight: float + :param gridWidth: resolution of the grid cells in crsNum units + :type gridWidth: float + :param type: geometry type of output fishnet, defaults to 'POLY' + :type type: str, optional + :param crsNum: units of output crs, defaults to 4326 + :type crsNum: int, optional + :param outputGridfn: path for output shapefile, defaults to '', which creates no shapefile + :type outputGridfn: str, optional + :return: geodataframe of fishnet + :rtype: gpd.GeoDataFrame + """ + + def get_box(row, col, l, r, b, t, gridWidth, gridHeight): + ll = Point(l + (row * gridWidth), b + (col + gridHeight)) + ul = Point(l + (row * gridWidth), t + (col + gridHeight)) + ur = Point(r + (row * gridWidth), t + (col + gridHeight)) + lr = Point(r + (row * gridWidth), b + (col + gridHeight)) + box = Polygon([ll, ul, ur, lr, ll]) + return(box) + + def get_point(row, col, l, r, b, t, gridWidth, gridHeight): + pt = Point((l+r)/2 + (col*gridWidth), (t+b)/2 - (row * gridHeight)) + return(pt) + # convert sys.argv to float + xmin = float(xmin) + xmax = float(xmax) + + ymin = float(ymin) + ymax = float(ymax) + gridWidth = float(gridWidth) + gridHeight = float(gridHeight) + + # get rows + rows = ceil((ymax-ymin)/gridHeight) + # get columns + cols = ceil((xmax-xmin)/gridWidth) + + # start grid cell envelope + ringXleftOrigin = xmin + ringXrightOrigin = xmin + gridWidth + ringYtopOrigin = ymax + ringYbottomOrigin = ymax-gridHeight + + all_res = [] + for rowIdx in range(0, rows): + for colIdx in range(0, cols): + if type == "POLY": + box = get_box(rowIdx, colIdx, ringXleftOrigin, ringXrightOrigin, ringYbottomOrigin, ringYtopOrigin, gridWidth, gridHeight) + elif type == "POINT": + box = get_point(rowIdx, colIdx, ringXleftOrigin, ringXrightOrigin, ringYbottomOrigin, ringYtopOrigin, gridWidth, gridHeight) + all_res.append([rowIdx, colIdx, box]) + res = gpd.GeoDataFrame(pd.DataFrame(all_res, columns=['rowIdx', 'colIdx', 'geometry']), geometry='geometry', crs=f'epsg:{crsNum}') + if outputGridfn != '': + res.to_file(outputGridfn) + return(res) + +def explodeGDF(indf): + ''' Convert geodataframe with multi-part polygons to one with single part polygons + + :param indf: input geodataframe to explode + :type indf: gpd.GeoDataFrame + :return: exploded geodaatframe + :rtype: gpd.GeoDataFrame + ''' + outdf = gpd.GeoDataFrame(columns=indf.columns) + outdf.crs = indf.crs + for idx, row in indf.iterrows(): + row.geometry.type + if row.geometry.type in ["Polygon", "Point"]: + outdf = outdf.append(row,ignore_index=True) + if row.geometry.type in ["MultiPoint", "MultiPolygon"]: + multdf = gpd.GeoDataFrame(columns=indf.columns) + recs = len(row.geometry) + multdf = multdf.append([row]*recs,ignore_index=True) + for geom in range(recs): + multdf.loc[geom,'geometry'] = row.geometry[geom] + outdf = outdf.append(multdf,ignore_index=True) + return(outdf) + +def project_UTM(inD): + ''' Project an input data frame to UTM coordinates. + + :param inD: input geodataframe to explode + :type inD: gpd.GeoDataFrame + :return: exploded geodaatframe + :rtype: gpd.GeoDataFrame + ''' + import utm + + #get UTM zones for upper right and lower left of input dataframe + + + if inD.crs != {'init': 'epsg:4326'}: + raise(ValueError("Cannot process input dataframe that is not WGS84")) + + inBounds = inD.total_bounds + ll_utm = utm.from_latlon(inBounds[1], inBounds[0]) + ur_utm = utm.from_latlon(inBounds[3], inBounds[2]) + + if (ll_utm[2] != ur_utm[2]) or (ll_utm[3] != ur_utm[3]): + raise(ValueError("The input shape spans multiple UTM zones: %s_%s to %s_%s" % (ll_utm[2], ll_utm[3], ur_utm[2], ur_utm[3]))) + + letter = '6' + if ll_utm[3] == "U": + letter = '7' + outUTM = '32%s%s' % (letter, ll_utm[2]) + return(inD.to_crs({'init': 'epsg:%s' % outUTM})) + diff --git a/src/GOSTrocks/ntlMisc.py b/src/GOSTrocks/ntlMisc.py new file mode 100644 index 0000000..ffa3dfc --- /dev/null +++ b/src/GOSTrocks/ntlMisc.py @@ -0,0 +1,153 @@ +import sys, os, inspect +import rasterio + +import pandas as pd +import numpy as np +import xarray as xr +import matplotlib.pyplot as plt + +curPath = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0])) +if not curPath in sys.path: + sys.path.append(curPath) + +from dataMisc import aws_search_ntl +from misc import tPrint +import rasterMisc as rMisc + +def read_raster_box(curRaster, geometry, bandNum=1): + # get pixel coordinates of the geometry's bounding box + ul = curRaster.index(*geometry.bounds[0:2]) + lr = curRaster.index(*geometry.bounds[2:4]) + # read the subset of the data into a numpy array + window = ((float(lr[0]), float(ul[0]+1)), (float(ul[1]), float(lr[1]+1))) + data = curRaster.read(bandNum, window=window) + return(data) + +def calc_annual(df, extent, agg_method="MEAN"): + """ Combine monthly nighttime lights images into an annual composite + + :param df: data frame of images with three columns: YEAR, MONTH, PATH + :type df: pandas.DataFrame + :param extent: area to extract imagery from + :type extent: shapely.Polygon + """ + all_layers = df['PATH'].apply(lambda x: read_raster_box(rasterio.open(x), extent)) + all_vals = np.dstack(all_layers) + if agg_method == "MEAN": + final_vals = np.nanmean(all_vals, axis=2) + + return(final_vals) + +def generate_annual_composites(aoi, agg_method="MEAN", sel_files=[], out_folder=''): + """_summary_ + + :param aoi: geopandas polygonal dataframe to use for clip clip extent based on crop param + :type aoi: geopandas.GeoDataFrame + :param method: How to aggregate monthly nighttime lights layers into annual layers, defaults to MEAN + :type method: str, optional + :param sel_files: list of ntl files to process, defaults to [], which will use gostrocks.dataMisc.aws_search_ntl to find all variables + :type sel_files: list, optional + """ + if len(sel_files) == 0: + sel_files = aws_search_ntl() + yr_month = [x.split("_")[1] for x in sel_files] + yr = [x[:4] for x in yr_month] + information = pd.DataFrame([yr,yr_month,sel_files], index=['YEAR','MONTH','PATH']).transpose() + annual_vals = information.groupby('YEAR').apply(lambda x: calc_annual(x, aoi)) + + # Write the files to output + if out_folder != '': + if not os.path.exists(out_folder): + os.makedirs(out_folder) + out_meta = rasterio.open(information['PATH'].iloc[0]).profile.copy() + for label, res in annual_vals.items(): + out_meta.update(width=res.shape[0], height=res.shape[1], + transform=rasterio.transform.from_bounds(*aoi.bounds, res.shape[0], res.shape[1])) + out_file = os.path.join(out_folder, f'VIIRS_{label}_annual.tif') + with rasterio.open(out_file, 'w', **out_meta) as out_r: + out_r.write_band(1, res) + return(annual_vals) + +def map_viirs(cur_file, out_file='', class_bins = [-10,0.5,1,2,3,5,10,15,20,30,40,50], text_x=0, text_y=5, dpi=100): + """Map VIIRS nighttime lights imagery, optionally create output image + + :param cur_file: path to input geotiff + :type cur_file: string + :param out_file: path to create output image, defaults to '' which does not create a file + :type out_file: str, optional + :param class_bins: breaks for applying colour ramp, defaults to [-10,0.5,1,2,3,5,10,15,20,30,40,50] + :type class_bins: list, optional + :param text_x: position on map to position year text (left to right), defaults to 0 + :type text_x: int, optional + :param text_y: position on map to position year text (top to bottom), defaults to 5 + :type text_y: int, optional + :param dpi: dotes per inch for output image, defaults to 100 + :type dpi: int, optional + """ + # extract the year from the file name + year = cur_file.split("_")[-1][:4] + + # Open the VIIRS data and reclassify + inR = rasterio.open(cur_file) + inD = inR.read() + inC = xr.apply_ufunc(np.digitize,inD,class_bins) + + # Plot the figure, remove grid and ticks + fig = plt.figure() + ax = fig.add_subplot(111) + ax.grid(False) + ax.set_xticks([]) + ax.set_yticks([]) + + ### TODO: add the year to the map, may need to experiment with the location depend on geography + ax.text(text_x, text_y, year, fontsize=40, color='white') + + #plt.margins(0,0) + if out_file != '': + #plt.imsave(out_file, inC[0,:,:], cmap=plt.get_cmap('magma')) + plt.imshow(inC[0,:,:], cmap=plt.get_cmap('magma')) + fig.savefig(out_file, dpi=dpi, bbox_inches='tight', pad_inches=0) + else: + # https://matplotlib.org/stable/tutorials/colors/colormaps.html + plt.imshow(inC[0,:,:], cmap=plt.get_cmap('magma')) + + +def run_zonal(inD, ntl_files=[], minval=0.1, verbose=False, calc_sd=True): + """ Run zonal statistics against a series of nighttime lights files + + :param inD: input geopandas dataframe in which to summarize results + :type inD: gpd.GeoDataFrames + :param ntl_files: list of ntl files to summarize, defaults to [] which will search for all files in the s3 bucket using datMisc.aws_search_ntl() + :type ntl_files: list, optional + :param minval: Minimum value to summarize in nighttime lights, defaults to 0.1 which means all values below this become 0 + :type minval: float, optional + :param verbose: print additional information, defaults to False + :type verbose: bool, optional + :param calc_sd: _description_, defaults to True + :type calc_sd: bool, optional + """ + + ''' run zonal stats on all ntl files + INPUT + inD [geopandas dataframe] + + RETURNS + pandas dataframe + ''' + if len(ntl_files) == 0: + ntl_files = aws_search_ntl() + + for ntl_file in ntl_files: + name = ntl_file.split("/")[-1].split("_")[2][:8] + if verbose: + tPrint(name) + inR = rasterio.open(ntl_file) + ntl_res = rMisc.zonalStats(inD, inR, minVal=minval, calc_sd=calc_sd) + out_cols = ['SUM','MIN','MAX','MEAN'] + if calc_sd: + out_cols.append("SD") + ntl_df = pd.DataFrame(ntl_res, columns=out_cols) + inD[f'ntl_{name}_SUM'] = ntl_df['SUM'] + return(inD) + + diff --git a/src/GOSTrocks/osmMisc.py b/src/GOSTrocks/osmMisc.py new file mode 100644 index 0000000..eb37271 --- /dev/null +++ b/src/GOSTrocks/osmMisc.py @@ -0,0 +1,324 @@ +import subprocess, argparse, logging + +import geopandas as gpd +import osmnx as ox +import pandas as pd + +from shapely.geometry import box +from GOSTRocks import misc + +# Highway features are reclassified to 4 OSMLR classes for simplification and standardization +# https://mapzen.com/blog/osmlr-2nd-technical-preview/ +OSMLR_Classes = { +"motorway":"OSMLR level 1", +"motorway_link":"OSMLR level 1", +"trunk":"OSMLR level 1", +"trunk_link":"OSMLR level 1", +"primary":"OSMLR level 1", +"primary_link":"OSMLR level 1", + +"secondary":"OSMLR level 2", +"secondary_link":"OSMLR level 2", +"tertiary":"OSMLR level 2", +"tertiary_link":"OSMLR level 2", + +"unclassified":"OSMLR level 3", +"unclassified_link": "OSMLR level 3", +"residential": "OSMLR level 3", +"residential_link": "OSMLR level 3", + +"track": "OSMLR level 4", +"service": "OSMLR level 4" +} + +class osmExtraction(object): + ''' + Download and installation instructions and basic usage can be found here + https://wiki.openstreetmap.org/wiki/Osmosis + ''' + def __init__(self, osmosisCmd = r"C:\WBG\Anaconda\Osmosis\bin\osmosis", tempFile = r"C:\WBG\Anaconda\Osmosis\tempExecution.bat"): + ''' + osmosisCmd is the path to the file osmosis in the bin folder of the downloaded + stable version of osmosis (link above) + ''' + self.osmosisCommand = osmosisCmd + self.tempFile = tempFile + + def extractAmmenities(self, inPbf, outFile, amenityList=["amenity.school"], bounds=[], execute=False): + ''' Read input osmpbf, extract all buildings and spit out to shapefile + INPUT + inPbf [string] - path to input pbf + outFile [string] - path to output shapefile + + OPTIONAL + amenity [string] - definition of amenity to extract - defaults to schools + bounds [list of numbers??] - bounds of area to extract, if not defined, covers entire input area + ''' + if len(amenityList) > 1: + amenity = ",".join(amenityList) + else: + amenity = amenityList[0] + + baseCommand = r'{osmCommand} --read-pbf {inPbf} --nkv keyValueList="{amenity}"'.format( + osmCommand = self.osmosisCommand, + inPbf = inPbf, + amenity=amenity) + if len(bounds) > 0: + baseCommand = "{baseCommand} --bounding-box top={top} left={left} bottom={bottom} right={right}".format( + baseCommand=baseCommand, + top = bounds[3], + left = bounds[0], + bottom = bounds[1], + right = bounds[2]) + + baseCommand = '{baseCommand} --write-pbf {outPbf}'.format( + baseCommand = baseCommand, + outPbf = outFile + ) + if not execute: + return(baseCommand) + else: + with open(self.tempFile, 'w') as outFile: + outFile.write(baseCommand) + subprocess.call([self.tempFile], shell=True) + + def extractBuildings(self, inPbf, outFile, bounds=[], execute=True): + ''' Read input osmpbf, extract all buildings and spit out to shapefile + INPUT + inPbf [string] - path to input pbf + outFile [string] - path to output shapefile + ''' + baseCommand = r"{osmCommand} --read-pbf {inPbf} --tf accept-ways building=*".format( + osmCommand = self.osmosisCommand, + inPbf = inPbf) + if len(bounds) > 0: + baseCommand = "{baseCommand} --bounding-box top={top} left={left} bottom={bottom} right={right}".format( + baseCommand=baseCommand, + top = bounds[3], + left = bounds[0], + bottom = bounds[1], + right = bounds[2]) + baseCommand = "{baseCommand} --write-pbf {outPbf}".format( + baseCommand = baseCommand, + outPbf = outFile) + if not execute: + return(baseCommand) + else: + with open(self.tempFile, 'w') as outFile: + outFile.write(baseCommand) + subprocess.call([self.tempFile], shell=True) + + def extractBoundingBox(self, inPbf, inShp, outPbf, execute=True): + ''' Extract the inPbf based on the bounding box of the input shapefile + INPUT + inPbf [string] - path to input pbf + inShp [string or geopandas object] - path to aoi shapefile + ''' + if type(inShp) == str: + inD = gpd.read_file(inShp) + elif type(inShp) == gpd.GeoDataFrame: + inD = inShp + else: + raise(ValueError("inShp needs to be a string or a geopandas object")) + if inD.crs != {'init':'epsg:4326'}: + inD = inD.to_crs({'init':'epsg:4326'}) + baseCommand = r"{osmCommand} --read-pbf {inPbf} --bounding-box top={top} left={left} bottom={bottom} right={right} --write-pbf {outPbf}".format( + osmCommand = self.osmosisCommand, + inPbf = inPbf, + top = float(inD.bounds.maxy), + left = float(inD.bounds.minx), + bottom = float(inD.bounds.miny), + right = float(inD.bounds.maxx), + outPbf = outPbf) + if not execute: + return(baseCommand) + else: + with open(self.tempFile, 'w') as outFile: + outFile.write(baseCommand) + subprocess.call([self.tempFile], shell=True) + + + def extractHighways(self, inPbf, outOSM, values=[1,2,3,4], bounds = [], execute=True): + ''' Extract highways (all roads) from input osm pbf. Can limit definition of which roads to extract + by defining the OSMLT class. see osmMisc.OSMLR_Classes for definition of classes + + INPUT + inPbf [string] - path to input osm pbf file + outOSM [string] - path to output osm pbf file + values [list of int] [optional][default = [1,2,3,4] - OSMLR values to extract + bounds [list of coordinates] - boundary to extract + execute [boolean] [default = True] - if set to false, command will return the osmosis command, and not execute it + ''' + highwayVals = [] + for key, value in OSMLR_Classes.items(): + try: + if int(value.split(" ")[2]) in values: + #highwayVals.append("highway=%s" % key) + highwayVals.append(key) + except: + pass + allCommands = ",".join(highwayVals) + baseCommand = r"{osmCmd} --read-pbf {inPbf} --tf accept-ways highway={highwayCommand} --used-node".format( + osmCmd = self.osmosisCommand, + inPbf=inPbf, + highwayCommand=allCommands) + + if len(bounds) > 0: + baseCommand = "{baseCommand} --bounding-box top={top} left={left} bottom={bottom} right={right}".format( + baseCommand=baseCommand, + top = bounds[3], + left = bounds[0], + bottom = bounds[1], + right = bounds[2]) + + baseCommand = "{baseCommand} --write-pbf {outPbf}".format( + baseCommand=baseCommand, + outPbf=outOSM) + if not execute: + return(baseCommand) + else: + with open(self.tempFile, 'w') as outFile: + outFile.write(baseCommand) + subprocess.call([self.tempFile], shell=True) + + + +def summarizeOSM(grid, verbose=True, roadsOnly=False): + ''' Summarizes OSM road length within each feature in the input grid + + ---variables--- + grid [GeoDataframe] - each feature will have the length of all roads summarized + + --- To Do --- + 1. The length projection is web mercator - this is not great, and should instead be projected to UTM + ''' + WGS_84 = {'init' :'epsg:4326'} + WEB_MERCATOR = {'init' :'epsg:3857'} + #Extract OSM within the bounding box of the input grid + if grid.crs != WGS_84: + grid = grid.to_crs(WGS_84) + bbox = box(grid.bounds.minx.min(), grid.bounds.miny.min(), grid.bounds.maxx.max(), grid.bounds.maxy.max()) + G = ox.graph_from_polygon(bbox, network_type='drive_service') + #Limit the OSM grid to important columns, ignore nodes + nodes,roads = ox.save_load.graph_to_gdfs(G, edges = True) + if roadsOnly: + return(roads) + roads = roads[['geometry','highway','osmid']] + roads['length'] = roads.length + roads['highway'] = roads.highway.astype(str) + roads['OSMLR'] = roads.highway.map(OSMLR_Classes) + FID_list, OSMLR1_list, OSMLR2_list, OSMLR3_list, OSMLRt_list = [], [], [], [], [] + cnt = 0 + verbose = False + #Loop through all of the input features to summarize OSM + for idx, obj in grid.iterrows(): + if idx % 50 == 0 and verbose: + print ("%s of %s" % (cnt, len(grid.shape[0]))) + roads2 = roads.copy() + #Find roads that intersect current geometry + roads2 = roads2[roads2.intersects(obj.geometry)] + #Find the intersection of the current geometry and the intersecting roads + roads2['intersecting'] = roads2.geometry.intersection(obj.geometry) + roads2 = roads2.set_geometry('intersecting') + roads2['intersecting_length'] = roads2.length + #Project the roads to a metre-based CRS + roads2 = roads2.to_crs(WEB_MERCATOR) + roads2['intersecting_length'] = roads2.length + FID_list.append(idx) + #Summarize total lenght of OSMLR classes + OSMLR1_list.append(roads2.loc[roads2.OSMLR == 'OSMLR level 1'].intersecting_length.sum()) + OSMLR2_list.append(roads2.loc[roads2.OSMLR == 'OSMLR level 2'].intersecting_length.sum()) + OSMLR3_list.append(roads2.loc[roads2.OSMLR == 'OSMLR level 3'].intersecting_length.sum()) + OSMLRt_list.append(roads2.loc[roads2.OSMLR == 'OSMLR track'].intersecting_length.sum()) + cnt = cnt + 1 + + results = pd.DataFrame({'FID':FID_list, + 'OSMLR level 1': OSMLR1_list, + 'OSMLR level 2': OSMLR2_list, + 'OSMLR level 3': OSMLR3_list, + 'OSMLR track': OSMLRt_list}) + results['totalOSM'] = results['OSMLR level 1'] + results['OSMLR level 2'] + results['OSMLR level 3'] + results['OSMLR track'] + return results + +def convertOSMPBF_DataFrame(inOSM, layer): + ''' Convert an input OSM PBF to a geopandas dataframe + + INPUT + inOSM [string] - path to OSM pbf to convert + layer [string] - data layer to extract. Select from lines, points, multipolygons, multilinestrings + + RETURNS + [geopandas data frame] + ''' + import geojson, json + from osgeo import ogr + from shapely.geometry import shape + + driver=ogr.GetDriverByName('OSM') + data = driver.Open(inOSM) + layer = data.GetLayer(layer) + features=[x for x in layer] + def loadOSMjson(x): + ''' convert the OSM JSON to something concumable as geopandas + ''' + geom = shape(geojson.loads(json.dumps(x['geometry']))) + x['geometry'] = geom + for key, value in x['properties'].items(): + x[key] = value + try: + splitTags = x['other_tags'].split(",") + for tag in splitTags: + tSplit = tag.split("=>") + x[tSplit[0].replace('"', '')] = tSplit[1].replace('"', '') + except: + pass + x.pop("properties", None) + x.pop("other_tags", None) + return(x) + + allFeats = [loadOSMjson(feat.ExportToJson(as_object=True)) for feat in features] + inR = pd.DataFrame(allFeats) + inR = gpd.GeoDataFrame(inR, geometry='geometry', crs=4326) + try: + inR = misc.project_UTM(inR) + except: + inR = inR.to_crs(3857) + inR['Length'] = inR['geometry'].apply(lambda x: x.length) + inR = inR.to_crs(4326) + return (inR) + +if __name__ == "__main__": + exampleText = ''' + #Extract OSMLR level 1 and 2 roads from pbf + python osmMisc.py -i Q:\AFRICA\MRT\INFRA\mauritania-latest_20190103.osm.pbf -o Q:\AFRICA\MRT\INFRA\mauritania-latest_20190103_OSMLR12.osm.pbf -OSMLR 1 2 -OSMExtract + + #Extract OSM PBF for bounding box + python osmMisc.py -i Q:\AFRICA\LBR\INFRA\liberia-latest.osm.pbf -o Q:\AFRICA\LBR\INFRA\liberia-latest_Monrovia.osm.pbf -AOI_file "Q:\AFRICA\LBR\Projects\Monrovia_Imagery\Greater Monrovia admin boundary\Greater_Monrovia_admin_boundary.shp" -BBExtract + + #Extract buildings from OSM PBF + python osmMisc.py -i Q:\AFRICA\LBR\INFRA\liberia-latest_Monrovia.osm.pbf -o Q:\AFRICA\LBR\INFRA\liberia-latest_Monrovia_Buildings.osm.pbf -BuildingExtract + ''' + parser = argparse.ArgumentParser(description="Generate urban metrics based on a defined grid") + + parser.add_argument('-i', dest="INPUT", action='store', help="Input .osm.pbf") + parser.add_argument('-o', dest="OUTPUT", action='store', help="Output .osm.pbf") + parser.add_argument('-OSMExtract', dest="EXTRACT", action='store_true', help="Perform OSMExtract on OSM PBF") + parser.add_argument('-OSMLR', dest='LEVELS', action='store', help="OSMLR levels to extract from the input pbf", nargs='+') + parser.add_argument('-BBExtract', dest="BBEXTRACT", action='store_true', help="Perform OSMExtract on OSM PBF") + parser.add_argument('-BuildingExtract', dest="BUILDINGEXTRACT", action='store_true', help="Perform OSMExtract on OSM PBF") + parser.add_argument('-AOI_file', dest="AOI", action='store', help="AOI of study area") + + args = parser.parse_args() + print(args) + #Set logging information + logging.basicConfig(format='%(asctime)s:%(levelname)s: %(message)s', level=logging.INFO) + xx = osmExtraction() + if args.EXTRACT: + y = xx.extractOSMLRlvl1(args.INPUT, args.OUTPUT, values=[int(x) for x in args.LEVELS], execute=True) + print(y) + if args.BBEXTRACT: + y = xx.extractBoundingBox(args.INPUT, args.AOI, args.OUTPUT) + print(y) + if args.BUILDINGEXTRACT: + y = xx.extractBuildings(args.INPUT, args.OUTPUT) + print(y) \ No newline at end of file diff --git a/src/GOSTrocks/rasterMisc.py b/src/GOSTrocks/rasterMisc.py new file mode 100644 index 0000000..89f07e2 --- /dev/null +++ b/src/GOSTrocks/rasterMisc.py @@ -0,0 +1,552 @@ +import sys, os, inspect, json +import rasterio, pyproj + +import pandas as pd +import geopandas as gpd +import numpy as np + +from shapely.geometry import box, shape +from shapely import wkt +from affine import Affine +from rasterio import features +from rasterio.mask import mask +from rasterio.features import rasterize, MergeAlg +from rasterio.warp import reproject, Resampling, calculate_default_transform +from rasterio.merge import merge +from rasterio.io import MemoryFile +from contextlib import contextmanager + +import seaborn as sns +sns.set(font_scale=1.5, style="whitegrid") + +curPath = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0])) +if not curPath in sys.path: + sys.path.append(curPath) + +from misc import tPrint + +def merge_rasters(in_rasters, merge_method='first', dtype='', out_file='', boolean_gt_0=False): + """ Merge a list of rasters into a single raster file + + Args: + in_rasters (list of rasters): List of rasters to process as string paths + merge_method (str, optional): merge method. Defaults to 'first'. + dtype (str, optional): dtype to convert final raster to. Defaults to '', which maintains input raster type + out_file (str, optional): Path to create output raster. Defaults to '', which creates no raster + boolean_gt_0 (str, optional): If true, converts merged result to binary 0, 1 of values greater than 0, Defaults to False + """ + + opened_tiffs = [rasterio.open(x) for x in in_rasters] + merged, out_transform = merge(opened_tiffs, method=merge_method) + if boolean_gt_0: + merged = ((merged > 0) * 1) + dtype = 'uint8' + if dtype != '': + merged = merged.astype(dtype) + + # Create a new raster file with the merged data + metadata = opened_tiffs[0].meta.copy() + metadata.update( + {"height":merged.shape[1], + "width":merged.shape[2], + "transform":out_transform, + 'dtype':'uint8'} + ) + if out_file != '': + with rasterio.open(out_file, 'w', **metadata) as dst: + dst.write(merged) + return(merged, metadata) + +@contextmanager +def create_rasterio_inmemory(src, curData): + '''Create a rasterio object in memory from a numpy array + + :param src: data dictionary describing the rasterio template i.e. - rasterio.open().profile + :type src: rasterio metadata dictionary + :param curData: numpy array from which to create rasterio object + :type curData: numpy array + ''' + with MemoryFile() as memFile: + with memFile.open(**src) as dataset: + try: + dataset.write(curData) + except: + dataset.write_band(1, curData) + del curData + + with memFile.open() as dataset: + yield dataset + +def vectorize_raster(inR, bad_vals=[]):# TODO out_file='', smooth=False, smooth_window=3, bad_vals=None): + ''' convert input raster data to a geodatframe + + :param inR: input raster data to vectorize + :type inR: rasterio.datasetReader + :param bad_vals: list of values to ignore in conversion + :type bad_vals: list of int + :returns: geopandas data frame of [idx, value (from raster), and geometry] + :rtype: geopandas.GeoDataFrame + ''' + + data = inR.read() + ## TODO add smoothing option + #if smooth: + ## TODO add bad value filtering + idx = 0 + all_vals = [] + for cShape, value in features.shapes(data, transform=inR.transform): + if not value in bad_vals: + all_vals.append([idx, value, shape(cShape)]) + # shape(geojson.loads(json.dumps(cShape))) + idx += 1 + + return(gpd.GeoDataFrame(all_vals, columns=['idx', 'value', 'geometry'], geometry='geometry', crs=inR.crs)) + +def project_raster(srcRst, dstCrs, output_raster=''): + """ project raster to destination crs + + Args: + srcRst (_type_): _description_ + dstCrs (_type_): _description_ + output_raster (_type_): _description_ + """ + transform, width, height = calculate_default_transform(srcRst.crs, dstCrs, srcRst.width, srcRst.height, *srcRst.bounds) + kwargs = srcRst.meta.copy() + kwargs.update({ + 'crs': dstCrs, + 'transform': transform, + 'width': width, + 'height': height + }) + + #open destination raster + dstRst = np.zeros([kwargs['count'], width, height], kwargs['dtype']) + + #reproject and save raster band data + for i in range(1, srcRst.count + 1): + reproject( + source=rasterio.band(srcRst, i), + destination=dstRst, + #src_transform=srcRst.transform, + src_crs=srcRst.crs, + #dst_transform=transform, + dst_crs=dstCrs, + resampling=Resampling.nearest) + + if output_raster != '': + with rasterio.open(output_raster, 'w', *kwargs) as out_raster: + out_raster.write(dstRst) + + return([dstRst, kwargs]) + +def clipRaster(inR, inD, outFile='', crop=True): + ''' Clip input raster + + :param inR: rasterio object to clip + :type inR: rasterio.DatasetReader + :param inD: geopandas polygonal dataframe to use for clip clip extent based on crop param + :type inD: geopandas.GeoDataFrame + :param outFile: string path to write output raster, default is '' which writes nothing + :type outFile: string + :param crop: determine wether to clip based on bounding box (False) or unary_union (True). Default is True + :type crop: Boolean + :return: array of [numpy array of data, and rasterio metadata] + :rtype: array + ''' + if inD.crs != inR.crs: + inD = inD.to_crs(inR.crs) + inD = inD.buffer(0) + out_meta = inR.meta.copy() + def getFeatures(gdf): + #Function to parse features from GeoDataFrame in such a manner that rasterio wants them + return [json.loads(gdf.to_json())['features'][0]['geometry']] + if crop: + tD = gpd.GeoDataFrame([[1]], geometry=[inD.unary_union]) + else: + tD = gpd.GeoDataFrame([[1]], geometry=[box(*inD.total_bounds)]) + + coords = getFeatures(tD) + out_img, out_transform = mask(inR, shapes=coords, crop=True) + out_meta.update({"driver": "GTiff", + "height": out_img.shape[1], + "width": out_img.shape[2], + "transform": out_transform}) + if outFile != '': + with rasterio.open(outFile, "w", **out_meta) as dest: + dest.write(out_img) + return([out_img, out_meta]) + +def rasterizeDataFrame(inD, outFile='', idField='', templateRaster='', templateMeta = '', nCells=0, res=0, mergeAlg="REPLACE", re_proj=False): + """ Convert input geopandas dataframe into a raster file + + :param inD: input data frame to rasterize + :type inD: gpd.GeoDataFrame + :param outFile: output file to create from rasterized dataframe, defaults to '' which creates no file + :type outFile: string + :param idField: field in inD to rasterize, defaults to '' which sets everything to 1 + :type idField: str, optional + :param templateRaster: raster upon which to base raster creation, defaults to ''. If no template is provided, nCells or res need to be defined + :type templateRaster: str, optional + :param templateMeta: raster metadata used to create output raster, defaults to ''. If no template is provided, nCells or res need to be defined + :type templateMeta: str, optional + :param nCells: number of cells in width and height, defaults to 0 + :type nCells: int, optional + :param res: resolution of output raster in units of the crs, defaults to 0 + :type res: int, optional + :param mergeAlg: Method of aggregating overlapping features, defaults to "REPLACE"; options are "REPLACE" or "ADD" + :type mergeAlg: str, optional + :param re_proj: option to reproject inD to templateRaster if CRS do not match, defaults to False + :type re_proj: bool, optional + :return: dict of metadata used to create output raster and burned raster values + :rtype: dict of {'meta':new raster metadata, 'vals': values in new raster} + """ + ###Parameter checking + if nCells <=0 and res <=0 and templateRaster == '' and templateMeta =='': + raise(ValueError("Must define one of nCells or res")) + if nCells > 0 and res > 0 and templateRaster == '' and templateMeta =='': + raise(ValueError("Cannot define both nCells and res")) + + #Set VALUE field equal to idField + inD['VALUE'] = 1 + inD['VALUE'] = inD['VALUE'].astype('int16') + if idField != '': + inD['VALUE'] = inD[idField] + + # set merge algorithm for overlapping features + if mergeAlg == "REPLACE": + mAlg = MergeAlg.replace + elif mergeAlg == "ADD": + mAlg = MergeAlg.add + else: + raise(ValueError("MergeAlg must be one of REPLACE or ADD")) + + if templateRaster != '': + inR = rasterio.open(templateRaster) + cMeta = inR.profile.copy() + cMeta.update(count=1) + nTransform = cMeta['transform'] + if inD.crs != inR.crs: + if not re_proj: + raise(ValueError("input CRS do not match: inD - %s, templateRaster - %s" % (inD.crs, inR.crs))) + inD = inD.to_crs(inR.crs) + elif templateMeta != '': + cMeta = templateMeta + nTransform = cMeta['transform'] + if inD.crs != cMeta['crs']: + if not re_proj: + raise(ValueError("input CRS do not match: inD - %s, templateRaster - %s" % (inD.crs, inR.crs))) + inD = inD.to_crs(cMeta['crs']) + else: + bounds = inD.total_bounds + if nCells > 0: + height = nCells + width = nCells + if res > 0: + height = int(round((bounds[3] - bounds[1]) / res)) + width = int(round((bounds[2] - bounds[0]) / res)) + + b = inD.total_bounds + nTransform = rasterio.transform.from_bounds(b[0], b[1], b[2], b[3], width, height) + if inD.crs.__class__ == pyproj.crs.crs.CRS: + crs = {'init':'epsg:%s' % inD.crs.to_epsg()} + else: + crs = inD.crs + cMeta = {'count':1, 'crs': crs, 'dtype':inD['VALUE'].dtype, 'driver':'GTiff', + 'transform':nTransform, 'height':height, 'width':width} + shapes = ((row.geometry,row.VALUE) for idx, row in inD.iterrows()) + burned = features.rasterize(shapes=shapes, out_shape=(cMeta['height'], cMeta['width']), transform=nTransform, dtype=cMeta['dtype'], merge_alg=mAlg) + try: + with rasterio.open(outFile, 'w', **cMeta) as out: + out.write_band(1, burned) + return({'meta':cMeta, 'vals': burned}) + except: + print("Error writing raster") + return({'meta':cMeta, 'vals': burned}) + +def polygonizeArray(data, curRaster): + """ Convert input array (data) to a geodataframe + + :param data: numpy array of raster data. ie - rasterio.open().read() + :type data: np.array + :param curRaster: template raster object + :type curRaster: rasterio.DatasetReader + :return: geodataframe with columns row, col, val, geometry + :rtype: gpd.GeoDataFrame + """ + #Calculate resolution of cells + b = curRaster.bounds + ll = curRaster.xy(*curRaster.index(*b[0:2]),"ll") + xmin = ll[0] + ymin = ll[1] + xRes = curRaster.res[0] + yRes = curRaster.res[1] + crs = curRaster.crs + #create a dataframe equal to the size of the array + outArray = pd.DataFrame() + outArray['id'] = list(range(0, (data.shape[0] * data.shape[1]))) + rowVals = [] + colVals = [] + actualvals = [] + for row in range(0,data.shape[0]): + for col in range(0,data.shape[1]): + rowVals.append(row) + colVals.append(col) + actualvals.append(data[row,col]) + outArray['row'] = rowVals + outArray['col'] = colVals + outArray['vals'] = actualvals + #Create a polygon covering each cell + def getPolygon(x): + llX = xmin + (xRes * x['col']) + llY = ymin + (yRes * x['row']) + A = "%s %s" % (llX, llY) + B = "%s %s" % (llX, llY + yRes) + C = "%s %s" % (llX + xRes, llY + yRes) + D = "%s %s" % (llX + xRes, llY) + return(wkt.loads("POLYGON((%s,%s,%s,%s,%s))" % (A,B,C,D,A))) + outArray['geometry'] = outArray.apply(getPolygon, axis=1) + outGeo = gpd.GeoDataFrame(outArray, geometry="geometry") + outGeo.crs = crs + return(outGeo) + +def zonalStats(inShp, inRaster, bandNum=1, mask_A = None, reProj = False, minVal = '', maxVal = '', + verbose=False , rastType='N', unqVals=[], weighted=False, allTouched=False, calc_sd=False, return_df=False): + """ Run zonal statistics against an input shapefile. Returns array of SUM, MIN, MAX, and MEAN + + :param inShp: input geospatial data to summarize raster + :type inShp: string path to file of gpd.GeoDataFrame + :param inRaster: input raster to summarize + :type inRaster: string path to file or rasterio.DatasetReader + :param bandNum: band in raster to analyze, defaults to 1 + :type bandNum: int, optional + :param mask_A: mask the raster data using an identical shaped boolean mask, defaults to None + :type mask_A: np.array, optional + :param reProj: whether to reproject data to match, if not, raise a ValueError if CRS mismatch between inShp and inRaster, defaults to False + :type reProj: bool, optional + :param minVal: if defined, will only calculate statistics on values above this number, defaults to '' + :type minVal: number, optional + :param maxVal: if defined, will only calculate statistics on values below this number, defaults to '' + :type maxVal: number, optional + :param verbose: provide additional text updates, defaults to False + :type verbose: bool, optional + :param rastType: Type of raster, defaults to 'N' as numerical or 'C' as categorical. If 'C' is used, you should provide unqVals + :type rastType: str, optional + :param unqVals: List of unique values to search for in raster, defaults to [] + :type unqVals: list of int, optional + :param weighted: apply weighted zonal calculations. This will determine the % overlap for each + raster cell in the defined AOI. Will apply weights in calculations of numerical statistics, defaults to False + :type weighted: bool, optional + :param allTouched: whether to include all cells touched in raster calculation, passed to rasterio rasterize function, defaults to False + :type allTouched: bool, optional + :param calc_sd: include the standard deviation in calculation, defaults to False + :type calc_sd: bool, optional + :param return_df: if true, return result as data frame; defaults to False + :type return_df: boolean, optional + :raises ValueError: If CRS mismatch between inShp and inRaster + :return: array of zonal results - one entry for every feature in inShp. Each entry is SUM, MIN, MAX, MEAN, SD (optional) + :rtype: array + """ + if isinstance(inShp, str): + inVector = gpd.read_file(inShp) + else: + inVector = inShp + if isinstance(inRaster, str): + curRaster = rasterio.open(inRaster, 'r') + else: + curRaster = inRaster + + # If mask is not none, apply mask + if mask_A is not None: + curRaster.write_mask(mask_A) + + outputData=[] + if inVector.crs != curRaster.crs: + if reProj: + inVector = inVector.to_crs(curRaster.crs) + else: + raise ValueError("Input CRS do not match") + fCount = 0 + tCount = len(inVector['geometry']) + #generate bounding box geometry for raster bbox + b = curRaster.bounds + rBox = box(b[0], b[1], b[2], b[3]) + for idx, row in inVector.iterrows(): + geometry = row['geometry'] + fCount = fCount + 1 + try: + #This test is used in case the geometry extends beyond the edge of the raster + # I think it is computationally heavy, but I don't know of an easier way to do it + if not rBox.contains(geometry): + geometry = geometry.intersection(rBox) + try: + if fCount % 1000 == 0 and verbose: + tPrint("Processing %s of %s" % (fCount, tCount) ) + # get pixel coordinates of the geometry's bounding box + ul = curRaster.index(*geometry.bounds[0:2]) + lr = curRaster.index(*geometry.bounds[2:4]) + # read the subset of the data into a numpy array + window = ((float(lr[0]), float(ul[0]+1)), (float(ul[1]), float(lr[1]+1))) + + if mask_A is not None: + data = curRaster.read(bandNum, window=window, masked = True) + else: + data = curRaster.read(bandNum, window=window, masked = False) + + if weighted: + allTouched = True + #Create a grid of the input raster (data) + rGrid = polygonizeArray(data, geometry.bounds, curRaster) + #Clip the grid by the input geometry + rGrid['gArea'] = rGrid.area + rGrid['newArea'] = rGrid.intersection(geometry).area + #Store the percent overlap + rGrid['w'] = rGrid['newArea']/rGrid['gArea'] + newData = data + for idx, row in rGrid.iterrows(): + newData[row['row'], row['col']] = data[row['row'], row['col']] * row['w'] + data = newData + + ''' + # Mask out no-data in data array + if 'nodata' in curRaster.profile.keys(): + no_data_val = curRaster.profile['nodata'] + #data[data == no_data_val] = np.nan + data[data == no_data_val] = 0 + ''' + + # create an affine transform for the subset data + t = curRaster.transform + shifted_affine = Affine(t.a, t.b, t.c+ul[1]*t.a, t.d, t.e, t.f+lr[0]*t.e) + + # rasterize the geometry + mask = rasterize( + [(geometry, 0)], + out_shape=data.shape, + transform=shifted_affine, + fill=1, + all_touched=allTouched, + dtype=np.uint8) + + # create a masked numpy array + masked_data = np.ma.array(data=data, mask=mask.astype(bool)) + if rastType == 'N': + if minVal != '' or maxVal != '': + if minVal != '': + masked_data = np.ma.masked_where(masked_data < minVal, masked_data) + if maxVal != '': + masked_data = np.ma.masked_where(masked_data > maxVal, masked_data) + if masked_data.count() > 0: + results = [np.nansum(masked_data), np.nanmin(masked_data), + np.nanmax(masked_data), np.nanmean(masked_data)] + else : + results = [-1, -1, -1, -1] + else: + results = [np.nansum(masked_data), np.nanmin(masked_data), + np.nanmax(masked_data), np.nanmean(masked_data)] + if calc_sd: + try: + results.append(np.std(masked_data)) + except: + results.append(-1) + if rastType == 'C': + if len(unqVals) > 0: + masked_unq = np.unique(masked_data, return_counts=True) + xx = dict([x for x in list(zip(masked_unq[0], masked_unq[1])) if x[0] != 'masked']) + results = [xx.get(i, 0) for i in unqVals] + else: + results = np.unique(masked_data, return_counts=True) + outputData.append(results) + except Exception as e: + if verbose: + print(e) + if rastType == 'N': + outputData.append([-1, -1, -1, -1]) + else: + outputData.append([-1 for x in unqVals]) + except: + print("Error processing %s" % fCount) + if return_df: + cols = ["SUM","MIN","MAX","MEAN"] + if calc_sd: + cols.append("SD") + outputData = pd.DataFrame(outputData, columns=cols) + return(outputData) + +def standardizeInputRasters(inR1, inR2, inR1_outFile='', resampling_type="nearest"): + ''' Standardize inR1 to inR2: changes crs, extent, and resolution. + + :param inR1: rasterio object for raster to be modified + :type inR1: ratserio.DatasetReader + :param inR2: rasterio object to be standardized to + :type inR12 ratserio.DatasetReader + :param inR1_outfile: path to create output raster file of standardized inR1, default is '', which means nothing is written + :type inR1: string + :param resampling_type: how to perfrom spatial resampling; options are nearest (default), cubic, or sum + :type resampling_type: string + :return: array of numpy array, and rasterio metadata + :rtype: array + ''' + if inR1.crs != inR2.crs: + bounds = gpd.GeoDataFrame(pd.DataFrame([[1, box(*inR2.bounds)]], columns=["ID","geometry"]), geometry='geometry', crs=inR2.crs) + bounds = bounds.to_crs(inR1.crs) + b2 = bounds.total_bounds + boxJSON = [{'type': 'Polygon', 'coordinates': [[[b2[0], b2[1]],[b2[0], b2[3]],[b2[2], b2[3]],[b2[2], b2[1]],[b2[0], b2[1]]]]}] + else: + b2 = inR2.bounds + boxJSON = [{'type': 'Polygon', 'coordinates': [[[b2.left, b2.bottom],[b2.left, b2.top],[b2.right, b2.top],[b2.right, b2.bottom],[b2.left, b2.bottom]]]}] + #Clip R1 to R2 + #Get JSON of bounding box + out_img, out_transform = mask(inR1, boxJSON, crop=True) + out_img[out_img<0] = 0 + out_meta = inR1.meta.copy() + #Re-scale resolution of R1 to R2 + newArr = np.empty(shape=(1, inR2.shape[0], inR2.shape[1])) + + if resampling_type == "cubic": + resampling_type = Resampling.cubic + elif resampling_type == "nearest": + resampling_type = Resampling.nearest + elif resampling_type == "sum": + resampling_type = Resampling.sum + reproject(out_img, newArr, src_transform=out_transform, dst_transform=inR2.transform, src_crs=inR1.crs, dst_crs=inR2.crs, resampling=resampling_type) + out_meta.update({"driver": "GTiff", + "height": newArr.shape[1], + "width": newArr.shape[2], + "transform": inR2.transform, + "crs": inR2.crs}) + if inR1_outFile != "": + with rasterio.open(inR1_outFile, "w", **out_meta) as dest: + dest.write(newArr.astype(out_meta['dtype'])) + return([newArr.astype(out_meta['dtype']), out_meta]) + +def jaccardIndex(inR1, inR2): + """ Calculate the jaccard index on two binary input raster objects; Reference: https://en.wikipedia.org/wiki/Jaccard_index + + :param inR1: binary rasterio raster object to compare; needs to be same shape as inR2 + :type inR1: rasterio.DatasetReader + :param inR2: binary rasterio raster object to compare; needs to be same shape as inR1 + :type inR2: rasterio.DatasetReader + :raises ValueError: if inR1 and inR2 are different shapes + :return: index comparing similarity of input raster datasets + :rtype: float + """ + if inR1.shape != inR2.shape: + print(inR1.shape) + print(inR2.shape) + raise ValueError("Shape of input rasters do not match") + #Add the two rasters together and get the unique tabulation + inC = inR1.read() + inR2.read() + xx = np.unique(inC, return_counts=True) + outDict = {} + for itemIdx in range(0, len(xx[0])): + outDict[xx[0][itemIdx]] = xx[1][itemIdx] + + #The resulting could have some weird numbers, but values 1 and 2 should be the focus. + # 1 - Only one area defines it as urban + # 2 - Both areas define cell as urban + # Jaccard is ratio of 2 / 1+2 + try: + jIdx = outDict[2] / float(outDict[2] + outDict[1]) + return jIdx + except: + return -1 \ No newline at end of file diff --git a/src/template/indicators.py b/src/template/indicators.py deleted file mode 100644 index b98824f..0000000 --- a/src/template/indicators.py +++ /dev/null @@ -1,83 +0,0 @@ -import pandas -import pycountry -import requests - - -class WorldBankIndicatorsAPI: - URL = "https://api.worldbank.org/v2/country" - - def _get_country_code(self, country): - """ - Using `pycountry`, return the ISO 3166-1 alpha-3 country code for corresponding query term. - - See also: - https://github.com/flyingcircusio/pycountry - - Parameters - ---------- - country : str - - Returns - ------- - str - ISO 3166-1 alpha-3 country code for corresponding query term. - - Raises - ------ - LookupError - If the query term is not a valid country. - """ - return pycountry.countries.search_fuzzy(country)[0].alpha_3 - - def _get(self, indicator, country: str = "all", params: dict = {}): - """ - Retrieve a response, valid JSON response or error, from the World Bank Indicators API. - - See also: - https://datahelpdesk.worldbank.org/knowledgebase/articles/889392-about-the-indicators-api-documentation - - Parameters - ---------- - indicator : str - country : str, optional - params : dict, optional - - Returns - ------- - requests.models.Response - Return JSON response from the World Bank Indicators API. - """ - url = f"{self.URL}/{country}/indicator/{indicator}" - - return requests.get(url, params) - - def query(self, indicator, country: list = "all", params: dict = {}): - """ - Retrieve a response, valid JSON response or error, from the World Bank Indicators API. - - See also: - https://datahelpdesk.worldbank.org/knowledgebase/articles/889392-about-the-indicators-api-documentation - - Parameters - ---------- - indicator : str - World Bank API Indicator. - country : list, optional - List of countries. The country name is converted to ISO 3166-1 alpha-3 country code. - params : dict, optional - World Bank API Indicator Query Strings. - - Returns - ------- - pandas.core.frame.DataFrame - Return a Pandas DataFrame obtained with response data from World Bank Indicators API. - """ - if isinstance(country, list): - country = ";".join([self._get_country_code(c) for c in country]) - - params.update({"format": "json", "per_page": 1000}) - - response = self._get(indicator, country, params) - data = response.json()[-1] - - return pandas.json_normalize(data)