diff --git a/TAA2/.ipynb_checkpoints/tutorial-checkpoint.ipynb b/TAA2/.ipynb_checkpoints/tutorial-checkpoint.ipynb new file mode 100644 index 0000000..04cc460 --- /dev/null +++ b/TAA2/.ipynb_checkpoints/tutorial-checkpoint.ipynb @@ -0,0 +1,3298 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cbd68ab3-f04b-434f-a956-e730535c9ee5", + "metadata": { + "id": "cbd68ab3-f04b-434f-a956-e730535c9ee5" + }, + "source": [ + "### TAA2: Natural Hazard Risk Assessment using Open Data" + ] + }, + { + "cell_type": "markdown", + "id": "4c8cc742-23a7-4895-8d2a-7e826d8a23b8", + "metadata": { + "id": "4c8cc742-23a7-4895-8d2a-7e826d8a23b8" + }, + "source": [ + "Within this tutorial, we are going to use publicly available hazard data and exposure data to do a risk assessment for the Netherlands. More specifically, we will look at damage due to wind storms and flooding. We will use both Copernicus Land Cover data and OpenStreetMap to estimate the potential damage of natural hazards to the built environment.\n", + "\n", + "We will first download, access and explore hazard data retrieved from the Copernicus Climate Data Copernicus Store and the European Commission Joint Research Centre. We will also explore the power of OpenStreetMap that provides vector data. We will learn how to extract information from OpenStreetMap, how you can explore and visualize this. Lastly, we will use Copernicus Land Cover data to estimate the damage to specific land-uses, whereas we will use OpenStreetMap to assess the potential damage to the road system." + ] + }, + { + "cell_type": "markdown", + "id": "4355fca9-3e21-4556-a5d0-3e1577c68643", + "metadata": { + "id": "4355fca9-3e21-4556-a5d0-3e1577c68643" + }, + "source": [ + "### Learning Objectives\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "04dd18de-459a-4cb4-891e-cc3c98e76e7a", + "metadata": { + "id": "04dd18de-459a-4cb4-891e-cc3c98e76e7a" + }, + "source": [ + "- To understand the use of **OSMnx** to extract geospatial data from OpenStreetmap.\n", + "- To know how to download data from the Copernicus Climate Data Store using the `cdsapi` and access it through Python.\n", + "- To know how to access and open information from the Copernicus Land Monitoring System. Specifically the Corine Land Cover data.\n", + "\n", + "- To be able to open and visualize this hazard data.\n", + "- To know how to rasterize vector data through using **Geocube**.\n", + "- To know how to visualise vector and raster data.\n", + "- To understand the basic functioning of **Matplotlib** to create a map.\n", + "\n", + "- To understand the basic approach of a natural hazard risk assessment.\n", + "- To be able to use the `DamageScanner` to do a damage assessment.\n", + "- To interpret and compare the damage estimates." + ] + }, + { + "cell_type": "markdown", + "id": "88a7cd45-4394-44fb-ba1b-e52464223d42", + "metadata": { + "id": "88a7cd45-4394-44fb-ba1b-e52464223d42" + }, + "source": [ + "### 1. Introducing the packages\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "961d01ad-b5d4-4486-9d00-04fd00142a19", + "metadata": { + "id": "961d01ad-b5d4-4486-9d00-04fd00142a19" + }, + "source": [ + "Within this tutorial, we are going to make use of the following packages:\n", + "\n", + "[**GeoPandas**](https://geopandas.org/) is a Python package that extends the datatypes used by pandas to allow spatial operations on geometric types.\n", + "\n", + "[**OSMnx**](https://osmnx.readthedocs.io/) is a Python package that lets you download geospatial data from OpenStreetMap and model, project, visualize, and analyze real-world street networks and any other geospatial geometries. You can download and model walkable, drivable, or bikeable urban networks with a single line of Python code then easily analyze and visualize them. You can just as easily download and work with other infrastructure types, amenities/points of interest, building footprints, elevation data, street bearings/orientations, and speed/travel time.\n", + "\n", + "[**NetworkX**](https://networkx.org/) is a Python package for the creation, manipulation, and study of the structure, dynamics, and functions of complex networks.\n", + "\n", + "[**Matplotlib**](https://matplotlib.org/) is a comprehensive Python package for creating static, animated, and interactive visualizations in Python. Matplotlib makes easy things easy and hard things possible.\n", + "\n", + "[**Geocube**](https://corteva.github.io/geocube) is a Python package to convert geopandas vector data into rasterized data.\n", + "\n", + "[**xarray**](https://docs.xarray.dev/) is a Python package that allows for easy and efficient use of multi-dimensional arrays.\n", + "\n", + "Import the packages in the cell below" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "b1d683ee-d2b5-49a5-9b31-9ab50039f428", + "metadata": { + "id": "b1d683ee-d2b5-49a5-9b31-9ab50039f428" + }, + "outputs": [], + "source": [ + "import cdsapi\n", + "import shapely\n", + "import matplotlib\n", + "import urllib3\n", + "import pyproj\n", + "import contextily as cx\n", + "\n", + "import osmnx as ox\n", + "import numpy as np\n", + "import xarray as xr\n", + "import geopandas as gpd\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import networkx as nx\n", + "import cdsapi\n", + "\n", + "from matplotlib.colors import LinearSegmentedColormap,ListedColormap\n", + "from matplotlib.patches import Patch\n", + "from geocube.api.core import make_geocube\n", + "from zipfile import ZipFile\n", + "from io import BytesIO\n", + "from urllib.request import urlopen\n", + "from zipfile import ZipFile\n", + "from tqdm import tqdm\n", + "\n", + "urllib3.disable_warnings()" + ] + }, + { + "cell_type": "markdown", + "id": "d3208479-d07e-4d6d-afd7-a9944b9630c0", + "metadata": { + "id": "d3208479-d07e-4d6d-afd7-a9944b9630c0" + }, + "source": [ + "Import error? Not all of the packages were installed already. Make sure to install the missing packages using pip install in the cell below and then run the cell above again:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d395181b-53d5-48de-84ff-55e27da494a2", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "d395181b-53d5-48de-84ff-55e27da494a2", + "outputId": "b5418cb6-c160-4ec0-ed2a-f539eb9d5568" + }, + "outputs": [], + "source": [ + " !pip install cdsapi\n", + " !pip install geocube\n", + " !pip install contextily\n", + " !pip install --pre osmnx\n", + " !pip install 'cdsapi>=0.7.0'" + ] + }, + { + "cell_type": "markdown", + "id": "981898d2-5f8f-4990-a236-b1cfe2c7008e", + "metadata": { + "id": "981898d2-5f8f-4990-a236-b1cfe2c7008e" + }, + "source": [ + "### 2. Downloading and accessing natural hazard data\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "d7693fcc-a0cf-4ed4-a0d0-e3a00b917547", + "metadata": { + "id": "d7693fcc-a0cf-4ed4-a0d0-e3a00b917547" + }, + "source": [ + "We will first download and explore windstorm and flood data for the Netherlands.\n", + "\n", + "#### Windstorm Data\n", + "
\n", + "\n", + "The windstorm data will be downloaded from the [Copernicus Climate Data Store](https://cds.climate.copernicus.eu/). As we have seen during the lecture, and as you can also see by browsing on this website, there is an awful lot of climate data available through this Data Store. As such, it is very valuable to understand how to access and download this information to use within an analysis. To keep things simple, we only download one dataset today: [A winter windstorm](https://cds.climate.copernicus.eu/cdsapp#!/dataset/sis-european-wind-storm-indicators?tab=overview).\n", + "\n", + "We will do so using an **API**, which is the acronym for application programming interface. It is a software intermediary that allows two applications to talk to each other. APIs are an accessible way to extract and share data within and across organizations. APIs are all around us. Every time you use a rideshare app, send a mobile payment, or change the thermostat temperature from your phone, you’re using an API.\n", + "\n", + "However, before we can access this **API**, we need to take a few steps which can be found on the [CDSAPI setup webpage of the Copernicus Climate Data Store](https://cds-beta.climate.copernicus.eu/how-to-api/). The first step is to register yourself on the [Copernicus Climate Data Store](https://cds.climate.copernicus.eu/) portal. \n", + "\n", + "Now, the next step is to request access to the dataset. As you can see in the cell below, we download a specific windstorm that has occured on the 28th of October in 2013. This is storm [Carmen (also called St Jude)](https://en.wikipedia.org/wiki/St._Jude_storm). To download the relevant windstorm data, fill out the associated [dataset form](https://cds-beta.climate.copernicus.eu/datasets/sis-european-wind-storm-indicators?tab=download) and make sure to **agree to the Terms of Use**. \n", + "\n", + "The last step is to access the API. You can now login on the website of the [Copernicus Climate Data Store](https://cds.climate.copernicus.eu/). After you login, you can click on your name in the top right corner of the webpage (next to the login button). On the personal page that has just opened, you will find your personal access token **API**. You need to add this in the cell below to be able to download the windstorm." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4736833f-c0ec-48f4-8c29-1721ba2ecb7d", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4736833f-c0ec-48f4-8c29-1721ba2ecb7d", + "outputId": "2cd3a582-faa3-4293-be54-ff38771e4605" + }, + "outputs": [], + "source": [ + "apikey = '' #add your personal API\n", + " \n", + "c = cdsapi.Client(key=f\"{apikey}\", url=\"https://cds-beta.climate.copernicus.eu/api\")\n", + " \n", + "c.retrieve(\n", + " 'sis-european-wind-storm-indicators',\n", + " {\n", + " 'variable': 'all',\n", + " 'format': 'zip',\n", + " 'product': 'windstorm_footprints',\n", + " 'year': '2013',\n", + " 'month': '10',\n", + " 'day': '28',\n", + " },\n", + " 'Carmen.zip')" + ] + }, + { + "cell_type": "markdown", + "id": "0ec192f1-8ac1-4e61-ac8f-c01d496e157f", + "metadata": { + "id": "0ec192f1-8ac1-4e61-ac8f-c01d496e157f" + }, + "source": [ + "#### Flood Data\n", + "
\n", + "\n", + "The flood data we will extract from a repository maintained by the European Commission Joint Research Centre. We will download river flood hazard maps from their [Flood Data Collection](https://data.jrc.ec.europa.eu/dataset/1d128b6c-a4ee-4858-9e34-6210707f3c81).\n", + "\n", + "Here we do not need to use an API and we also do not need to register ourselves, so we can download any of the files directly. To do so, we use the `urllib` package." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c30f3b19-cba4-4f4a-a902-082e396b7ac4", + "metadata": { + "id": "c30f3b19-cba4-4f4a-a902-082e396b7ac4" + }, + "outputs": [], + "source": [ + "## this is the link to the 1/100 flood map for Europe\n", + "zipurl = 'https://jeodpp.jrc.ec.europa.eu/ftp/jrc-opendata/FLOODS/EuropeanMaps/floodMap_RP100.zip'\n", + "\n", + "# The path where the downloaded flood map will be extracted, this is the folder of this Google Collaboratory instance. NOTE: a new instance will have this directory be cleared.\n", + "data_path = \"\"\n", + "\n", + "# and now we open and extract the data\n", + "with urlopen(zipurl) as zipresp:\n", + " with ZipFile(BytesIO(zipresp.read())) as zfile:\n", + " zfile.extractall(data_path)" + ] + }, + { + "cell_type": "markdown", + "id": "e8baa489-3b9c-4d16-afdf-359651d2f6ba", + "metadata": { + "id": "e8baa489-3b9c-4d16-afdf-359651d2f6ba" + }, + "source": [ + "The download and zip in the cell above sometimes does not work. If that is indeed the case (e.g., when it seems to remain stuck), download the files manually through the link and upload them in the data folder for this week (as explained at the start of this tutorial.)" + ] + }, + { + "cell_type": "markdown", + "id": "94cb3103-bc54-4670-9936-f299561190f6", + "metadata": { + "id": "94cb3103-bc54-4670-9936-f299561190f6" + }, + "source": [ + "#### Set location to explore\n", + "---\n", + "Before we continue, we need to specify our location of interest. This should be a province that will have some flooding and relative high wind speeds occuring (else we will find zero damage). We specify the region of interest in the cell below by using the `geocode_to_gdf()` function." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "edb7b64e-de75-4490-ac72-bad321d4da2c", + "metadata": { + "id": "edb7b64e-de75-4490-ac72-bad321d4da2c" + }, + "outputs": [], + "source": [ + "place_name = \"Kampen, The Netherlands\" ### But you could also consider a city in Zeeland, for example.\n", + "area = ox.geocode_to_gdf(place_name)" + ] + }, + { + "cell_type": "markdown", + "id": "9bd3821f-16dd-4e7b-8ac6-a46475704afd", + "metadata": { + "id": "9bd3821f-16dd-4e7b-8ac6-a46475704afd" + }, + "source": [ + "### 3. Exploring the natural hazard data\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "424d77ba-32df-44c4-a565-b197b7e4cefc", + "metadata": { + "id": "424d77ba-32df-44c4-a565-b197b7e4cefc" + }, + "source": [ + "#### Windstorm Data\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "8b379bcc-84a2-4bb6-86a6-d0e3ad0d1c84", + "metadata": { + "id": "8b379bcc-84a2-4bb6-86a6-d0e3ad0d1c84" + }, + "source": [ + "As you can see in the section above, we have downloaded the storm footprint in a zipfile. Let's open the zipfile and load the dataset using the `xarray` package through the `open_dataset()` function." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "64d33537-8db8-4def-89ee-2387ec993831", + "metadata": { + "id": "64d33537-8db8-4def-89ee-2387ec993831" + }, + "outputs": [], + "source": [ + "with ZipFile('Carmen.zip') as zf:\n", + "\n", + " # Let's get the filename first\n", + " file = zf.namelist()[0]\n", + "\n", + " # And now we can open and select the file within Python\n", + " with zf.open(file) as f:\n", + " windstorm_europe = xr.open_dataset(f)" + ] + }, + { + "cell_type": "markdown", + "id": "375410e2-ebe5-4f4d-b924-ad15e8fb9d59", + "metadata": { + "id": "375410e2-ebe5-4f4d-b924-ad15e8fb9d59" + }, + "source": [ + "Let's have a look at the storm we have downloaded!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7d35bb91-0705-4d80-b063-adabc74cc353", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 490 + }, + "id": "7d35bb91-0705-4d80-b063-adabc74cc353", + "outputId": "f6fbb7c5-9649-41db-ca5f-0251faa6357a" + }, + "outputs": [], + "source": [ + "windstorm_europe['FX'].plot()" + ] + }, + { + "cell_type": "markdown", + "id": "13e8caf3-c5c3-4970-b923-b58d1fe007f8", + "metadata": { + "id": "13e8caf3-c5c3-4970-b923-b58d1fe007f8" + }, + "source": [ + "Unfortunately, our data does not have a proper coordinate system defined yet. As such, we will need to use the `rio.write_crs()` function to set the coordinate system to **EPSG:4326** (the standard global coordinate reference system).\n", + "\n", + "We also need to make sure that the functions will know what the exact parameters are that we have to use for our spatial dimenions (e.g. longitude and latitude). It prefers to be named `x` and `y`. So we use the `rename()` function before we use the `set_spatial_dims()` function." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5ca7b6ec-a394-4e3c-82dd-8a59ce029563", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 291 + }, + "id": "5ca7b6ec-a394-4e3c-82dd-8a59ce029563", + "outputId": "8bd1709a-1525-4d4d-e349-84ef40dce012" + }, + "outputs": [], + "source": [ + "windstorm_europe. #add CRS\n", + "windstorm_europe = windstorm_europe.rename({'Latitude': 'y','Longitude': 'x'})\n", + "windstorm_europe.rio.set_spatial_dims(x_dim=\"x\",y_dim=\"y\", inplace=True)" + ] + }, + { + "cell_type": "markdown", + "id": "08e41966-7273-4521-9b27-4c9498a66e0b", + "metadata": { + "id": "08e41966-7273-4521-9b27-4c9498a66e0b" + }, + "source": [ + "
\n", + "Question 1: Climate data is often stored as a netCDF file. Please describe what a netCDF file is. Which information is stored in the netCDF file we have downloaded for the windstorm? What type of metadata does it contain?\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "8ba5e684-f658-42e9-bded-bbb47ced24e4", + "metadata": { + "id": "8ba5e684-f658-42e9-bded-bbb47ced24e4" + }, + "source": [ + "Following, we also make sure it will be in the European coordinate system **EPSG:3035** to ensure we can easily use it together with the other data. To do so, we use the `rio.reproject()` function. You can simple add the number of the coordinate system." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8b276083-7825-4576-832b-129566f65222", + "metadata": { + "id": "8b276083-7825-4576-832b-129566f65222" + }, + "outputs": [], + "source": [ + "windstorm_europe = windstorm_europe. # add reproject" + ] + }, + { + "cell_type": "markdown", + "id": "0650103f-eed7-43f6-b9ef-a221781e356a", + "metadata": { + "id": "0650103f-eed7-43f6-b9ef-a221781e356a" + }, + "source": [ + "Now we have all the information to clip the windstorm data to our area of interest:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "86dbfe52-1484-48fd-9dee-fc6064fe343b", + "metadata": { + "id": "86dbfe52-1484-48fd-9dee-fc6064fe343b" + }, + "outputs": [], + "source": [ + "windstorm_map = windstorm_europe.rio.clip(area.envelope.values, area.crs)" + ] + }, + { + "cell_type": "markdown", + "id": "237c142f-2741-41bf-bace-96b6fede47f2", + "metadata": { + "id": "237c142f-2741-41bf-bace-96b6fede47f2" + }, + "source": [ + "And let's have a look as well by using the `plot()` function. Please note that the legend is in meters per second." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f2b8e8ca-6a58-44df-8981-b040cc55b3b0", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 506 + }, + "id": "f2b8e8ca-6a58-44df-8981-b040cc55b3b0", + "outputId": "f34f6dcf-303a-4c67-d18b-2d604df8ec5b" + }, + "outputs": [], + "source": [ + "windstorm_map['FX'] # add plot function" + ] + }, + { + "cell_type": "markdown", + "id": "4bded755-8d9b-41a0-bd6e-a25000bc7486", + "metadata": { + "id": "4bded755-8d9b-41a0-bd6e-a25000bc7486" + }, + "source": [ + "#### Flood Data\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "6ef96754-17bc-4d02-92ab-bb06280015a5", + "metadata": { + "id": "6ef96754-17bc-4d02-92ab-bb06280015a5" + }, + "source": [ + "And similarly, we want to open the flood map. But now we do not have to unzip the file anymore and we can directly open it through using `xarray`:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "b78db556-c66c-46a0-9615-b98e26b9e57f", + "metadata": { + "id": "b78db556-c66c-46a0-9615-b98e26b9e57f" + }, + "outputs": [], + "source": [ + "flood_map_path = 'floodmap_EFAS_RP100_C.tif'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "555fab92-0c74-426e-bcfe-655cf6b25682", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 291 + }, + "id": "555fab92-0c74-426e-bcfe-655cf6b25682", + "outputId": "90525d96-e592-4918-9fc0-ab4b9dc95784" + }, + "outputs": [], + "source": [ + "flood_map = xr.open_dataset(flood_map_path, engine=\"rasterio\")\n", + "flood_map" + ] + }, + { + "cell_type": "markdown", + "id": "5eb3c24d-4ed2-4717-befc-67e52e1bbbea", + "metadata": { + "id": "5eb3c24d-4ed2-4717-befc-67e52e1bbbea" + }, + "source": [ + "And let's make sure we set all the variables and the CRS correctly again to be able to open the data properly. Note that we should now use **EPSG:3035**. This is the standard coordinate system for Europe, in meters (instead of degrees)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b7e6de85-b165-4b7e-85ea-d09fe6bf9024", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 291 + }, + "id": "b7e6de85-b165-4b7e-85ea-d09fe6bf9024", + "outputId": "14296427-2a11-432e-a17b-c3a2f163b201" + }, + "outputs": [], + "source": [ + "flood_map.rio.write_crs(3035, inplace=True)\n", + "flood_map.rio.set_spatial_dims(x_dim=\"x\",y_dim=\"y\", inplace=True)" + ] + }, + { + "cell_type": "markdown", + "id": "9ebad344-dd4b-4c37-bafe-2464f11a79b2", + "metadata": { + "id": "9ebad344-dd4b-4c37-bafe-2464f11a79b2" + }, + "source": [ + "Now it is pretty difficult to explore the data for our area of interest, so let's clip the flood data. \n", + "\n", + "We want to clip our flood data to our chosen area. The code, however, is very inefficient and will run into memories issues on Google Colab. As such, we first need to clip it by using a bounding box, followed by the actual clip.\n", + "\n", + "
\n", + "Question 2: Please provide the lines of code below in which you show how you have clipped the flood map to your area.\n", + "
\n", + "\n", + "*A few hints*:\n", + "\n", + "* carefully read the documentation of the `.clip_box()` function of rioxarray. Which information do you need?\n", + "* is the GeoDataFrame of your region (the area GeoDataframe) in the same coordinate system? Perhaps you need to convert it using the `.to_crs()` function.\n", + "* how do you get the bounds from your area GeoDataFrame?\n", + "* The final step of the clip would be to use the `.rio.clip()` function, using the actual area file and the flood map clipped to the bounding box. Please note that you should **not** use the envelope here, like we did in the previous clip. Here we really want to use the exact geometry values.\n", + "\n", + "As you will see, we first clip it very efficiently using the bounding box. After that, we do an exact clip." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "12a22299-6507-45b3-b4ef-1321a193ad8f", + "metadata": { + "id": "12a22299-6507-45b3-b4ef-1321a193ad8f" + }, + "outputs": [], + "source": [ + "min_lon = area.to_crs(epsg=3035).bounds.minx.values[0]\n", + "min_lat = area.to_crs(epsg=3035).bounds.miny #complete function\n", + "max_lon = area.to_crs(epsg=3035).bounds #complete function\n", + "max_lat = area.to_crs(epsg=3035). #complete function\n", + "\n", + "flood_map_area = flood_map.rio.clip_box #complete function\n", + "flood_map_area = flood_map_area.rio.clip( #add geometry values, area.crs)" + ] + }, + { + "cell_type": "markdown", + "id": "c744f4ff-e7c2-4b1b-b366-9ebd577f76bd", + "metadata": { + "id": "c744f4ff-e7c2-4b1b-b366-9ebd577f76bd" + }, + "source": [ + "And let's have a look as well. Please note that the legend is in meters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "58f23727-c8c0-4379-95f7-bc41ba5b3c6e", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 506 + }, + "id": "58f23727-c8c0-4379-95f7-bc41ba5b3c6e", + "outputId": "da748cee-b5d4-46c2-e8fb-36ce6c41385d" + }, + "outputs": [], + "source": [ + "flood_map_area['band_data'].plot(cmap='Blues',vmax=10)" + ] + }, + { + "cell_type": "markdown", + "id": "250b28b1-6da5-4700-9a17-5aa18967c120", + "metadata": { + "id": "250b28b1-6da5-4700-9a17-5aa18967c120" + }, + "source": [ + "
\n", + "Question 3: Now that we have both wind and flood maps, comment on their spatial resolution. What would the impact of the different in resolution for the outcome of your risk assessment?\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "c2c98ee1-d8f8-4eba-bfd2-36f26e849279", + "metadata": { + "id": "c2c98ee1-d8f8-4eba-bfd2-36f26e849279" + }, + "source": [ + "### 4. Downloading and exploring Land Cover data and Land Use data\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "d0402ee8-6460-4db0-b216-b16b88ff2c56", + "metadata": { + "id": "d0402ee8-6460-4db0-b216-b16b88ff2c56" + }, + "source": [ + "We will explore rasterized Corine Land Cover data and land use data retrieved from OpenStreetMap." + ] + }, + { + "cell_type": "markdown", + "id": "8ccebb6a-8c7b-4c7f-b974-899e15c9631b", + "metadata": { + "id": "8ccebb6a-8c7b-4c7f-b974-899e15c9631b" + }, + "source": [ + "#### Download and access Copernicus Land Cover data\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "672472d8-aff1-498f-ac36-41082ac32c4e", + "metadata": { + "id": "672472d8-aff1-498f-ac36-41082ac32c4e" + }, + "source": [ + "We will now download the [Corine Land Cover](https://land.copernicus.eu/pan-european/corine-land-cover) data.\n", + "\n", + "To do so, we will first have to register ourselves again on the website. Now click on the Login button in the top right corner to login on the website. There are many interesting datasets on this website, but we just want to download the Corine Land Cover data, and specifically the latest version: [Corine Land Cover 2018](https://land.copernicus.eu/pan-european/corine-land-cover/clc2018?tab=download). To do so, click on the large green Download button. Now please select the **Corine Land Cover - 100 meter** and add this to your cart. Next, go to your cart and click on Process download request. After this, the requested data can be downloaded via the 'downloading process page'. After hitting Download file, your download should start any minute.\n", + "\n", + "Slightly annoying, the file you have downloaded is double zipped. Its slightly inconvenient to open this through Python and within Google Drive. So let's unzip it twice outside of Python (on your local machine) and then direct yourself to the `DATA` directory within the unzipped file. Here you can find a file called `U2018_CLC2018_V2020_20u1.tif`. Drop this file into this week's data directory, as specified at the start of this tutorial when we mounted our Google Drive." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "5e1c9079-cde0-4be2-8b72-f7403d5f0e4b", + "metadata": { + "id": "5e1c9079-cde0-4be2-8b72-f7403d5f0e4b" + }, + "outputs": [], + "source": [ + "CLC_location = 'U2018_CLC2018_V2020_20u1.tif'" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "baaa699e-1ba0-4ed8-9996-38d8cc81578b", + "metadata": { + "id": "baaa699e-1ba0-4ed8-9996-38d8cc81578b" + }, + "outputs": [], + "source": [ + "CLC = xr.open_dataset(CLC_location, engine=\"rasterio\")" + ] + }, + { + "cell_type": "markdown", + "id": "d263e20d-d88b-4cf3-ad5c-c1ff2d93ad6b", + "metadata": { + "id": "d263e20d-d88b-4cf3-ad5c-c1ff2d93ad6b" + }, + "source": [ + "Similarly to the flood map data, we need to do a two-stage clip again (like we did before in this tutorial to ensure we get only our area of interest without exceeding our RAM." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "8299869a-2724-44c6-b5af-d134f7b9aece", + "metadata": { + "id": "8299869a-2724-44c6-b5af-d134f7b9aece" + }, + "outputs": [], + "source": [ + "CLC_region = CLC # complete function\n", + "CLC_region = CLC_region # complete function" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8706a9da-4336-4f06-a8a7-4c825639dae4", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 291 + }, + "id": "8706a9da-4336-4f06-a8a7-4c825639dae4", + "outputId": "5389b953-fdf1-449e-932a-726e160b11b2" + }, + "outputs": [], + "source": [ + "CLC_region = CLC_region.rename({'x': 'lat','y': 'lon'})\n", + "CLC_region.rio.set_spatial_dims(x_dim=\"lat\",y_dim=\"lon\", inplace=True)" + ] + }, + { + "cell_type": "markdown", + "id": "a31c0989-e96e-4809-a24d-13ab00de751f", + "metadata": { + "id": "a31c0989-e96e-4809-a24d-13ab00de751f" + }, + "source": [ + "Our next step is to prepare the visualisation of a map. What better way to explore land-cover information than plotting it on a map?\n", + "\n", + "As you will see below, we can create a dictionary with color codes that will color each land-cover class based on the color code provided in this dictionary. We use the colorscheme of Corine Land Cover. Please find the overview of classes and colors [here](https://collections.sentinel-hub.com/corine-land-cover/readme.html)." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "198958ec-68a5-44d2-9b8c-91a2dd19484f", + "metadata": { + "id": "198958ec-68a5-44d2-9b8c-91a2dd19484f" + }, + "outputs": [], + "source": [ + "CLC_values = [111, 112, 121, 122, 123, 124, 131, 132, 133, 141, 142, 211, 212, 213, 221, 222, 223, 231, 241, 242,\n", + " 243, 244, 311, 312, 313, 321, 322, 323, 324, 331, 332, 333, 334, 335, 411, 412, 421, 422, 423, 511, 512, 521, 522, 523]\n", + "\n", + "CLC_colors = ['#E6004D', '#FF0000', '#CC4DF2', '#CC0000', '#E6CCCC', '#E6CCE6', '#A600CC', '#A64DCC', '#FF4DFF', '#FFA6FF', '#FFE6FF', '#FFFFA8', '#FFFF00', '#E6E600',\n", + " '#E68000', '#F2A64D', '#E6A600', '#E6E64D', '#FFE6A6', '#FFE64D', '#E6CC4D', '#F2CCA6', '#80FF00', '#00A600',\n", + " '#4DFF00', '#CCF24D', '#A6FF80', '#A6E64D', '#A6F200', '#E6E6E6', '#CCCCCC', '#CCFFCC', '#000000', '#A6E6CC',\n", + " '#A6A6FF', '#4D4DFF', '#CCCCFF', '#E6E6FF', '#A6A6E6', '#00CCF2', '#80F2E6', '#00FFA6', '#A6FFE6', '#E6F2FF']" + ] + }, + { + "cell_type": "markdown", + "id": "6d2c9c52", + "metadata": { + "id": "6d2c9c52" + }, + "source": [ + "The code below allows us the use the color_dict above to plot the CLC map" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "59b50772-57d5-4e49-a600-00bfeaf9ffe8", + "metadata": { + "id": "59b50772-57d5-4e49-a600-00bfeaf9ffe8" + }, + "outputs": [], + "source": [ + "color_dict_raster = dict(zip(CLC_values,CLC_colors))\n", + "\n", + "# We create a colormar from our list of colors\n", + "cm = ListedColormap(CLC_colors)\n", + "\n", + "# Let's also define the description of each category in the raster\n", + "labels = np.array(CLC_values)\n", + "len_lab = len(labels)\n", + "\n", + "# prepare normalizer\n", + "## Prepare bins for the normalizer\n", + "norm_bins = np.sort([*color_dict_raster.keys()]) + 0.5\n", + "norm_bins = np.insert(norm_bins, 0, np.min(norm_bins) - 1.0)\n", + "\n", + "## Make normalizer and formatter\n", + "norm = matplotlib.colors.BoundaryNorm(norm_bins, len_lab, clip=True)\n", + "fmt = matplotlib.ticker.FuncFormatter(lambda x, pos: labels[norm(x)])" + ] + }, + { + "cell_type": "markdown", + "id": "68baa525-98be-4069-8129-dc6c22db4793", + "metadata": { + "id": "68baa525-98be-4069-8129-dc6c22db4793" + }, + "source": [ + "And let's plot the Corine Land Cover data for our area of interest" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2a977453-9180-4de6-872e-1fe7818f2915", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 906 + }, + "id": "2a977453-9180-4de6-872e-1fe7818f2915", + "outputId": "b8d0a689-46b1-4a31-d9b6-592b54f216af" + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(1, 1,figsize=(14,10))\n", + "\n", + "CLC_region[\"band_data\"].plot(ax=ax,levels=len(CLC_colors),colors=CLC_colors)" + ] + }, + { + "cell_type": "markdown", + "id": "8867d41e-2b7b-40c2-8576-611f2c04f547", + "metadata": { + "id": "8867d41e-2b7b-40c2-8576-611f2c04f547" + }, + "source": [ + "#### Extract and visualize land-use information from OpenStreetMap\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "2077d677-c8c2-4fd5-b0d0-21fad4f3eec5", + "metadata": { + "id": "2077d677-c8c2-4fd5-b0d0-21fad4f3eec5" + }, + "source": [ + "Now let us visualize the bounding box of the area. As you will notice, we also estimate the size of the area. If the area size is above 50km2, or when you have many elements within your area (for example the amsterdam city centre), extracting the data from OpenStreetMap may take a little while." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "50447dc3-9d91-4a64-adea-90cbb0e0a6be", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 724 + }, + "id": "50447dc3-9d91-4a64-adea-90cbb0e0a6be", + "outputId": "0c90ac99-794f-435c-ad35-f96d02261392" + }, + "outputs": [], + "source": [ + "area_to_check = area.to_crs(epsg=3857)\n", + "ax = area_to_check.plot(figsize=(10, 10), color=\"none\", edgecolor=\"k\", linewidth=4)\n", + "ax.set_xticks([])\n", + "ax.set_yticks([])\n", + "ax.set_axis_off()\n", + "cx.add_basemap(ax, zoom=11)\n", + "\n", + "size = int(area_to_check.area.values/1e6)\n", + "\n", + "ax.set_title(\"{}. Total area: {} km2\".format(place_name,size),fontweight='bold')" + ] + }, + { + "cell_type": "markdown", + "id": "865b5084-08f0-471d-8982-06b340e5d3f5", + "metadata": { + "id": "865b5084-08f0-471d-8982-06b340e5d3f5" + }, + "source": [ + "Now we are satisfied with the selected area, we are going to extract the land-use information from OpenStreetMap. To find the right information from OpenStreetMap, we use **tags**.\n", + "\n", + "As you will see in the cell below, we use the tags *\"landuse\"* and *\"natural\"*. We need to use the *\"natural\"* tag to ensure we also obtain water bodies and other natural elements." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "5f52137d-bf2c-4405-9df1-42ac73a5d83c", + "metadata": { + "id": "5f52137d-bf2c-4405-9df1-42ac73a5d83c" + }, + "outputs": [], + "source": [ + "tags = {'landuse': True, 'natural': True}\n", + "landuse = ox.features_from_place(place_name, tags)" + ] + }, + { + "cell_type": "markdown", + "id": "9f44095d-c47c-49d4-ac8d-6a91eae8f1ae", + "metadata": { + "id": "9f44095d-c47c-49d4-ac8d-6a91eae8f1ae" + }, + "source": [ + "In case the above does not work, you can continue the assignment by using the code below (make sure you remove the hashtags to run it). If you decide to use the data as specified below, also change the map at the start to 'Kampen'." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "13cd17e2-d990-447a-b3d4-75dbe2b93ed1", + "metadata": { + "id": "13cd17e2-d990-447a-b3d4-75dbe2b93ed1" + }, + "outputs": [], + "source": [ + "# remote_url = 'https://github.com/ElcoK/BigData_AED/raw/main/week5/kampen_landuse.gpkg'\n", + "# file = 'kampen_landuse.gpkg'\n", + "\n", + "# request.urlretrieve(remote_url, file)\n", + "#landuse = gpd.GeoDataFrame.from_file('kampen_landuse.gpkg')" + ] + }, + { + "cell_type": "markdown", + "id": "2ff9e972-55b9-45a9-b727-45066032e900", + "metadata": { + "id": "2ff9e972-55b9-45a9-b727-45066032e900" + }, + "source": [ + "To ensure we really only get the area that we want, we use geopandas's `clip` function to only keep the area we want. This function does exactly the same as the `clip` function in QGIS." + ] + }, + { + "cell_type": "markdown", + "id": "f7be7294-2cc6-4997-9c62-a5aea3fd1c29", + "metadata": { + "id": "f7be7294-2cc6-4997-9c62-a5aea3fd1c29" + }, + "source": [ + "When we want to visualize or analyse the data, we want all information in a single column. However, at the moment, all information that was tagged as *\"natural\"*, has no information stored in the *\"landuse\"* tags. It is, however, very convenient if we can just use a single column for further exploration of the data.\n", + "\n", + "To overcome this issue, we need to add the missing information to the landuse column, as done below. Let's first have a look which categories we have in the **natural** column." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "0ed6e32f-06a7-4189-8e77-efd1a9cf77f7", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "0ed6e32f-06a7-4189-8e77-efd1a9cf77f7", + "outputId": "4aa85ca8-bb28-4943-e6aa-73cc2ba9ca46" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['tree', nan, 'water', 'scrub', 'grassland', 'wetland', 'beach',\n", + " 'tree_row', 'sand'], dtype=object)" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "landuse.natural.unique()" + ] + }, + { + "cell_type": "markdown", + "id": "b3a6a6af-c3db-450b-944c-95c7cef1fd32", + "metadata": { + "id": "b3a6a6af-c3db-450b-944c-95c7cef1fd32" + }, + "source": [ + "And now we can add them to the **landuse** column. We made a start, but its up to you to fill in the rest." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "53b14f7a-f62d-4575-ad02-39f279fde5e1", + "metadata": { + "id": "53b14f7a-f62d-4575-ad02-39f279fde5e1" + }, + "outputs": [], + "source": [ + "landuse.loc[landuse.natural=='water','landuse'] = 'water'\n", + "landuse.loc[landuse.natural=='wetland','landuse'] = 'wetlands'\n", + "\n", + "\n", + "landuse = landuse.dropna(subset=['landuse'])" + ] + }, + { + "cell_type": "markdown", + "id": "851df40d-02d1-4409-9a89-9d1edcfa6bcd", + "metadata": { + "id": "851df40d-02d1-4409-9a89-9d1edcfa6bcd" + }, + "source": [ + "
\n", + "Question 4: Please provide in the answer box in Canvas the code that you used to make sure that all land uses are now registered within the landuse column.\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "6ead9126-edc3-41f1-80de-339e1e42dbda", + "metadata": { + "id": "6ead9126-edc3-41f1-80de-339e1e42dbda" + }, + "source": [ + "We now create a *color_dict* like we have also done for the visualization of the land-use information to ensure we can visualize the data properly. This time, we use our own colorscheme." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "64197848-0d42-480e-9d7f-4a68bff63772", + "metadata": { + "id": "64197848-0d42-480e-9d7f-4a68bff63772" + }, + "outputs": [], + "source": [ + "color_dict = { \"grass\":'#c3eead', \"railway\": \"#000000\",\n", + " \"forest\":'#1c7426', \"orchard\":'#fe6729',\n", + " \"residential\":'#f13013', \"industrial\":'#0f045c',\n", + " \"retail\":'#b71456', \"education\":'#d61181',\n", + " \"commercial\":'#981cb8', \"farmland\":'#fcfcb9',\n", + " \"meadow\":'#c3eead', \"farmyard\":'#fcfcb9',\n", + " \"landfill\" : \"#B08C4D\", \"recreation_ground\" : \"#c3eead\",\n", + " }" + ] + }, + { + "cell_type": "markdown", + "id": "408cdac8-2ca1-4eef-8997-8c83b852f5c5", + "metadata": { + "id": "408cdac8-2ca1-4eef-8997-8c83b852f5c5" + }, + "source": [ + "Unfortunately, OpenSteetMap very often contains elements that have a unique tag. As such, it may be the case that some of our land-use categories are not in the dictionary yet.\n", + "\n", + "Let's first create an overview of the unique land-use categories within our data through using the `.unique()` function within our dataframe:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "92c41069-fb2c-4606-adcc-e73ab95778ba", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "92c41069-fb2c-4606-adcc-e73ab95778ba", + "outputId": "19113de0-4c78-44bb-e467-db87717ac727" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['residential', 'water', 'grass', 'forest', 'wetlands', 'meadow',\n", + " 'industrial', 'retail', 'cemetery', 'farmland', 'orchard',\n", + " 'construction', 'scrub', 'commercial', 'education', 'farmyard',\n", + " 'static_caravan', 'railway', 'allotments'], dtype=object)" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "landuse.landuse.unique()" + ] + }, + { + "cell_type": "markdown", + "id": "f354fe05-b608-435f-acf4-6310886071dd", + "metadata": { + "id": "f354fe05-b608-435f-acf4-6310886071dd" + }, + "source": [ + "Ofcourse we can visually compare the array above with our color_dict, but it is much quicker to use `Sets` to check if there is anything missing:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "cba31d28-3398-4d33-a325-eab786869020", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cba31d28-3398-4d33-a325-eab786869020", + "outputId": "522fd89c-b76f-45d9-f635-2ad2ff30f31b" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "set()" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "set(landuse.landuse.unique())-set(color_dict)" + ] + }, + { + "cell_type": "markdown", + "id": "5d2de6c7-180e-43b3-ab32-ee7df7ff6ea2", + "metadata": { + "id": "5d2de6c7-180e-43b3-ab32-ee7df7ff6ea2" + }, + "source": [ + "In case anything is missing, add them to the color_dict dictionairy and re-run that cell.\n", + "\n", + "
\n", + "Question 5: Show us in Canvas (i) which land-use categories you had to add, and (ii) how your final color dictionary looks like.\n", + "
\n", + "\n", + "```{tip}\n", + "You can easily find hexcodes online to find the right colour for each land-use category. Just google hexcodes!\n", + "```\n", + "\n", + "\n", + "Our next step is to make sure that we can connect our color codes to our dataframe with land-use categories." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "45093fa0-b95b-49e1-bb32-d149ba424931", + "metadata": { + "id": "45093fa0-b95b-49e1-bb32-d149ba424931" + }, + "outputs": [], + "source": [ + "color_dict = {key: color_dict[key]\n", + " for key in color_dict if key not in list(set(color_dict)-set(landuse.landuse.unique()))}\n", + "\n", + "map_dict = dict(zip(color_dict.keys(),[x for x in range(len(color_dict))]))\n", + "\n", + "landuse['col_landuse'] = landuse.landuse.apply(lambda x: color_dict[x])" + ] + }, + { + "cell_type": "markdown", + "id": "010bec6f-fd76-40d2-a38c-be266e57d056", + "metadata": { + "id": "010bec6f-fd76-40d2-a38c-be266e57d056" + }, + "source": [ + "Now we can plot the figure!\n", + "\n", + "As you will see in the cell below, we first state that we want to create a figure with a specific figure size. You can change the dimensions to your liking." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b8f01254-e1d7-4e3f-b40c-b2358223670c", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 847 + }, + "id": "b8f01254-e1d7-4e3f-b40c-b2358223670c", + "outputId": "c16e27d2-7da3-4716-b5ab-19a4f4926cea" + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(1, 1,figsize=(12,10))\n", + "\n", + "# add color scheme\n", + "color_scheme_map = list(color_dict.values())\n", + "cmap = LinearSegmentedColormap.from_list(name='landuse',\n", + " colors=color_scheme_map)\n", + "\n", + "# and plot the land-use map.\n", + "landuse.plot(color=landuse['col_landuse'],ax=ax,linewidth=0)\n", + "\n", + "# remove the ax labels\n", + "ax.set_xticks([])\n", + "ax.set_yticks([])\n", + "ax.set_axis_off()\n", + "\n", + "# add a legend:\n", + "legend_elements = []\n", + "for iter_,item in enumerate(color_dict):\n", + " legend_elements.append(Patch(facecolor=color_scheme_map[iter_],label=item))\n", + "\n", + "ax.legend(handles=legend_elements,edgecolor='black',facecolor='#fefdfd',prop={'size':12},loc=(1.02,0.2))\n", + "\n", + "# add a title\n", + "ax.set_title(place_name,fontweight='bold')" + ] + }, + { + "cell_type": "markdown", + "id": "af1ca96a-2ec2-4889-b30b-1f9d23cc0d18", + "metadata": { + "id": "af1ca96a-2ec2-4889-b30b-1f9d23cc0d18" + }, + "source": [ + "
\n", + "Question 6: Please upload a figure of your land-use map, using OpenStreetMap. Feel free to change the visual appearance of the map to your liking\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "99777639-4201-42aa-ab97-1705bed60392", + "metadata": { + "id": "99777639-4201-42aa-ab97-1705bed60392" + }, + "source": [ + "#### Rasterize land-use information\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "3f8bda0f-aea9-471c-af15-31d9bf2bd191", + "metadata": { + "id": "3f8bda0f-aea9-471c-af15-31d9bf2bd191" + }, + "source": [ + "As you have noticed already during the lecture, and as we have seen during TAA1 with the Google Earth Engine, most land-use data is in raster format.\n", + "\n", + "In OpenStreetMap everything is stored in vector format. As such, the land-use information we extracted from OpenStreetMap is also in vector format. While it is not always necessary to have this information in raster format, it is useful to know how to convert your data into a raster format.\n", + "\n", + "To do so, we can make use of the **GeoCube** package, which is a recently developed Python package that can very easily convert vector data into a raster format." + ] + }, + { + "cell_type": "markdown", + "id": "6d84eb30-2657-4cd3-8300-be6e22673d11", + "metadata": { + "id": "6d84eb30-2657-4cd3-8300-be6e22673d11" + }, + "source": [ + "The first thing we will need to do is to define all the unique land-use classes and store them in a dictionary:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "48d1662b-23a0-443d-8465-0acad5e374c0", + "metadata": { + "id": "48d1662b-23a0-443d-8465-0acad5e374c0" + }, + "outputs": [], + "source": [ + "categorical_enums = {'landuse': landuse.landuse.drop_duplicates().values.tolist()\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "17845c5f-ec24-498c-a185-1cbf5d4054dd", + "metadata": { + "id": "17845c5f-ec24-498c-a185-1cbf5d4054dd" + }, + "source": [ + "And now we simply use the `make_geocube()` function to convert our vector data into raster data.\n", + "\n", + "In the `make_geocube()` function, we have to specify several arguments:\n", + "\n", + "- Through the `vector_data` argument we have to state which dataframe we want to rasterize.\n", + "- Through the `output_crs` argument we have to state the coordinate reference system (CRS). We use the OpenStreetMap default EPSG:4326.\n", + "- Through the `resolution` argument we have to state the resolution. In our case, we will have to set this in degrees. 0.01 degrees is equivalent to roughly 10km around the equator.\n", + "- Through the `categorical_enums` argument we specify the different land-use categories.\n", + "\n", + "Play around with the different resolutions to find the level of detail. The higher the resolution (i.e., the more zeros behind the comma), the longer it will take to rasterize." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "3ca109c1-5169-4833-818d-bae97f0b33b3", + "metadata": { + "id": "3ca109c1-5169-4833-818d-bae97f0b33b3" + }, + "outputs": [], + "source": [ + "landuse_grid = make_geocube(\n", + " vector_data= ,## add landuse\n", + " output_crs= ,## add CRS\n", + " resolution= ,## add resolution\n", + " categorical_enums= ## add categorical_enums\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "ba3ea735-0255-4b44-ab66-210bf3655213", + "metadata": { + "id": "ba3ea735-0255-4b44-ab66-210bf3655213" + }, + "source": [ + "Let's explore what this function has given us:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ca50588-074b-4217-a384-f582a57f6b35", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 389 + }, + "id": "2ca50588-074b-4217-a384-f582a57f6b35", + "outputId": "a8f53190-d7a2-4139-8a54-6a3511d51c2f" + }, + "outputs": [], + "source": [ + "landuse_grid[\"landuse\"]" + ] + }, + { + "cell_type": "markdown", + "id": "35204590-9e19-45a0-8065-4e453d024d69", + "metadata": { + "id": "35204590-9e19-45a0-8065-4e453d024d69" + }, + "source": [ + "The output above is a typical output of the **xarray** package.\n", + "\n", + "- The `array` shows the numpy array with the actual values. As you can see, the rasterization process has used the value `-1` for NoData.\n", + "- The `Coordinates` table shows the x (longitude) and y (latitude) coordinates of the array. It has the exact same size as the `array` with land-use values.\n", + "- The `Attributes` table specifies the NoData value (the `_FillValue` element, which indeed shows `-1`) and the name of the dataset.\n", + "\n", + "Now let's plot the data to see the result!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "407f75e9-4747-43e1-93a0-d1b63d90378d", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 825 + }, + "id": "407f75e9-4747-43e1-93a0-d1b63d90378d", + "outputId": "90a878fd-5c26-49e1-c562-2430ef8d4c21" + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(1, 1,figsize=(14,10))\n", + "\n", + "landuse_grid[\"landuse\"].plot(ax=ax,vmin=0,vmax=15,levels=15,cmap='tab20')\n", + "\n", + "# remove the ax labels\n", + "ax.set_xticks([])\n", + "ax.set_yticks([])\n", + "ax.set_axis_off()\n", + "\n", + "#add a title\n", + "\n", + "ax.set_title('')" + ] + }, + { + "cell_type": "markdown", + "id": "945b1ce7-f6e6-410d-be82-e24e9d224bd3", + "metadata": { + "id": "945b1ce7-f6e6-410d-be82-e24e9d224bd3" + }, + "source": [ + "As we can see in the figure above, the land-use categories have turned into numbers, instead of land-use categories described by a string value.\n", + "\n", + "This is of course a lot harder to interpret. Let's re-do some parts to make sure we can properly link them back to the original data.\n", + "\n", + "To do so, we will first need to make sure that we know which values (numbers) are connected to each land-use category. Instead of trying to match, let's predefine this ourselves!\n", + "\n", + "We will start with creating a dictionary that allows us to couple a number to each category:" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "1882f6c1-9008-4815-b19f-7ec2771aaa55", + "metadata": { + "id": "1882f6c1-9008-4815-b19f-7ec2771aaa55" + }, + "outputs": [], + "source": [ + "value_dict = dict(zip(landuse.landuse.unique(),np.arange(0,len(landuse.landuse.unique()),1)))" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "27b572e0-d97b-47cb-8fa7-1a2c11afc8fa", + "metadata": { + "id": "27b572e0-d97b-47cb-8fa7-1a2c11afc8fa" + }, + "outputs": [], + "source": [ + "value_dict['nodata'] = -1" + ] + }, + { + "cell_type": "markdown", + "id": "3cc4797d-9d48-4c83-a564-936d579dc256", + "metadata": { + "id": "3cc4797d-9d48-4c83-a564-936d579dc256" + }, + "source": [ + "And we now use this dictionary to add a new column to the dataframe with the values:" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "f14df583-5a87-4ea5-9712-915c2156c02e", + "metadata": { + "id": "f14df583-5a87-4ea5-9712-915c2156c02e" + }, + "outputs": [], + "source": [ + "landuse['landuse_value'] = landuse.landuse.apply(lambda x: value_dict[x])" + ] + }, + { + "cell_type": "markdown", + "id": "ff53e03e-058c-4397-a6ec-77ffc6f057ac", + "metadata": { + "id": "ff53e03e-058c-4397-a6ec-77ffc6f057ac" + }, + "source": [ + "Now let us use the make_geocube() function again to rasterize." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "c05b7dd2-84df-428c-9c70-7d07aa745346", + "metadata": { + "id": "c05b7dd2-84df-428c-9c70-7d07aa745346" + }, + "outputs": [], + "source": [ + "landuse_valued = make_geocube(\n", + " vector_data= ## add landuse,\n", + " output_crs= ## add CRS,\n", + " resolution= ## add resolution,\n", + " categorical_enums={'landuse_value': landuse.landuse_value.drop_duplicates().values.tolist()\n", + "}\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "510409be-3b7f-4f75-848b-4146bee15338", + "metadata": { + "id": "510409be-3b7f-4f75-848b-4146bee15338" + }, + "source": [ + "And let's use the original `color_dict` dictionary to find the right hex codes for each of the land-use categories" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "458b393b-47e8-44a3-bebc-148b4d764401", + "metadata": { + "id": "458b393b-47e8-44a3-bebc-148b4d764401" + }, + "outputs": [], + "source": [ + "unique_classes = landuse.landuse.drop_duplicates().values.tolist()\n", + "colormap_raster = [color_dict[lu_class] for lu_class in unique_classes]" + ] + }, + { + "cell_type": "markdown", + "id": "8197f4b9-9c0f-4999-89f3-1ea657888193", + "metadata": { + "id": "8197f4b9-9c0f-4999-89f3-1ea657888193" + }, + "source": [ + "To plot the new result:" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "a5eb9d2c-2435-485f-8daa-6c54e29e8fd0", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 830 + }, + "id": "a5eb9d2c-2435-485f-8daa-6c54e29e8fd0", + "outputId": "2558af6a-329d-4ac5-dcc4-0793dbab498b" + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(1, 1,figsize=(14,10))\n", + "\n", + "landuse_valued[\"landuse_value\"].plot(ax=ax,vmin=0,vmax=19,levels=len(unique_classes),colors=colormap_raster)\n", + "\n", + "# remove the ax labels\n", + "ax.set_xticks([])\n", + "ax.set_yticks([])\n", + "ax.set_axis_off()\n", + "\n", + "# add title\n", + "ax.set_title('')" + ] + }, + { + "cell_type": "markdown", + "id": "b999fe12", + "metadata": {}, + "source": [ + "But this is not entirely how we want it yet. We want to make sure we assign the correct colors to the correct categories." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "d8789a06-d041-4d6f-aab7-48032ac8c8d1", + "metadata": { + "id": "d8789a06-d041-4d6f-aab7-48032ac8c8d1" + }, + "outputs": [], + "source": [ + "# we first identify all the unique classes in the landuse dataset and assign them a unique color\n", + "unique_classes = landuse.landuse.drop_duplicates().values.tolist()\n", + "colormap_raster = [color_dict[lu_class] for lu_class in unique_classes]\n", + "color_dict_raster = dict(zip(np.arange(-1,len(landuse.landuse.unique())+1,1),['#ffffff']+colormap_raster))\n", + "\n", + "# We create a colormar from our list of colors\n", + "cm = ListedColormap([color_dict_raster[x] for x in color_dict_raster.keys()])\n", + "\n", + "# Let's also define the description of each category. Order should be respected here!\n", + "labels = np.array(['nodata'] + unique_classes)\n", + "len_lab = len(labels)\n", + "\n", + "# prepare normalizer\n", + "## Prepare bins for the normalizer\n", + "norm_bins = np.sort([*color_dict_raster.keys()]) + 0.5\n", + "norm_bins = np.insert(norm_bins, 0, np.min(norm_bins) - 1.0)\n", + "\n", + "## Make normalizer and formatter\n", + "norm = matplotlib.colors.BoundaryNorm(norm_bins, len_lab, clip=True)\n", + "fmt = matplotlib.ticker.FuncFormatter(lambda x, pos: labels[norm(x)])" + ] + }, + { + "cell_type": "markdown", + "id": "f36beb42-1da5-4da0-bb02-b61604b0852f", + "metadata": { + "id": "f36beb42-1da5-4da0-bb02-b61604b0852f" + }, + "source": [ + "Let's plot the map again!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "def51260-e57c-4957-8263-2b43a83a134f", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 807 + }, + "id": "def51260-e57c-4957-8263-2b43a83a134f", + "outputId": "59db0647-2d46-435e-88ab-46f85775e791" + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(1, 1,figsize=(14,10))\n", + "\n", + "ax = landuse_valued[\"landuse_value\"].plot(levels=len(unique_classes), cmap=cm, norm=norm)\n", + "\n", + "# remove the ax labels\n", + "diff = norm_bins[1:] - norm_bins[:-1]\n", + "tickz = norm_bins[:-1] + diff / 2\n", + "cb = fig.colorbar(ax, format=fmt, ticks=tickz)\n", + "\n", + "# set title again\n", + "fig.axes[0].set_title('')\n", + "\n", + "fig.axes[0].set_xticks([])\n", + "fig.axes[0].set_yticks([])\n", + "fig.axes[0].set_axis_off()\n", + "\n", + "# for some weird reason we get two colorbars, so we remove one:\n", + "fig.delaxes(fig.axes[1])" + ] + }, + { + "cell_type": "markdown", + "id": "9e42dd3a-c0c3-496f-bbc4-dbdf1f3901d1", + "metadata": { + "id": "9e42dd3a-c0c3-496f-bbc4-dbdf1f3901d1" + }, + "source": [ + "
\n", + "Question 7: In the rasterization process, we use the `.make_geocube()` function. Please elaborate on the following: i)why is it important to specify the right coordinate system? What could happen if you choose the wrong coordinate system? ii) which resolution did you choose and why? iii)Why did the first result did not give us the right output with the correct colors? How did we solve this? Are you able to explain the code in your own words?\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "318a2267-4057-485c-85f1-1929896ad9ee", + "metadata": { + "id": "318a2267-4057-485c-85f1-1929896ad9ee" + }, + "source": [ + "### 5. Perform a raster-based damage assessment Corine Land Cover\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "5dfabe80-3c8f-4e3a-a411-a29349c2d75b", + "metadata": { + "id": "5dfabe80-3c8f-4e3a-a411-a29349c2d75b" + }, + "source": [ + "To calculate the potential damage to both windstorms and floods, we use stage-damage curves, which relate the intensity of the hazard to the fraction of maximum damage that can be sustained by a certain land use. As you can see on the Corine Land Cover map that we just plotted, there are a lot of land use classes (44), though not all will suffer damage from either the windstorm or the flood event. For each of the land-use classes a curve and a maximum damage number are assigned.\n", + "\n", + "To assess the damage for both the flood and windstorm event, we are going to make use of the [DamageScanner](https://damagescanner.readthedocs.io/en/latest/), which is a tool to calculate potential flood damages based on inundation depth and land use using depth-damage curves in the Netherlands. The DamageScanner was originally developed for the 'Netherlands Later' project [(Klijn et al., 2007)](https://www.rivm.nl/bibliotheek/digitaaldepot/WL_rapport_Overstromingsrisicos_Nederland.pdf). The original land-use classes were based on the Land-Use Scanner in order to evaluate the effect of future land-use change on flood damages. We have tailored the input of the DamageScanner to make sure it can estimate the damages using Corine Land Cover.\n", + "\n", + "Because the simplicity of the model, we can use this for any raster-based hazard map with some level of intensity. Hence, we can use it for both hazards." + ] + }, + { + "cell_type": "markdown", + "id": "ed5b5f52-bbad-42a6-acd5-1ea0248591f8", + "metadata": { + "id": "ed5b5f52-bbad-42a6-acd5-1ea0248591f8" + }, + "source": [ + "
\n", + "Question 8: Describe in your own words what the `DamageScanner()` function does. Please walk us through the different steps. Which inputs do you need to be able to run this damage assessment?\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "94d33d66-6bf6-43b2-8c24-3e1a1069af2b", + "metadata": { + "id": "94d33d66-6bf6-43b2-8c24-3e1a1069af2b" + }, + "outputs": [], + "source": [ + "def DamageScanner(landuse_map,inun_map,curve_path,maxdam_path,cellsize=100):\n", + "\n", + " # load land-use map\n", + " landuse = landuse_map.copy()\n", + "\n", + " # Load inundation map\n", + " inundation = inun_map.copy()\n", + "\n", + " inundation = np.nan_to_num(inundation)\n", + "\n", + " # Load curves\n", + " if isinstance(curve_path, pd.DataFrame):\n", + " curves = curve_path.values\n", + " elif isinstance(curve_path, np.ndarray):\n", + " curves = curve_path\n", + "\n", + " #Load maximum damages\n", + " if isinstance(maxdam_path, pd.DataFrame):\n", + " maxdam = maxdam_path.values\n", + " elif isinstance(maxdam_path, np.ndarray):\n", + " maxdam = maxdam_path\n", + "\n", + " # Speed up calculation by only considering feasible points\n", + " inun = inundation * (inundation>=0) + 0\n", + " inun[inun>=curves[:,0].max()] = curves[:,0].max()\n", + " waterdepth = inun[inun>0]\n", + " landuse = landuse[inun>0]\n", + "\n", + " # Calculate damage per land-use class for structures\n", + " numberofclasses = len(maxdam)\n", + " alldamage = np.zeros(landuse.shape[0])\n", + " damagebin = np.zeros((numberofclasses, 4,))\n", + " for i in range(0,numberofclasses):\n", + " n = maxdam[i,0]\n", + " damagebin[i,0] = n\n", + " wd = waterdepth[landuse==n]\n", + " alpha = np.interp(wd,((curves[:,0])),curves[:,i+1])\n", + " damage = alpha*(maxdam[i,1]*cellsize)\n", + " damagebin[i,1] = sum(damage)\n", + " damagebin[i,2] = len(wd)\n", + " if len(wd) == 0:\n", + " damagebin[i,3] = 0\n", + " else:\n", + " damagebin[i,3] = np.mean(wd)\n", + " alldamage[landuse==n] = damage\n", + "\n", + " # create pandas dataframe with output\n", + " loss_df = pd.DataFrame(damagebin.astype(float),columns=['landuse','losses','area','avg_intensity']).groupby('landuse').sum()\n", + "\n", + " # return output\n", + " return loss_df.sum().values[0],loss_df" + ] + }, + { + "cell_type": "markdown", + "id": "146c6b79-ce68-436b-a7fb-8a889528f513", + "metadata": { + "id": "146c6b79-ce68-436b-a7fb-8a889528f513" + }, + "source": [ + "#### Windstorm Damage\n", + "---\n", + "To estimate the potential damage of our windstorm, we use the vulnerability curves developed by [Yamin et al. (2014)](https://www.sciencedirect.com/science/article/pii/S2212420914000466). Following [Yamin et al. (2014)](https://www.sciencedirect.com/science/article/pii/S2212420914000466), we will apply a sigmoidal vulnerability function satisfying two constraints: (i) a minimum threshold for the occurrence of damage with an upper bound of 100% direct damage; (ii) a high power-law function for the slope, describing an increase in damage with increasing wind speeds. Due to the limited amount of vulnerability curves available for windstorm damage, we will use the damage curve that represents low-rise *reinforced masonry* buildings for all land-use classes that may contain buildings. Obviously, this is a large oversimplification of the real world, but this should be sufficient for this exercise. When doing a proper stand-alone windstorm risk assessment, one should take more effort in collecting the right vulnerability curves for different building types. " + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "e0e63daa-636b-4a1e-ba6c-5bb78e56f290", + "metadata": { + "id": "e0e63daa-636b-4a1e-ba6c-5bb78e56f290", + "tags": [] + }, + "outputs": [], + "source": [ + "wind_curves = pd.read_excel(\"https://github.com/VU-IVM/UNIGIS_ProgrammingGIS/raw/main/TAA2/damage_curves.xlsx\",sheet_name='wind_curves')\n", + "maxdam = pd.read_excel(\"https://github.com/VU-IVM/UNIGIS_ProgrammingGIS/raw/main/TAA2/damage_curves.xlsx\",sheet_name='maxdam')" + ] + }, + { + "cell_type": "markdown", + "id": "beb4f312-c4fb-4169-b563-e5878dfd95e2", + "metadata": { + "id": "beb4f312-c4fb-4169-b563-e5878dfd95e2" + }, + "source": [ + "Unfortunately, we run into a *classic* problem when we want to overlay the windstorm data with the Corine Land Cover data. The windstorm data is not only stored in a different coordinate system (we had to convert it from **EPSG:4326** to **EPSG:3035**), it is in a different resolution (**1km** instead of the **100m** of Corine Land Cover). \n", + "\n", + "Let's first have a look how our clipped data look's like. If you have decided to use Kampen, you will see that we have 12 columns (our Lattitude/lat) and 9 rows (our Longitude/lon). If you scroll above to our Corine Land Cover data, you see that dimensions are different: 147 columns (Lattitude/lat/x) and 111 rows (Longitude/lon/y)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57bc4345-b1e5-45c7-8aa2-95ef39b1ea78", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 291 + }, + "id": "57bc4345-b1e5-45c7-8aa2-95ef39b1ea78", + "outputId": "47728b1f-574e-4f66-d050-57b5c568b5c6" + }, + "outputs": [], + "source": [ + "windstorm_map" + ] + }, + { + "cell_type": "markdown", + "id": "e1688219-1647-442e-8ed7-e4277ca75a16", + "metadata": { + "id": "e1688219-1647-442e-8ed7-e4277ca75a16" + }, + "source": [ + "The first thing we are going to do is try to make sure our data will be in the correct resolution (moving from **1km** to **100m**). To do so, we will use the `rio.reproject()` function. You will see that specify the resolution as **100**. Because **EPSG:3035** is a coordinate system in meters, we can simply use meters to define the resolution. We use the `rio.clip()` function to make sure we clip it again to our area of interest. The function below (`match_rasters`) will do the hard work for us. Please note all the input variables to understand what's happening." + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "d960af61-b324-459e-9e4c-da2f70bf7ecf", + "metadata": { + "id": "d960af61-b324-459e-9e4c-da2f70bf7ecf" + }, + "outputs": [], + "source": [ + "def match_rasters(hazard,landuse,haz_crs=3035,lu_crs=3035,resolution=100,hazard_col=['FX']):\n", + " \"\"\"\n", + " Clips, reprojections, and matches the resolutions of two rasters, `hazard` and `landuse`,\n", + " to prepare them for further analysis.\n", + "\n", + " Parameters\n", + " ----------\n", + " hazard : xarray.DataArray\n", + " A 2D or 3D array containing hazard data.\n", + " landuse : xarray.DataArray\n", + " A 2D array containing land use data.\n", + " haz_crs : int, optional\n", + " The CRS of `hazard`. Default is EPSG:3035.\n", + " lu_crs : int, optional\n", + " The CRS of `landuse`. Default is EPSG:3035.\n", + " resolution : float, optional\n", + " The desired resolution in meters for both `hazard` and `landuse` after reprojection. Default is 100.\n", + " hazard_col : list, optional\n", + " A list of column names or indices for the hazard variable. Default is ['FX'].\n", + "\n", + " Returns\n", + " -------\n", + " tuple\n", + " A tuple containing two xarray.DataArray objects:\n", + " - The land use variable with matching resolution and dimensions to the hazard variable.\n", + " - The hazard variable clipped to the extent of the land use variable, with matching resolution and dimensions.\n", + " \"\"\"\n", + "\n", + " # Set the crs of the hazard variable to haz_crs\n", + " hazard.rio.write_crs(haz_crs, inplace=True)\n", + "\n", + " # Set the x and y dimensions in the hazard variable to 'x' and 'y' respectively\n", + " hazard.rio.set_spatial_dims(x_dim=\"x\",y_dim=\"y\", inplace=True)\n", + "\n", + " # Reproject the landuse variable from EPSG:4326 to EPSG:3857\n", + " landuse = CLC_region.rio.reproject(\"EPSG:3857\",resolution=resolution)\n", + "\n", + " # Get the minimum longitude and latitude values in the landuse variable\n", + " min_lon = landuse.x.min().to_dict()['data']\n", + " min_lat = landuse.y.min().to_dict()['data']\n", + "\n", + " # Get the maximum longitude and latitude values in the landuse variable\n", + " max_lon = landuse.x.max().to_dict()['data']\n", + " max_lat = landuse.y.max().to_dict()['data']\n", + "\n", + " # Create a bounding box using the minimum and maximum latitude and longitude values\n", + " area = gpd.GeoDataFrame([shapely.box(min_lon,min_lat,max_lon, max_lat)],columns=['geometry'])\n", + "\n", + " # Set the crs of the bounding box to EPSG:3857\n", + " area.crs = 'epsg:3857'\n", + "\n", + " # Convert the crs of the bounding box to EPSG:4326\n", + " area = area.to_crs(f'epsg:{haz_crs}')\n", + "\n", + " # Clip the hazard variable to the extent of the bounding box\n", + " hazard = hazard.rio.clip(area.geometry.values, area.crs)\n", + "\n", + " # Reproject the hazard variable to EPSG:3857 with the desired resolution\n", + " hazard = hazard.rio.reproject(\"EPSG:3857\",resolution=resolution)\n", + "\n", + " # Clip the hazard variable again to the extent of the bounding box\n", + " hazard = hazard.rio.clip(area.geometry.values, area.crs)\n", + "\n", + " # If the hazard variable has fewer columns and rows than the landuse variable, reproject the landuse variable to match the hazard variable\n", + " if (len(hazard.x)len(landuse.x)) & (len(hazard.y)>len(landuse.y)):\n", + " hazard = hazard.rio.reproject_match(landuse)\n", + "\n", + " # return the new landuse and hazard map\n", + " return landuse,hazard" + ] + }, + { + "cell_type": "markdown", + "id": "9f9ccb0d-2644-45ea-b435-79d83cd12a8e", + "metadata": { + "id": "9f9ccb0d-2644-45ea-b435-79d83cd12a8e" + }, + "source": [ + "Now let's run the `match_rasters` function and let it do its magic." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "d5c3409f-5c41-4ffa-b881-fa166eec2521", + "metadata": { + "id": "d5c3409f-5c41-4ffa-b881-fa166eec2521" + }, + "outputs": [], + "source": [ + "CLC_region_wind, windstorm = match_rasters(windstorm_europe,\n", + " CLC_region,\n", + " haz_crs=3035,\n", + " lu_crs=3035,\n", + " resolution=100,\n", + " hazard_col=['FX'])" + ] + }, + { + "cell_type": "markdown", + "id": "aa2fdc04-2327-47d2-b43a-521dc95b6882", + "metadata": { + "id": "aa2fdc04-2327-47d2-b43a-521dc95b6882" + }, + "source": [ + "And let's have a look if the two rasters are now the same extend:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7ca69a83-350b-4d0e-adea-d6a00b9dfc38", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 291 + }, + "id": "7ca69a83-350b-4d0e-adea-d6a00b9dfc38", + "outputId": "9f8a60c0-ca86-4979-bd06-95c97690b8fb" + }, + "outputs": [], + "source": [ + "CLC_region_wind" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0b0216bd-6497-4a0a-8903-31d46599a854", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 291 + }, + "id": "0b0216bd-6497-4a0a-8903-31d46599a854", + "outputId": "63f88a2f-4b3a-410e-94d8-9cb85e6e6719" + }, + "outputs": [], + "source": [ + "windstorm" + ] + }, + { + "cell_type": "markdown", + "id": "50f3a8c5-aac5-4def-b79f-8e20be1cc822", + "metadata": { + "id": "50f3a8c5-aac5-4def-b79f-8e20be1cc822" + }, + "source": [ + "It worked! And to double check, let's also plot it:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "58536a6a-6e5b-40cd-8d14-dc453d781405", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 506 + }, + "id": "58536a6a-6e5b-40cd-8d14-dc453d781405", + "outputId": "f5764fa2-b419-4035-d1eb-3cab1c99b316" + }, + "outputs": [], + "source": [ + "# plot the data" + ] + }, + { + "cell_type": "markdown", + "id": "8e445352-2695-4d54-9abe-e3215817f355", + "metadata": { + "id": "8e445352-2695-4d54-9abe-e3215817f355" + }, + "source": [ + "
\n", + "Question 9: Describe the various steps you have taken to make sure that the windstorm map is now exactly the same extent as the corine land cover map. Feel free to include lines of code in your answer and also describe the different functions you have used along the way.\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "4959f306-df08-4548-8470-9083c814b203", + "metadata": { + "id": "4959f306-df08-4548-8470-9083c814b203" + }, + "source": [ + "Now its finally time to do our damage assessment! To do so, we need to convert our data to `numpy.arrays()` to do our calculation:" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "f0f82a7c-f2b1-43dd-bcb6-4a9d24738d75", + "metadata": { + "id": "f0f82a7c-f2b1-43dd-bcb6-4a9d24738d75" + }, + "outputs": [], + "source": [ + "landuse_map = CLC_region_wind['band_data'].to_numpy()[0,:,:]\n", + "wind_map = windstorm['FX'].to_numpy()[0,:,:]" + ] + }, + { + "cell_type": "markdown", + "id": "aca9bbe2-95f2-4b0d-9fb7-bb0ffc94ecef", + "metadata": { + "id": "aca9bbe2-95f2-4b0d-9fb7-bb0ffc94ecef" + }, + "source": [ + "And remember that our windstorm data was stored in **m/s**. Hence, we need to convert it to **km/h**:" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "11ddca33-7360-4efb-84f2-7613fd360ca3", + "metadata": { + "id": "11ddca33-7360-4efb-84f2-7613fd360ca3" + }, + "outputs": [], + "source": [ + "wind_map_kmh = wind_map* #convert to km/h" + ] + }, + { + "cell_type": "markdown", + "id": "53b5ac7e-e817-49e2-b588-614e997adf8a", + "metadata": { + "id": "53b5ac7e-e817-49e2-b588-614e997adf8a" + }, + "source": [ + "And now let's run the DamageScanner to obtain the damage results" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "31da4031-fdd4-485f-af99-30fa49fdabe0", + "metadata": { + "id": "31da4031-fdd4-485f-af99-30fa49fdabe0", + "tags": [] + }, + "outputs": [], + "source": [ + "wind_damage_CLC = DamageScanner(landuse_map,wind_map_kmh,wind_curves,maxdam)[1]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a717a4a2-8d6b-436b-b855-bebc7835d0b3", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "a717a4a2-8d6b-436b-b855-bebc7835d0b3", + "outputId": "1f8aaf42-367a-4073-bb05-0342e2a42898" + }, + "outputs": [], + "source": [ + "wind_damage_CLC" + ] + }, + { + "cell_type": "markdown", + "id": "5UNySYvk-g4J", + "metadata": { + "id": "5UNySYvk-g4J", + "tags": [] + }, + "source": [ + "#### Flood Damage\n", + "---\n", + "To Assess the flood damage, we are again going to make use of the [DamageScanner](https://damagescanner.readthedocs.io/en/latest/). The Corine Land Cover data is widely used in European flood risk assessments. As such, we can simply make use of pre-developed curves. We are using the damage curves as developed by Huizinga et al. (2007). Again, let's first load the maximum damages and the depth-damage curves:" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "ua2xyAGW-g4J", + "metadata": { + "id": "ua2xyAGW-g4J" + }, + "outputs": [], + "source": [ + "flood_curves = pd.read_excel(\"https://github.com/ElcoK/BigData_AED/raw/main/week5/damage_curves.xlsx\",sheet_name='flood_curves',engine='openpyxl')\n", + "maxdam = pd.read_excel(\"https://github.com/ElcoK/BigData_AED/raw/main/week5/damage_curves.xlsx\",sheet_name='maxdam')" + ] + }, + { + "cell_type": "markdown", + "id": "HT54wRvs-g4K", + "metadata": { + "id": "HT54wRvs-g4K" + }, + "source": [ + "And convert our data to `numpy.arrays()` to do our calculation:" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "qzXKNmg2-g4K", + "metadata": { + "id": "qzXKNmg2-g4K" + }, + "outputs": [], + "source": [ + "landuse_map = CLC_region['band_data'].to_numpy()\n", + "flood_map = flood_map_area['band_data'].to_numpy()" + ] + }, + { + "cell_type": "markdown", + "id": "ttGra99k-g4K", + "metadata": { + "id": "ttGra99k-g4K" + }, + "source": [ + "And now let's run the DamageScanner to obtain the damage results" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "2qL8UATu-g4K", + "metadata": { + "id": "2qL8UATu-g4K" + }, + "outputs": [], + "source": [ + "flood_damage_CLC = DamageScanner(landuse_map,flood_map,flood_curves,maxdam)[1]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "WnWu6AMUeFA2", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "WnWu6AMUeFA2", + "outputId": "9b3076fd-a548-462d-a9e1-f532d644ed04" + }, + "outputs": [], + "source": [ + "flood_damage_CLC" + ] + }, + { + "cell_type": "markdown", + "id": "61359310", + "metadata": {}, + "source": [ + "
\n", + "Question 10: Create a plot yourself to compare the results of both the windstorm and flood damage results. This could be a simple barplot, for example.\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "tpS3A5DA5NiA", + "metadata": { + "id": "tpS3A5DA5NiA" + }, + "source": [ + "Now let's try to do this again with the OpenStreetMap data. It would be most convenient to use the same damage curves, so we want to couple our OSM land-use information to the flood curves.\n", + "\n", + "Let's first have a look at the column values:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "V9W8ngNm5dI_", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "V9W8ngNm5dI_", + "outputId": "71a6bdf8-69d1-4f12-f0c6-02e6d185ab9c" + }, + "outputs": [], + "source": [ + "flood_curves.columns" + ] + }, + { + "cell_type": "markdown", + "id": "Q_FkDCtN5se3", + "metadata": { + "id": "Q_FkDCtN5se3" + }, + "source": [ + "Ok this does not say anything to us yet. So let's have a look at the list of classes they are refering to:\n", + "\n", + "\n", + "\n", + "![corine-ocsol-legend.png](data:image/png;base64,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)" + ] + }, + { + "cell_type": "markdown", + "id": "C7zUFEoZ6Yzn", + "metadata": { + "id": "C7zUFEoZ6Yzn" + }, + "source": [ + "So the first column of our damage curves relates to \"111: Continuous urban fabric\", and so on. Now let's have a look at the land uses we have within our OSM data. Can you find all the unique values in our 'landuse' column of the **landuse** dataframe?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "wPX9jZWd6sa-", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "wPX9jZWd6sa-", + "outputId": "ba5fea0e-2791-4c81-cdc0-001a6703251f" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "qUJ7GwF_6vGf", + "metadata": { + "id": "qUJ7GwF_6vGf" + }, + "source": [ + "Our next step would be to attach a value to each of the land-use classes that corresponds to the value of each column (to make sure we have a damage curve linked to each land-use class)" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "id": "5pGFDGjP6ujm", + "metadata": { + "id": "5pGFDGjP6ujm" + }, + "outputs": [], + "source": [ + "landuse_value_clc = [0, ## complete the list, where each value corresponds to a landuse class in the flood_curves dataframe]" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "id": "IpudoRfT7pru", + "metadata": { + "id": "IpudoRfT7pru" + }, + "outputs": [], + "source": [ + "value_dict_clc = dict(zip(landuse.landuse.unique(),landuse_value_clc))\n", + "value_dict_clc['nodata'] = ## add a nodata value\n", + "landuse['landuse_value_clc'] = landuse.landuse.apply(lambda x: value_dict_clc[x])" + ] + }, + { + "cell_type": "markdown", + "id": "24d86032", + "metadata": {}, + "source": [ + "and now rasterize the OSM landuse data again to make it matching!" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "id": "38d46699-d759-48e3-a5ef-09d45ec8e41a", + "metadata": { + "id": "38d46699-d759-48e3-a5ef-09d45ec8e41a" + }, + "outputs": [], + "source": [ + "landuse_clc = make_geocube(\n", + " vector_data= # add landuse,\n", + " output_crs= # add CRS,\n", + " resolution= # add resolution (this should be somewhat similar as the resolution of the flood map),\n", + " categorical_enums={'landuse_value': landuse.landuse_value.drop_duplicates().values.tolist()\n", + "}\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "126d4106", + "metadata": {}, + "source": [ + "And run the **match_rasters** function now with the new landuse map" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "id": "PL1evdBM4rex", + "metadata": { + "id": "PL1evdBM4rex" + }, + "outputs": [], + "source": [ + "landuse_osm_clc, flood_map_osm = match_rasters(# add landuse_clc,\n", + " ## add landuse_clc,\n", + " haz_crs=3035,\n", + " lu_crs=# add landuse CRS,\n", + " resolution= #add desired resolution (I would pick the resolution of the flood map),\n", + " hazard_col=['band_data'])" + ] + }, + { + "cell_type": "markdown", + "id": "b70655e2", + "metadata": {}, + "source": [ + "And now turn them into numpy arrays again" + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "id": "2VNtw7HW9RXG", + "metadata": { + "id": "2VNtw7HW9RXG" + }, + "outputs": [], + "source": [ + "osm_landuse_map = landuse_osm_clc['band_data'] #complete function\n", + "osm_flood_map = flood_map_osm['band_data'] #complete function" + ] + }, + { + "cell_type": "markdown", + "id": "8398430d", + "metadata": {}, + "source": [ + "And run the DamageScanner" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "91662ad6", + "metadata": {}, + "outputs": [], + "source": [ + "flood_damage_CLC = DamageScanner(# fill the dammagescanner function)[1]" + ] + }, + { + "cell_type": "markdown", + "id": "5626418e", + "metadata": {}, + "source": [ + "
\n", + "Question 11: How do the results compare to the flood damages estimated with Corine Land Cover? Are you able to visualise the differences?\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "28e483d0-06b1-432f-86e6-d7a68e9811a4", + "metadata": { + "id": "28e483d0-06b1-432f-86e6-d7a68e9811a4" + }, + "source": [ + "### 6. Extracting high-resolution data from OpenStreetMap\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "502b596d-ad9f-4e42-bc2f-e889d216f0e7", + "metadata": { + "id": "502b596d-ad9f-4e42-bc2f-e889d216f0e7" + }, + "source": [ + "#### Extracting buildings from OpenStreetMap\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "4f42ba03-9c17-465d-97eb-77df502dd8ee", + "metadata": { + "id": "4f42ba03-9c17-465d-97eb-77df502dd8ee" + }, + "source": [ + "There is a lot more data to extract from OpenStreetMap besides land-use information. Let's extract some building data. To do so, we use the *\"building\"* tag." + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "92f86ddc-ce27-4753-9e70-af6df03d7850", + "metadata": { + "id": "92f86ddc-ce27-4753-9e70-af6df03d7850" + }, + "outputs": [], + "source": [ + "tags = {\"building\": True}\n", + "buildings = ox.features_from_place(place_name, tags)" + ] + }, + { + "cell_type": "markdown", + "id": "772d95a6-c2ce-48a6-a7d0-bc1f4b77c323", + "metadata": { + "id": "772d95a6-c2ce-48a6-a7d0-bc1f4b77c323" + }, + "source": [ + "In case the above does not work, you can continue the assignment by using the code below (make sure you remove the hashtags to run it). If you decide to use the data as specified below, also change the map at the start to 'Kampen'." + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "9a7e508a-b20a-416c-8f2a-c8dd36a60389", + "metadata": { + "id": "9a7e508a-b20a-416c-8f2a-c8dd36a60389" + }, + "outputs": [], + "source": [ + "# remote_url = https://github.com/VU-IVM/UNIGIS_ProgrammingGIS/tree/main/TAA2'\n", + "# file = 'kampen_buildings.gpkg'\n", + "#\n", + "# #request.urlretrieve(remote_url, file)\n", + "# buildings = gpd.GeoDataFrame.from_file('kampen_buildings.gpkg')" + ] + }, + { + "cell_type": "markdown", + "id": "53e45bdb-36a3-4efd-b0e4-111f5fd858fe", + "metadata": { + "id": "53e45bdb-36a3-4efd-b0e4-111f5fd858fe" + }, + "source": [ + "Now let's see what information is actually extracted:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26a60806-c927-4d0c-ab04-dc07c9c7a688", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 460 + }, + "id": "26a60806-c927-4d0c-ab04-dc07c9c7a688", + "outputId": "c4e83f03-b5cf-4421-836b-4262a804f6d1" + }, + "outputs": [], + "source": [ + "buildings.head()" + ] + }, + { + "cell_type": "markdown", + "id": "2f7f7ff1-ed38-4dca-b2ad-f09472566879", + "metadata": { + "id": "2f7f7ff1-ed38-4dca-b2ad-f09472566879" + }, + "source": [ + "As you notice in the output of the cell above, there are many columns which just contain \"NaN\". And there even seem to be to many columns to even visualize properly in one view.\n", + "\n", + "Let's check what information is collected for the different buildings:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b78b1253-16b0-4513-8903-966b1816715f", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "b78b1253-16b0-4513-8903-966b1816715f", + "outputId": "b00fd26f-4ab5-4acb-8e8a-df34bc2b9fc3" + }, + "outputs": [], + "source": [ + "buildings.columns" + ] + }, + { + "cell_type": "markdown", + "id": "772be8a9-7ab6-4996-9311-e165fcc6c8ed", + "metadata": { + "id": "772be8a9-7ab6-4996-9311-e165fcc6c8ed" + }, + "source": [ + "
\n", + "Question 12: Let's have a look at the extracted building information. Please describe in your own words the information it contains. Is there specific information that suprises you to see, and do you think anything is missing that you expected?\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "d7077034-4cfe-436a-b5b2-64fc77f24ae5", + "metadata": { + "id": "d7077034-4cfe-436a-b5b2-64fc77f24ae5" + }, + "source": [ + "One interesting column is called `start_date`. This shows the building year per building.\n", + "\n", + "Let's explore this year of building a bit more.\n", + "\n", + "First, it would be interesting to get an idea how many buildings are build in each year through using the `value_counts()` function. Normally, that functions ranks the values in descending order (high to low). We are more interested in how this has developed over time. So we use the `sort_index()` function to sort the values by year. Add these two functions in the cell below." + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "e27c9a71-68b4-4adc-a1b4-52ff94275a6f", + "metadata": { + "id": "e27c9a71-68b4-4adc-a1b4-52ff94275a6f" + }, + "outputs": [], + "source": [ + "building_year = buildings. #complete function" + ] + }, + { + "cell_type": "markdown", + "id": "e9e9c436-fd01-46f7-8f73-44eccafe7816", + "metadata": { + "id": "e9e9c436-fd01-46f7-8f73-44eccafe7816" + }, + "source": [ + "There is not better way to further explore this years than through plotting it. Don't forget to add things such as a x label, y label and title. Have a look at some of the matplotlib [tutorials](https://matplotlib.org/stable/tutorials/introductory/quick_start.html). Note that you need to look at the code that also uses subplots and where they use the `ax` option. Perhaps also consider setting a threshold to make the figure more easy to visualise?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "35a6ee4b-f664-4955-9781-86d56920b3e4", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "35a6ee4b-f664-4955-9781-86d56920b3e4", + "outputId": "f51f5e22-aeda-4ec6-c0d4-7be7b6dbdd42" + }, + "outputs": [], + "source": [ + "fig,ax = plt.subplots(1,1,figsize=(5,18))\n", + "\n", + "building_year.plot(kind='barh',ax=ax)\n", + "\n", + "ax.tick_params(axis='y', which='major', labelsize=7)" + ] + }, + { + "cell_type": "markdown", + "id": "7e5ce5b6-f7b6-47a4-b4b7-2cac7cc933bf", + "metadata": { + "id": "7e5ce5b6-f7b6-47a4-b4b7-2cac7cc933bf" + }, + "source": [ + "
\n", + "Question 13: Please upload a figure that shows the development of building stock over the years in your region of interest. Make sure it contains all the necessary elements (labels on the axis, title, etc.)\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "089f6011-87fd-464a-ad8b-52ad810d8b75", + "metadata": { + "id": "089f6011-87fd-464a-ad8b-52ad810d8b75" + }, + "source": [ + "What we also noticed is that quite some buildings are identified as 'yes'. This is not very useful as it does not really say much about the use of the building.\n", + "\n", + "Let's see for how many buildings this is the case. Use the .value_counts function:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ca163a97-54bd-4050-bea6-2721d024a1eb", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 993 + }, + "id": "ca163a97-54bd-4050-bea6-2721d024a1eb", + "outputId": "94a378d4-bd6a-4efb-94e6-076ed1f1afca" + }, + "outputs": [], + "source": [ + "buildings.building. #complete function" + ] + }, + { + "cell_type": "markdown", + "id": "502fcb4a-cc93-46fa-bc1a-5dad7f4438bc", + "metadata": { + "id": "502fcb4a-cc93-46fa-bc1a-5dad7f4438bc" + }, + "source": [ + "As you have seen from the `value_counts` function, there are quite a few buildings with only very few tags. You could either consider to not include them in your plot at all (for example by using the `isin` function or the `query` function, see also [here](https://stackoverflow.com/questions/12096252/use-a-list-of-values-to-select-rows-from-a-pandas-dataframe)), or rename them, similar to how you named the natural land cover classes for the land-use map. Here, we filter the dataframe to include only specific classes of buildings." + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "6ffd00f1-e13c-4c60-885e-d7fb6ebe895b", + "metadata": { + "id": "6ffd00f1-e13c-4c60-885e-d7fb6ebe895b" + }, + "outputs": [], + "source": [ + "buildings = buildings[buildings['building'].isin(['yes', 'house', 'industrial', 'apartment'])]" + ] + }, + { + "cell_type": "markdown", + "id": "22598d8d-a73c-41b7-befd-f8abafc86162", + "metadata": { + "id": "22598d8d-a73c-41b7-befd-f8abafc86162" + }, + "source": [ + "Now let's visualize the buildings again. We need to create a similar color dictionary as we did for the land-use categories. Now its up to you to make it!" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "id": "739a2389-8302-4e4f-8624-2beb0225ecfd", + "metadata": { + "id": "739a2389-8302-4e4f-8624-2beb0225ecfd" + }, + "outputs": [], + "source": [ + "color_dict = { 'yes' : \"#f1134b\",\n", + " 'house':'#f13013',\n", + " 'industrial':'#0f045c',\n", + " 'apartment':'#fcfcb9' }" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "54672469-3961-4b67-860e-17f9320d1a62", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "54672469-3961-4b67-860e-17f9320d1a62", + "outputId": "c172f78b-7643-4c4a-f0c6-655dcc2da355" + }, + "outputs": [], + "source": [ + "map_dict = dict(zip(color_dict.keys(),[x for x in range(len(color_dict))]))\n", + "buildings['col_landuse'] =buildings.building.apply(lambda x: color_dict[x])" + ] + }, + { + "cell_type": "markdown", + "id": "0bbaef6d-6b28-45f4-ace9-6a5c9dec0f2f", + "metadata": { + "id": "0bbaef6d-6b28-45f4-ace9-6a5c9dec0f2f" + }, + "source": [ + "And plot the figure in the same manner!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7dad1b9f-855a-468e-9090-25d7ace2990d", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 847 + }, + "id": "7dad1b9f-855a-468e-9090-25d7ace2990d", + "outputId": "68968e35-8949-4abd-c593-2ef1254d81d8" + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(1, 1,figsize=(12,10))\n", + "\n", + "# add color scheme\n", + "color_scheme_map = list(color_dict.values())\n", + "cmap = LinearSegmentedColormap.from_list(name='landuse',\n", + " colors=color_scheme_map)\n", + "\n", + "# and plot the land-use map.\n", + "buildings.plot(color=buildings['col_landuse'],ax=ax,linewidth=0)\n", + "\n", + "# remove the ax labels\n", + "ax.set_xticks([])\n", + "ax.set_yticks([])\n", + "ax.set_axis_off()\n", + "\n", + "# add a legend:\n", + "legend_elements = []\n", + "for iter_,item in enumerate(color_dict):\n", + " legend_elements.append(Patch(facecolor=color_scheme_map[iter_],label=item))\n", + "\n", + "ax.legend(handles=legend_elements,edgecolor='black',facecolor='#fefdfd',prop={'size':12},loc=(1.02,0.2))\n", + "\n", + "# add a title\n", + "ax.set_title(place_name,fontweight='bold')" + ] + }, + { + "cell_type": "markdown", + "id": "7fc1437d-8deb-4569-a3ee-9270676f0e41", + "metadata": { + "id": "7fc1437d-8deb-4569-a3ee-9270676f0e41" + }, + "source": [ + "
\n", + "Question 14: Please upload a figure of your building stock map of your region of interest. Make sure that the interpretation is clear. If necessary, merge multiple categories into one (i.e., when some categories only contain 1 or 2 buildings).\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "508022f5-46d7-4c69-91d2-46711d6a514c", + "metadata": { + "id": "508022f5-46d7-4c69-91d2-46711d6a514c" + }, + "source": [ + "### 7. Perform a damage assessment of the road network using OpenStreetMap\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "b8d7623d-40ee-4262-9781-0c2ed3ea1889", + "metadata": { + "id": "b8d7623d-40ee-4262-9781-0c2ed3ea1889" + }, + "source": [ + "Generally, wind damage does not cause much damage to roads. There will be clean-up cost of the trees that will fall on the roads, but structural damage is rare. As such, we will only do a flood damage assessment for the road network of our region.\n", + "\n", + "To do so, we first need to extract the roads again. We will use the `graph_from_place()` function again to do so. However, the area will be to large to extract roads, so we will focus our analysis on the main network." + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "abacf8e1-b27c-4156-8521-87f38004ac2e", + "metadata": { + "id": "abacf8e1-b27c-4156-8521-87f38004ac2e" + }, + "outputs": [], + "source": [ + "cf = '[\"highway\"~\"trunk|motorway|primary|secondary\"]'\n", + "G = ox.graph_from_place(place_name, network_type=\"drive\", custom_filter=cf)" + ] + }, + { + "cell_type": "markdown", + "id": "87de9a96-e3fc-4ab5-b090-be6412a0d0a1", + "metadata": { + "id": "87de9a96-e3fc-4ab5-b090-be6412a0d0a1" + }, + "source": [ + "Now we convert the road network to a `geodataframe`." + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "90acac15-3b1e-4c0a-b0a4-6033d243f9ea", + "metadata": { + "id": "90acac15-3b1e-4c0a-b0a4-6033d243f9ea" + }, + "outputs": [], + "source": [ + "roads = gpd.GeoDataFrame(nx.to_pandas_edgelist(G))\n", + "roads.highway = roads.highway.astype('str')" + ] + }, + { + "cell_type": "markdown", + "id": "56f95cc0-2611-472f-92fa-c256f368c33c", + "metadata": { + "id": "56f95cc0-2611-472f-92fa-c256f368c33c" + }, + "source": [ + "In case the above does not work, you can continue the assignment by using the code below (make sure you remove the hashtags to run it)." + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "55752d12-81de-4eb5-b849-90473f88478a", + "metadata": { + "id": "55752d12-81de-4eb5-b849-90473f88478a" + }, + "outputs": [], + "source": [ + "#from urllib import request\n", + "# remote_url = 'https://github.com/VU-IVM/UNIGIS_ProgrammingGIS/tree/main/TAA2'\n", + "# file = 'kampen_roads.gpkg'\n", + "#\n", + "# #request.urlretrieve(remote_url, file)\n", + "# roads = gpd.GeoDataFrame.from_file('kampen_roads.gpkg')" + ] + }, + { + "cell_type": "markdown", + "id": "73f4a201-87b1-4cd8-a206-6b965c9b4107", + "metadata": { + "id": "73f4a201-87b1-4cd8-a206-6b965c9b4107" + }, + "source": [ + "And lets have a look at the data:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "91a864f8-6af7-454f-869c-197e5e47151b", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 807 + }, + "id": "91a864f8-6af7-454f-869c-197e5e47151b", + "outputId": "01bfca83-8de6-4d76-90df-4702886e66fb" + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(1, 1,figsize=(12,10))\n", + "\n", + "\n", + "roads.plot(column='highway',legend=True,ax=ax,legend_kwds={'loc': 'lower right'});\n", + "\n", + "\n", + "# remove the ax labels\n", + "ax.set_xticks([])\n", + "ax.set_yticks([])\n", + "ax.set_axis_off()" + ] + }, + { + "cell_type": "markdown", + "id": "4789ae59-e6c9-4a1c-a1ad-44e94c9172ca", + "metadata": { + "id": "4789ae59-e6c9-4a1c-a1ad-44e94c9172ca" + }, + "source": [ + "Dependening on the region you have selected, you may have lists in your data. It is actually quite inconvenient to have all these lists in the data for when we want to do the damage assessment. Let's clean this up a bit. To do so, we first make sure that all the lists are represented as actual lists, and not lists wrapped within a string." + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "51c4746a-6efd-4b59-8b6b-5fe9a8c42372", + "metadata": { + "id": "51c4746a-6efd-4b59-8b6b-5fe9a8c42372" + }, + "outputs": [], + "source": [ + "roads.highway = roads.highway.apply(lambda x: x.strip('][').split(', '))" + ] + }, + { + "cell_type": "markdown", + "id": "eb311b10-0a1c-4e0a-ad1f-cef37aa40ad7", + "metadata": { + "id": "eb311b10-0a1c-4e0a-ad1f-cef37aa40ad7" + }, + "source": [ + "Now we just need to grab the first element of each of the lists." + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "9e449847-c279-479e-bf3b-382b8c50e018", + "metadata": { + "id": "9e449847-c279-479e-bf3b-382b8c50e018" + }, + "outputs": [], + "source": [ + "roads.highway = roads.highway.apply(lambda x: x[0] if isinstance(x, list) else x)\n", + "roads.highway = roads.highway.str.replace(\"'\",\"\")" + ] + }, + { + "cell_type": "markdown", + "id": "5b3f95ad-9a1f-43e1-b098-45255c9d5dd2", + "metadata": { + "id": "5b3f95ad-9a1f-43e1-b098-45255c9d5dd2" + }, + "source": [ + "And let's have a look whether this worked:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21dc3a62-c266-4d0e-bd03-ad1d1b4b22e8", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 807 + }, + "id": "21dc3a62-c266-4d0e-bd03-ad1d1b4b22e8", + "outputId": "0361fc7e-ad9c-40f4-a767-aac6ac1d84cc" + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(1, 1,figsize=(12,10))\n", + "\n", + "roads.plot(column='highway',legend=True,ax=ax,legend_kwds={'loc': 'upper left','ncol':1});\n", + "\n", + "# remove the ax labels\n", + "ax.set_xticks([])\n", + "ax.set_yticks([])\n", + "ax.set_axis_off()" + ] + }, + { + "cell_type": "markdown", + "id": "d784f6dc-7091-4e60-b7df-58682efb66ef", + "metadata": { + "id": "d784f6dc-7091-4e60-b7df-58682efb66ef" + }, + "source": [ + "Nice! now let's start with the damage calculation. As you already have may have noticed, our data is now not stored in raster format, but in vector format. One way to deal with this issue is to convert our vector data to raster data, but we will lose a lot of information and detail. As such, we will perform the damage assessment on the road elements, using the xarray flood map.\n", + "\n", + "Let's start with preparing the flood data into vector format:" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "af68dc43-fd65-416c-bc7a-a1b1231187d3", + "metadata": { + "id": "af68dc43-fd65-416c-bc7a-a1b1231187d3" + }, + "outputs": [], + "source": [ + "# get the mean values\n", + "flood_map_vector = flood_map_area['band_data'].to_dataframe().reset_index()\n", + "\n", + "# create geometry values and drop lat lon columns\n", + "flood_map_vector['geometry'] = [shapely.points(x) for x in list(zip(flood_map_vector['x'],flood_map_vector['y']))]\n", + "flood_map_vector = flood_map_vector.drop(['x','y','band','spatial_ref'],axis=1)\n", + "\n", + "# drop all non values to reduce size\n", + "flood_map_vector = flood_map_vector.loc[~flood_map_vector['band_data'].isna()].reset_index(drop=True)\n", + "\n", + "# and turn them into squares again:\n", + "flood_map_vector.geometry= shapely.buffer(flood_map_vector.geometry,distance=100/2,cap_style='square').values" + ] + }, + { + "cell_type": "markdown", + "id": "9894f1ba-e637-4ede-b46c-5aa4747eaea0", + "metadata": { + "id": "9894f1ba-e637-4ede-b46c-5aa4747eaea0" + }, + "source": [ + "And let's plot the results:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5f6ab83a-62af-4142-bb26-157e077d868b", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 481 + }, + "id": "5f6ab83a-62af-4142-bb26-157e077d868b", + "outputId": "adbb0e5e-7487-4890-f767-3bbd11ded3ae" + }, + "outputs": [], + "source": [ + "gpd.GeoDataFrame(flood_map_vector.copy()).plot(column='band_data',cmap='Blues',vmax=5,linewidth=0)" + ] + }, + { + "cell_type": "markdown", + "id": "1cdbc0d8-beba-4b37-be49-f5226953f19b", + "metadata": { + "id": "1cdbc0d8-beba-4b37-be49-f5226953f19b" + }, + "source": [ + "We will need a bunch of functions to make sure we can do our calculations. They are specified below." + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "d470c747-42aa-4f20-bbf3-90773c3d4cc8", + "metadata": { + "id": "d470c747-42aa-4f20-bbf3-90773c3d4cc8" + }, + "outputs": [], + "source": [ + "def reproject(df_ds, current_crs=\"epsg:4326\", approximate_crs=\"epsg:3035\"):\n", + " \"\"\"\n", + " Reproject geometries in a DataFrame from one coordinate reference system (CRS) to another.\n", + "\n", + " Parameters:\n", + " df_ds : pandas.DataFrame\n", + " A DataFrame containing a 'geometry' column with geometries to reproject.\n", + " current_crs : str or pyproj.CRS, optional\n", + " The current coordinate reference system of the geometries. Default is \"epsg:4326\".\n", + " approximate_crs : str or pyproj.CRS, optional\n", + " The target coordinate reference system to reproject the geometries into. Default is \"epsg:3035\".\n", + "\n", + " Returns:\n", + " shapely.GeometryArray\n", + " A Shapely GeometryArray containing the reprojected geometries.\n", + " \"\"\"\n", + " geometries = df_ds['geometry']\n", + " coords = shapely.get_coordinates(geometries)\n", + " transformer = pyproj.Transformer.from_crs(current_crs, approximate_crs, always_xy=True)\n", + " new_coords = transformer.transform(coords[:, 0], coords[:, 1])\n", + "\n", + " return shapely.set_coordinates(geometries.copy(), np.array(new_coords).T)\n", + "\n", + "\n", + "def buffer_assets(assets, buffer_size=100):\n", + " \"\"\"\n", + " Create a buffer around each geometry in the assets DataFrame.\n", + "\n", + " Parameters:\n", + " assets : pandas.DataFrame\n", + " A DataFrame containing a 'geometry' column with geometries to buffer.\n", + " buffer_size : float, optional\n", + " The distance to buffer around each geometry. Default is 100 units.\n", + "\n", + " Returns:\n", + " pandas.DataFrame\n", + " The input DataFrame with an additional 'buffered' column containing the buffered geometries.\n", + " \"\"\"\n", + " assets['buffered'] = shapely.buffer(assets.geometry.values, buffer_size)\n", + " return assets\n", + "\n", + "\n", + "def overlay_hazard_assets(df_ds, assets):\n", + " \"\"\"\n", + " Find the indices of hazards that overlay or intersect with assets.\n", + "\n", + " Parameters:\n", + " df_ds : pandas.DataFrame\n", + " A DataFrame containing hazard geometries in a 'geometry' column.\n", + " assets : pandas.DataFrame\n", + " A DataFrame containing asset geometries in a 'geometry' column.\n", + "\n", + " Returns:\n", + " numpy.ndarray\n", + " An array of indices of hazards that intersect with the assets.\n", + " \"\"\"\n", + " # Build a spatial index for the hazard geometries\n", + " hazard_tree = shapely.STRtree(df_ds.geometry.values)\n", + " # Determine geometry type of the first asset\n", + " asset_geom_type = shapely.get_type_id(assets.iloc[0].geometry)\n", + " # If the asset geometry is a polygon or multipolygon\n", + " if (asset_geom_type == 3) or (asset_geom_type == 6):\n", + " return hazard_tree.query(assets.geometry, predicate='intersects')\n", + " else:\n", + " # If the asset geometry is not polygon/multipolygon, use buffered geometries\n", + " return hazard_tree.query(assets.buffered, predicate='intersects')\n", + "\n", + "\n", + "def get_damage_per_asset(asset, df_ds, assets):\n", + " \"\"\"\n", + " Calculate the total damage for a single asset based on overlapping hazards.\n", + "\n", + " Parameters:\n", + " asset : tuple\n", + " A tuple containing the asset index and a DataFrame with hazard points intersecting the asset.\n", + " df_ds : pandas.DataFrame\n", + " A DataFrame containing hazard data with a 'geometry' column.\n", + " assets : pandas.DataFrame\n", + " A DataFrame containing asset data with a 'geometry' column.\n", + "\n", + " Returns:\n", + " tuple\n", + " A tuple containing the asset index and the calculated damage.\n", + " \"\"\"\n", + " # Find the exact hazard overlays\n", + " get_hazard_points = df_ds.iloc[asset[1]['hazard_point'].values].reset_index()\n", + " # Select hazard points that intersect with the asset geometry\n", + " asset_geom = assets.iloc[asset[0]].geometry\n", + " get_hazard_points = get_hazard_points.loc[shapely.intersects(get_hazard_points.geometry.values, asset_geom)]\n", + "\n", + " # Parameters for damage calculation\n", + " maxdam_asset = 100 # Maximum damage per asset\n", + " hazard_intensity = np.arange(0, 10, 0.1) # Hazard intensity levels\n", + " fragility_values = np.arange(0, 1, 0.01) # Fragility values corresponding to hazard intensity\n", + "\n", + " if len(get_hazard_points) == 0:\n", + " return asset[0], 0\n", + " else:\n", + " # Calculate the length of the intersection between hazard and asset geometries\n", + " get_hazard_points['overlay_meters'] = shapely.length(\n", + " shapely.intersection(get_hazard_points.geometry.values, asset_geom))\n", + " # Interpolate fragility values based on hazard intensity\n", + " damage = np.sum(\n", + " (np.interp(get_hazard_points.band_data.values, hazard_intensity, fragility_values))\n", + " * get_hazard_points.overlay_meters * maxdam_asset)\n", + " return asset[0], damage" + ] + }, + { + "cell_type": "markdown", + "id": "622a243c-dd99-44c1-975c-7cb4eab99359", + "metadata": { + "id": "622a243c-dd99-44c1-975c-7cb4eab99359" + }, + "source": [ + "Now we need to make sure that the road data is the same coordinate system." + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "484c68a5-90ae-4394-9e4f-4ed5ba0c665d", + "metadata": { + "id": "484c68a5-90ae-4394-9e4f-4ed5ba0c665d" + }, + "outputs": [], + "source": [ + "roads.geometry = reproject(roads)" + ] + }, + { + "cell_type": "markdown", + "id": "efebb735-7955-4a75-bedf-1b213067fe20", + "metadata": { + "id": "efebb735-7955-4a75-bedf-1b213067fe20" + }, + "source": [ + "And we can now overlay the roads with the flood data" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "60de298f-9e06-40c3-b3a2-eecf2aa7205d", + "metadata": { + "id": "60de298f-9e06-40c3-b3a2-eecf2aa7205d" + }, + "outputs": [], + "source": [ + "overlay_roads = pd.DataFrame(overlay_hazard_assets(flood_map_vector,buffer_assets(roads)).T,columns=['asset','hazard_point'])" + ] + }, + { + "cell_type": "markdown", + "id": "53aeaec5-4ea3-48a5-93b5-109a1578c77e", + "metadata": { + "id": "53aeaec5-4ea3-48a5-93b5-109a1578c77e" + }, + "source": [ + "And estimate the damages" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "daa56503-90e8-4b7f-a5dc-82a4b235e95b", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "daa56503-90e8-4b7f-a5dc-82a4b235e95b", + "outputId": "059ff95d-6e35-4a68-ebcf-31ee13910468" + }, + "outputs": [], + "source": [ + "collect_output = []\n", + "for asset in tqdm(overlay_roads.groupby('asset'),total=len(overlay_roads.asset.unique()),\n", + " desc='polyline damage calculation for'):\n", + " collect_output.append(get_damage_per_asset(asset,flood_map_vector,roads))\n", + "\n", + "damaged_roads = roads.merge(pd.DataFrame(collect_output,columns=['index','damage']),\n", + " left_index=True,right_on='index')[['highway','geometry','damage']]" + ] + }, + { + "cell_type": "markdown", + "id": "580663ca-b83f-4724-a699-b6a4790678ad", + "metadata": { + "id": "580663ca-b83f-4724-a699-b6a4790678ad" + }, + "source": [ + "
\n", + "Question 15: Describe the various steps we have taken to perform the damage assessment on the road network. How is this approach different compared to the raster-based approach? Highlight the differences you find most important. Include any line of code you may want to include to make your story clear.\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "2e42c7f3-c868-400c-858e-7ac0c848fd4c", + "metadata": { + "id": "2e42c7f3-c868-400c-858e-7ac0c848fd4c" + }, + "source": [ + "And let's plot the results" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef910b4e-201e-444b-92b6-826be82a5164", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 864 + }, + "id": "ef910b4e-201e-444b-92b6-826be82a5164", + "outputId": "eead7d6c-01ea-4851-d8d0-b756fea0798e" + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(1, 1,figsize=(12,10))\n", + "\n", + "damaged_roads.plot(column='damage',cmap='Reds',ax=ax)" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "fe92fb12-9049-4e15-8992-b3d0cbd459b5", + "metadata": { + "id": "fe92fb12-9049-4e15-8992-b3d0cbd459b5" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "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.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/TAA2/tutorial.ipynb b/TAA2/tutorial.ipynb index ffe4bc0..da93bba 100644 --- a/TAA2/tutorial.ipynb +++ b/TAA2/tutorial.ipynb @@ -3,7 +3,9 @@ { "cell_type": "markdown", "id": "cbd68ab3-f04b-434f-a956-e730535c9ee5", - "metadata": {}, + "metadata": { + "id": "cbd68ab3-f04b-434f-a956-e730535c9ee5" + }, "source": [ "## TAA2: Natural Hazard Risk Assessment using Open Data" ] @@ -11,26 +13,32 @@ { "cell_type": "markdown", "id": "4c8cc742-23a7-4895-8d2a-7e826d8a23b8", - "metadata": {}, + "metadata": { + "id": "4c8cc742-23a7-4895-8d2a-7e826d8a23b8" + }, "source": [ "Within this tutorial, we are going to use publicly available hazard data and exposure data to do a risk assessment for the Netherlands. More specifically, we will look at damage due to wind storms and flooding. We will use both Copernicus Land Cover data and OpenStreetMap to estimate the potential damage of natural hazards to the built environment.\n", - " \n", - "We will first download, access and explore hazard data retrieved from the Copernicus Climate Data Copernicus Store and the European Commission Joint Research Centre. After this, we will learn how to download and access Copernicus Land Cover data. We will also explore the power of OpenStreetMap that provides vector data. We will learn how to extract information from OpenStreetMap, how you can explore and visualize this. Lastly, we will use Copernicus Land Cover data to estimate the damage to specific land-uses, whereas we will use OpenStreetMap to assess the potential damage to the road system." + "\n", + "We will first download, access and explore hazard data retrieved from the Copernicus Climate Data Copernicus Store and the European Commission Joint Research Centre. We will also explore the power of OpenStreetMap that provides vector data. We will learn how to extract information from OpenStreetMap, how you can explore and visualize this. Lastly, we will use Copernicus Land Cover data to estimate the damage to specific land-uses, whereas we will use OpenStreetMap to assess the potential damage to the road system." ] }, { "cell_type": "markdown", "id": "4355fca9-3e21-4556-a5d0-3e1577c68643", - "metadata": {}, + "metadata": { + "id": "4355fca9-3e21-4556-a5d0-3e1577c68643" + }, "source": [ - "## Learning Objectives\n", + "### Learning Objectives\n", "
" ] }, { "cell_type": "markdown", "id": "04dd18de-459a-4cb4-891e-cc3c98e76e7a", - "metadata": {}, + "metadata": { + "id": "04dd18de-459a-4cb4-891e-cc3c98e76e7a" + }, "source": [ "- To understand the use of **OSMnx** to extract geospatial data from OpenStreetmap.\n", "- To know how to download data from the Copernicus Climate Data Store using the `cdsapi` and access it through Python.\n", @@ -49,18 +57,22 @@ { "cell_type": "markdown", "id": "88a7cd45-4394-44fb-ba1b-e52464223d42", - "metadata": {}, + "metadata": { + "id": "88a7cd45-4394-44fb-ba1b-e52464223d42" + }, "source": [ - "## 1. Introducing the packages\n", + "### 1. Introducing the packages\n", "
" ] }, { "cell_type": "markdown", "id": "961d01ad-b5d4-4486-9d00-04fd00142a19", - "metadata": {}, + "metadata": { + "id": "961d01ad-b5d4-4486-9d00-04fd00142a19" + }, "source": [ - "Within this tutorial, we are going to make use of the following packages: \n", + "Within this tutorial, we are going to make use of the following packages:\n", "\n", "[**GeoPandas**](https://geopandas.org/) is a Python package that extends the datatypes used by pandas to allow spatial operations on geometric types.\n", "\n", @@ -79,14 +91,15 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "b1d683ee-d2b5-49a5-9b31-9ab50039f428", - "metadata": {}, + "metadata": { + "id": "b1d683ee-d2b5-49a5-9b31-9ab50039f428" + }, "outputs": [], "source": [ - "import os\n", "import cdsapi\n", - "import shapely \n", + "import shapely\n", "import matplotlib\n", "import urllib3\n", "import pyproj\n", @@ -99,8 +112,11 @@ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import networkx as nx\n", + "import cdsapi\n", "\n", - "from matplotlib.colors import ListedColormap\n", + "from matplotlib.colors import LinearSegmentedColormap,ListedColormap\n", + "from matplotlib.patches import Patch\n", + "from geocube.api.core import make_geocube\n", "from zipfile import ZipFile\n", "from io import BytesIO\n", "from urllib.request import urlopen\n", @@ -113,7 +129,9 @@ { "cell_type": "markdown", "id": "d3208479-d07e-4d6d-afd7-a9944b9630c0", - "metadata": {}, + "metadata": { + "id": "d3208479-d07e-4d6d-afd7-a9944b9630c0" + }, "source": [ "Import error? Not all of the packages were installed already. Make sure to install the missing packages using pip install in the cell below and then run the cell above again:" ] @@ -122,57 +140,73 @@ "cell_type": "code", "execution_count": null, "id": "d395181b-53d5-48de-84ff-55e27da494a2", - "metadata": {}, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "d395181b-53d5-48de-84ff-55e27da494a2", + "outputId": "b5418cb6-c160-4ec0-ed2a-f539eb9d5568" + }, "outputs": [], "source": [ - " # provide code to pip install missing packages" + " !pip install cdsapi\n", + " !pip install geocube\n", + " !pip install contextily\n", + " !pip install --pre osmnx\n", + " !pip install 'cdsapi>=0.7.0'" ] }, { "cell_type": "markdown", "id": "981898d2-5f8f-4990-a236-b1cfe2c7008e", - "metadata": {}, + "metadata": { + "id": "981898d2-5f8f-4990-a236-b1cfe2c7008e" + }, "source": [ - "## 2. Downloading and accessing natural hazard data\n", + "### 2. Downloading and accessing natural hazard data\n", "
" ] }, { "cell_type": "markdown", "id": "d7693fcc-a0cf-4ed4-a0d0-e3a00b917547", - "metadata": {}, + "metadata": { + "id": "d7693fcc-a0cf-4ed4-a0d0-e3a00b917547" + }, "source": [ - "We will first download and explore windstorm and flood data for the Netherlands. \n", + "We will first download and explore windstorm and flood data for the Netherlands.\n", "\n", - "### Windstorm Data\n", + "#### Windstorm Data\n", "
\n", "\n", - "The windstorm data will be downloaded from the [Copernicus Climate Data Store](https://cds.climate.copernicus.eu/). As we have seen during the lecture, and as you can also see by browsing on this website, there is an awful lot of climate data available through this Data Store. As such, it is very valuable to understand how to access and download this information to use within an analysis. To keep things simple, we only download one dataset today: [A winter windstorm](https://cds.climate.copernicus.eu/cdsapp#!/dataset/sis-european-wind-storm-indicators?tab=overview). \n", + "The windstorm data will be downloaded from the [Copernicus Climate Data Store](https://cds.climate.copernicus.eu/). As we have seen during the lecture, and as you can also see by browsing on this website, there is an awful lot of climate data available through this Data Store. As such, it is very valuable to understand how to access and download this information to use within an analysis. To keep things simple, we only download one dataset today: [A winter windstorm](https://cds.climate.copernicus.eu/cdsapp#!/dataset/sis-european-wind-storm-indicators?tab=overview).\n", "\n", "We will do so using an **API**, which is the acronym for application programming interface. It is a software intermediary that allows two applications to talk to each other. APIs are an accessible way to extract and share data within and across organizations. APIs are all around us. Every time you use a rideshare app, send a mobile payment, or change the thermostat temperature from your phone, you’re using an API.\n", "\n", - "However, before we can access this **API**, we need to take a few steps. Most importantly, we need to register ourselves on the [Copernicus Climate Data Store](https://cds.climate.copernicus.eu/) portal. To do so, we need to register, as explained in the video clip below:\n", + "However, before we can access this **API**, we need to take a few steps which can be found on the [CDSAPI setup webpage of the Copernicus Climate Data Store](https://cds-beta.climate.copernicus.eu/how-to-api/). The first step is to register yourself on the [Copernicus Climate Data Store](https://cds.climate.copernicus.eu/) portal. \n", "\n", - "\n", - "
\n", + "Now, the next step is to request access to the dataset. As you can see in the cell below, we download a specific windstorm that has occured on the 28th of October in 2013. This is storm [Carmen (also called St Jude)](https://en.wikipedia.org/wiki/St._Jude_storm). To download the relevant windstorm data, fill out the associated [dataset form](https://cds-beta.climate.copernicus.eu/datasets/sis-european-wind-storm-indicators?tab=download) and make sure to **agree to the Terms of Use**. \n", "\n", - "Now, the next step is to access the API. You can now login on the website of the [Copernicus Climate Data Store](https://cds.climate.copernicus.eu/). After you login, you can click on your name in the top right corner of the webpage (next to the login button). On the personal page that has just opened, you will find your user ID (**uid**) and your personal **API**. You need to add those in the cell below to be able to download the windstorm.\n", - "\n", - "As you can see in the cell below, we download a specific windstorm that has occured on the 28th of October in 2013. This is storm [Carmen (also called St Jude)](https://en.wikipedia.org/wiki/St._Jude_storm). " + "The last step is to access the API. You can now login on the website of the [Copernicus Climate Data Store](https://cds.climate.copernicus.eu/). After you login, you can click on your name in the top right corner of the webpage (next to the login button). On the personal page that has just opened, you will find your personal access token **API**. You need to add this in the cell below to be able to download the windstorm." ] }, { "cell_type": "code", "execution_count": null, "id": "4736833f-c0ec-48f4-8c29-1721ba2ecb7d", - "metadata": {}, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4736833f-c0ec-48f4-8c29-1721ba2ecb7d", + "outputId": "2cd3a582-faa3-4293-be54-ff38771e4605" + }, "outputs": [], "source": [ - "uid = XXX\n", - "apikey = 'XXX'\n", - "\n", - "c = cdsapi.Client(key=f\"{uid}:{apikey}\", url=\"https://cds.climate.copernicus.eu/api/v2\")\n", - "\n", + "apikey = '' #add your personal API\n", + " \n", + "c = cdsapi.Client(key=f\"{apikey}\", url=\"https://cds-beta.climate.copernicus.eu/api\")\n", + " \n", "c.retrieve(\n", " 'sis-european-wind-storm-indicators',\n", " {\n", @@ -189,26 +223,33 @@ { "cell_type": "markdown", "id": "0ec192f1-8ac1-4e61-ac8f-c01d496e157f", - "metadata": {}, + "metadata": { + "id": "0ec192f1-8ac1-4e61-ac8f-c01d496e157f" + }, "source": [ - "### Flood Data\n", + "#### Flood Data\n", "
\n", "\n", - "The flood data we will extract from a repository maintained by the European Commission Joint Research Centre. We will download river flood hazard maps from their [Flood Data Collection](https://data.jrc.ec.europa.eu/dataset/1d128b6c-a4ee-4858-9e34-6210707f3c81). \n", + "The flood data we will extract from a repository maintained by the European Commission Joint Research Centre. We will download river flood hazard maps from their [Flood Data Collection](https://data.jrc.ec.europa.eu/dataset/1d128b6c-a4ee-4858-9e34-6210707f3c81).\n", "\n", "Here we do not need to use an API and we also do not need to register ourselves, so we can download any of the files directly. To do so, we use the `urllib` package." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "c30f3b19-cba4-4f4a-a902-082e396b7ac4", - "metadata": {}, + "metadata": { + "id": "c30f3b19-cba4-4f4a-a902-082e396b7ac4" + }, "outputs": [], "source": [ "## this is the link to the 1/100 flood map for Europe\n", "zipurl = 'https://jeodpp.jrc.ec.europa.eu/ftp/jrc-opendata/FLOODS/EuropeanMaps/floodMap_RP100.zip'\n", "\n", + "# The path where the downloaded flood map will be extracted, this is the folder of this Google Collaboratory instance. NOTE: a new instance will have this directory be cleared.\n", + "data_path = \"\"\n", + "\n", "# and now we open and extract the data\n", "with urlopen(zipurl) as zipresp:\n", " with ZipFile(BytesIO(zipresp.read())) as zfile:\n", @@ -218,7 +259,9 @@ { "cell_type": "markdown", "id": "e8baa489-3b9c-4d16-afdf-359651d2f6ba", - "metadata": {}, + "metadata": { + "id": "e8baa489-3b9c-4d16-afdf-359651d2f6ba" + }, "source": [ "The download and zip in the cell above sometimes does not work. If that is indeed the case (e.g., when it seems to remain stuck), download the files manually through the link and upload them in the data folder for this week (as explained at the start of this tutorial.)" ] @@ -226,70 +269,74 @@ { "cell_type": "markdown", "id": "94cb3103-bc54-4670-9936-f299561190f6", - "metadata": {}, + "metadata": { + "id": "94cb3103-bc54-4670-9936-f299561190f6" + }, "source": [ - "### Set location to explore\n", + "#### Set location to explore\n", "---\n", "Before we continue, we need to specify our location of interest. This should be a province that will have some flooding and relative high wind speeds occuring (else we will find zero damage). We specify the region of interest in the cell below by using the `geocode_to_gdf()` function." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "edb7b64e-de75-4490-ac72-bad321d4da2c", - "metadata": {}, + "metadata": { + "id": "edb7b64e-de75-4490-ac72-bad321d4da2c" + }, "outputs": [], "source": [ - "place_name = \"Gelderland, The Netherlands\" ### But you could also consider Zeeland, for example.\n", + "place_name = \"Kampen, The Netherlands\" ### But you could also consider a city in Zeeland, for example.\n", "area = ox.geocode_to_gdf(place_name)" ] }, { "cell_type": "markdown", "id": "9bd3821f-16dd-4e7b-8ac6-a46475704afd", - "metadata": {}, + "metadata": { + "id": "9bd3821f-16dd-4e7b-8ac6-a46475704afd" + }, "source": [ - "## 3. Exploring the natural hazard data\n", + "### 3. Exploring the natural hazard data\n", "
" ] }, - { - "cell_type": "markdown", - "id": "92e203b2-e4c0-458a-a91e-9218614baeab", - "metadata": {}, - "source": [ - "Now we will explore our natural hazard data." - ] - }, { "cell_type": "markdown", "id": "424d77ba-32df-44c4-a565-b197b7e4cefc", - "metadata": {}, + "metadata": { + "id": "424d77ba-32df-44c4-a565-b197b7e4cefc" + }, "source": [ - "### Windstorm Data\n", + "#### Windstorm Data\n", "---" ] }, { "cell_type": "markdown", "id": "8b379bcc-84a2-4bb6-86a6-d0e3ad0d1c84", - "metadata": {}, + "metadata": { + "id": "8b379bcc-84a2-4bb6-86a6-d0e3ad0d1c84" + }, "source": [ "As you can see in the section above, we have downloaded the storm footprint in a zipfile. Let's open the zipfile and load the dataset using the `xarray` package through the `open_dataset()` function." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "64d33537-8db8-4def-89ee-2387ec993831", - "metadata": {}, + "metadata": { + "id": "64d33537-8db8-4def-89ee-2387ec993831" + }, "outputs": [], "source": [ "with ZipFile('Carmen.zip') as zf:\n", - " \n", + "\n", " # Let's get the filename first\n", " file = zf.namelist()[0]\n", - " \n", + "\n", " # And now we can open and select the file within Python\n", " with zf.open(file) as f:\n", " windstorm_europe = xr.open_dataset(f)" @@ -298,7 +345,9 @@ { "cell_type": "markdown", "id": "375410e2-ebe5-4f4d-b924-ad15e8fb9d59", - "metadata": {}, + "metadata": { + "id": "375410e2-ebe5-4f4d-b924-ad15e8fb9d59" + }, "source": [ "Let's have a look at the storm we have downloaded!" ] @@ -307,28 +356,27 @@ "cell_type": "code", "execution_count": null, "id": "7d35bb91-0705-4d80-b063-adabc74cc353", - "metadata": {}, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 490 + }, + "id": "7d35bb91-0705-4d80-b063-adabc74cc353", + "outputId": "f6fbb7c5-9649-41db-ca5f-0251faa6357a" + }, "outputs": [], "source": [ "windstorm_europe['FX'].plot()" ] }, - { - "cell_type": "markdown", - "id": "092e7f97-cf7a-4000-818f-1a73e578b0ec", - "metadata": {}, - "source": [ - "
\n", - "Question 1: Describe windstorm Carmen. When did this event happen, which areas were most affected? Can you say something about the maximum wind speeds in different areas, based on the plot? And what does FX mean?\n", - "
" - ] - }, { "cell_type": "markdown", "id": "13e8caf3-c5c3-4970-b923-b58d1fe007f8", - "metadata": {}, + "metadata": { + "id": "13e8caf3-c5c3-4970-b923-b58d1fe007f8" + }, "source": [ - "Unfortunately, our data does not have a proper coordinate system defined yet. As such, we will need to use the `rio.write_crs()` function to set the coordinate system to **EPSG:4326** (the standard global coordinate reference system). \n", + "Unfortunately, our data does not have a proper coordinate system defined yet. As such, we will need to use the `rio.write_crs()` function to set the coordinate system to **EPSG:4326** (the standard global coordinate reference system).\n", "\n", "We also need to make sure that the functions will know what the exact parameters are that we have to use for our spatial dimenions (e.g. longitude and latitude). It prefers to be named `x` and `y`. So we use the `rename()` function before we use the `set_spatial_dims()` function." ] @@ -337,10 +385,17 @@ "cell_type": "code", "execution_count": null, "id": "5ca7b6ec-a394-4e3c-82dd-8a59ce029563", - "metadata": {}, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 291 + }, + "id": "5ca7b6ec-a394-4e3c-82dd-8a59ce029563", + "outputId": "8bd1709a-1525-4d4d-e349-84ef40dce012" + }, "outputs": [], "source": [ - "windstorm_europe.rio.write_crs(4326, inplace=True)\n", + "windstorm_europe. #add CRS\n", "windstorm_europe = windstorm_europe.rename({'Latitude': 'y','Longitude': 'x'})\n", "windstorm_europe.rio.set_spatial_dims(x_dim=\"x\",y_dim=\"y\", inplace=True)" ] @@ -348,44 +403,54 @@ { "cell_type": "markdown", "id": "08e41966-7273-4521-9b27-4c9498a66e0b", - "metadata": {}, + "metadata": { + "id": "08e41966-7273-4521-9b27-4c9498a66e0b" + }, "source": [ "
\n", - "Question 2: Climate data is often stored as a netCDF file. Please describe what a netCDF file is. Which information is stored in the netCDF file we have downloaded for the windstorm? What type of metadata does it contain?\n", + "Question 1: Climate data is often stored as a netCDF file. Please describe what a netCDF file is. Which information is stored in the netCDF file we have downloaded for the windstorm? What type of metadata does it contain?\n", "
" ] }, { "cell_type": "markdown", "id": "8ba5e684-f658-42e9-bded-bbb47ced24e4", - "metadata": {}, + "metadata": { + "id": "8ba5e684-f658-42e9-bded-bbb47ced24e4" + }, "source": [ "Following, we also make sure it will be in the European coordinate system **EPSG:3035** to ensure we can easily use it together with the other data. To do so, we use the `rio.reproject()` function. You can simple add the number of the coordinate system." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "8b276083-7825-4576-832b-129566f65222", - "metadata": {}, + "metadata": { + "id": "8b276083-7825-4576-832b-129566f65222" + }, "outputs": [], "source": [ - "windstorm_europe = windstorm_europe. [add function]" + "windstorm_europe = windstorm_europe. # add reproject" ] }, { "cell_type": "markdown", "id": "0650103f-eed7-43f6-b9ef-a221781e356a", - "metadata": {}, + "metadata": { + "id": "0650103f-eed7-43f6-b9ef-a221781e356a" + }, "source": [ "Now we have all the information to clip the windstorm data to our area of interest:" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "86dbfe52-1484-48fd-9dee-fc6064fe343b", - "metadata": {}, + "metadata": { + "id": "86dbfe52-1484-48fd-9dee-fc6064fe343b" + }, "outputs": [], "source": [ "windstorm_map = windstorm_europe.rio.clip(area.envelope.values, area.crs)" @@ -394,7 +459,9 @@ { "cell_type": "markdown", "id": "237c142f-2741-41bf-bace-96b6fede47f2", - "metadata": {}, + "metadata": { + "id": "237c142f-2741-41bf-bace-96b6fede47f2" + }, "source": [ "And let's have a look as well by using the `plot()` function. Please note that the legend is in meters per second." ] @@ -403,34 +470,47 @@ "cell_type": "code", "execution_count": null, "id": "f2b8e8ca-6a58-44df-8981-b040cc55b3b0", - "metadata": {}, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 506 + }, + "id": "f2b8e8ca-6a58-44df-8981-b040cc55b3b0", + "outputId": "f34f6dcf-303a-4c67-d18b-2d604df8ec5b" + }, "outputs": [], "source": [ - "windstorm_map['FX']. [add function]" + "windstorm_map['FX'] # add plot function" ] }, { "cell_type": "markdown", "id": "4bded755-8d9b-41a0-bd6e-a25000bc7486", - "metadata": {}, + "metadata": { + "id": "4bded755-8d9b-41a0-bd6e-a25000bc7486" + }, "source": [ - "### Flood Data\n", + "#### Flood Data\n", "---" ] }, { "cell_type": "markdown", "id": "6ef96754-17bc-4d02-92ab-bb06280015a5", - "metadata": {}, + "metadata": { + "id": "6ef96754-17bc-4d02-92ab-bb06280015a5" + }, "source": [ "And similarly, we want to open the flood map. But now we do not have to unzip the file anymore and we can directly open it through using `xarray`:" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "b78db556-c66c-46a0-9615-b98e26b9e57f", - "metadata": {}, + "metadata": { + "id": "b78db556-c66c-46a0-9615-b98e26b9e57f" + }, "outputs": [], "source": [ "flood_map_path = 'floodmap_EFAS_RP100_C.tif'" @@ -440,7 +520,14 @@ "cell_type": "code", "execution_count": null, "id": "555fab92-0c74-426e-bcfe-655cf6b25682", - "metadata": {}, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 291 + }, + "id": "555fab92-0c74-426e-bcfe-655cf6b25682", + "outputId": "90525d96-e592-4918-9fc0-ab4b9dc95784" + }, "outputs": [], "source": [ "flood_map = xr.open_dataset(flood_map_path, engine=\"rasterio\")\n", @@ -450,7 +537,9 @@ { "cell_type": "markdown", "id": "5eb3c24d-4ed2-4717-befc-67e52e1bbbea", - "metadata": {}, + "metadata": { + "id": "5eb3c24d-4ed2-4717-befc-67e52e1bbbea" + }, "source": [ "And let's make sure we set all the variables and the CRS correctly again to be able to open the data properly. Note that we should now use **EPSG:3035**. This is the standard coordinate system for Europe, in meters (instead of degrees)." ] @@ -459,31 +548,40 @@ "cell_type": "code", "execution_count": null, "id": "b7e6de85-b165-4b7e-85ea-d09fe6bf9024", - "metadata": {}, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 291 + }, + "id": "b7e6de85-b165-4b7e-85ea-d09fe6bf9024", + "outputId": "14296427-2a11-432e-a17b-c3a2f163b201" + }, "outputs": [], "source": [ - "flood_map.rio.write_crs( , inplace=True)\n", + "flood_map.rio.write_crs(3035, inplace=True)\n", "flood_map.rio.set_spatial_dims(x_dim=\"x\",y_dim=\"y\", inplace=True)" ] }, { "cell_type": "markdown", "id": "9ebad344-dd4b-4c37-bafe-2464f11a79b2", - "metadata": {}, + "metadata": { + "id": "9ebad344-dd4b-4c37-bafe-2464f11a79b2" + }, "source": [ "Now it is pretty difficult to explore the data for our area of interest, so let's clip the flood data. \n", "\n", "We want to clip our flood data to our chosen area. The code, however, is very inefficient and will run into memories issues on Google Colab. As such, we first need to clip it by using a bounding box, followed by the actual clip.\n", "\n", "
\n", - "Question 3: Please provide the lines of code below in which you show how you have clipped the flood map to your area.\n", + "Question 2: Please provide the lines of code below in which you show how you have clipped the flood map to your area.\n", "
\n", "\n", "*A few hints*:\n", "\n", - "* carefully read the documentation of the `.clip_box()` function of rioxarray. Which information do you need? \n", - "* is the GeoDataFrame of your region (the area GeoDataframe) in the same coordinate system? Perhaps you need to convert it using the `.to_crs()` function. \n", - "* how do you get the bounds from your area GeoDataFrame? \n", + "* carefully read the documentation of the `.clip_box()` function of rioxarray. Which information do you need?\n", + "* is the GeoDataFrame of your region (the area GeoDataframe) in the same coordinate system? Perhaps you need to convert it using the `.to_crs()` function.\n", + "* how do you get the bounds from your area GeoDataFrame?\n", "* The final step of the clip would be to use the `.rio.clip()` function, using the actual area file and the flood map clipped to the bounding box. Please note that you should **not** use the envelope here, like we did in the previous clip. Here we really want to use the exact geometry values.\n", "\n", "As you will see, we first clip it very efficiently using the bounding box. After that, we do an exact clip." @@ -491,24 +589,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "id": "12a22299-6507-45b3-b4ef-1321a193ad8f", - "metadata": {}, + "metadata": { + "id": "12a22299-6507-45b3-b4ef-1321a193ad8f" + }, "outputs": [], "source": [ "min_lon = area.to_crs(epsg=3035).bounds.minx.values[0]\n", - "min_lat = area.to_crs(epsg=3035).bounds.miny\n", - "max_lon = area.to_crs(epsg=3035).bounds\n", - "max_lat = area.to_crs(epsg=3035).\n", + "min_lat = area.to_crs(epsg=3035).bounds.miny #complete function\n", + "max_lon = area.to_crs(epsg=3035).bounds #complete function\n", + "max_lat = area.to_crs(epsg=3035). #complete function\n", "\n", - "flood_map_area = flood_map.rio.clip_box(minx=.... )\n", - "flood_map_area = flood_map_area.rio.clip(area.XXXX.values, area.crs)" + "flood_map_area = flood_map.rio.clip_box #complete function\n", + "flood_map_area = flood_map_area.rio.clip( #add geometry values, area.crs)" ] }, { "cell_type": "markdown", "id": "c744f4ff-e7c2-4b1b-b366-9ebd577f76bd", - "metadata": {}, + "metadata": { + "id": "c744f4ff-e7c2-4b1b-b366-9ebd577f76bd" + }, "source": [ "And let's have a look as well. Please note that the legend is in meters." ] @@ -517,25 +619,48 @@ "cell_type": "code", "execution_count": null, "id": "58f23727-c8c0-4379-95f7-bc41ba5b3c6e", - "metadata": {}, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 506 + }, + "id": "58f23727-c8c0-4379-95f7-bc41ba5b3c6e", + "outputId": "da748cee-b5d4-46c2-e8fb-36ce6c41385d" + }, "outputs": [], "source": [ "flood_map_area['band_data'].plot(cmap='Blues',vmax=10)" ] }, + { + "cell_type": "markdown", + "id": "250b28b1-6da5-4700-9a17-5aa18967c120", + "metadata": { + "id": "250b28b1-6da5-4700-9a17-5aa18967c120" + }, + "source": [ + "
\n", + "Question 3: Now that we have both wind and flood maps, comment on their spatial resolution. What would the impact of the different in resolution for the outcome of your risk assessment?\n", + "
" + ] + }, { "cell_type": "markdown", "id": "c2c98ee1-d8f8-4eba-bfd2-36f26e849279", - "metadata": {}, + "metadata": { + "id": "c2c98ee1-d8f8-4eba-bfd2-36f26e849279" + }, "source": [ - "## 4. Downloading and exploring Land Cover data and Land Use data\n", + "### 4. Downloading and exploring Land Cover data and Land Use data\n", "
" ] }, { "cell_type": "markdown", "id": "d0402ee8-6460-4db0-b216-b16b88ff2c56", - "metadata": {}, + "metadata": { + "id": "d0402ee8-6460-4db0-b216-b16b88ff2c56" + }, "source": [ "We will explore rasterized Corine Land Cover data and land use data retrieved from OpenStreetMap." ] @@ -543,33 +668,35 @@ { "cell_type": "markdown", "id": "8ccebb6a-8c7b-4c7f-b974-899e15c9631b", - "metadata": {}, + "metadata": { + "id": "8ccebb6a-8c7b-4c7f-b974-899e15c9631b" + }, "source": [ - "### Download and access Copernicus Land Cover data\n", + "#### Download and access Copernicus Land Cover data\n", "---" ] }, { "cell_type": "markdown", "id": "672472d8-aff1-498f-ac36-41082ac32c4e", - "metadata": {}, + "metadata": { + "id": "672472d8-aff1-498f-ac36-41082ac32c4e" + }, "source": [ - "Unfortunately, there is no API option to download the [Corine Land Cover](https://land.copernicus.eu/pan-european/corine-land-cover) data. We will have to download the data from the website first.\n", - "\n", - "To do so, we will first have to register ourselves again on the website. Please find in the video clip below how to register yourself on the website of the [Copernicus Land Monitoring Service](https://land.copernicus.eu/):\n", + "We will now download the [Corine Land Cover](https://land.copernicus.eu/pan-european/corine-land-cover) data.\n", "\n", - "\n", - "\n", - "Now click on the Login button in the top right corner to login on the website. There are many interesting datasets on this website, but we just want to download the Corine Land Cover data, and specifically the latest version: [Corine Land Cover 2018](https://land.copernicus.eu/pan-european/corine-land-cover/clc2018?tab=download). To do so, please select the **Corine Land Cover - 100 meter**. Now click on the large green Download button. Your download should start any minute.\n", + "To do so, we will first have to register ourselves again on the website. Now click on the Login button in the top right corner to login on the website. There are many interesting datasets on this website, but we just want to download the Corine Land Cover data, and specifically the latest version: [Corine Land Cover 2018](https://land.copernicus.eu/pan-european/corine-land-cover/clc2018?tab=download). To do so, click on the large green Download button. Now please select the **Corine Land Cover - 100 meter** and add this to your cart. Next, go to your cart and click on Process download request. After this, the requested data can be downloaded via the 'downloading process page'. After hitting Download file, your download should start any minute.\n", "\n", "Slightly annoying, the file you have downloaded is double zipped. Its slightly inconvenient to open this through Python and within Google Drive. So let's unzip it twice outside of Python (on your local machine) and then direct yourself to the `DATA` directory within the unzipped file. Here you can find a file called `U2018_CLC2018_V2020_20u1.tif`. Drop this file into this week's data directory, as specified at the start of this tutorial when we mounted our Google Drive." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "id": "5e1c9079-cde0-4be2-8b72-f7403d5f0e4b", - "metadata": {}, + "metadata": { + "id": "5e1c9079-cde0-4be2-8b72-f7403d5f0e4b" + }, "outputs": [], "source": [ "CLC_location = 'U2018_CLC2018_V2020_20u1.tif'" @@ -577,9 +704,11 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "id": "baaa699e-1ba0-4ed8-9996-38d8cc81578b", - "metadata": {}, + "metadata": { + "id": "baaa699e-1ba0-4ed8-9996-38d8cc81578b" + }, "outputs": [], "source": [ "CLC = xr.open_dataset(CLC_location, engine=\"rasterio\")" @@ -588,27 +717,38 @@ { "cell_type": "markdown", "id": "d263e20d-d88b-4cf3-ad5c-c1ff2d93ad6b", - "metadata": {}, + "metadata": { + "id": "d263e20d-d88b-4cf3-ad5c-c1ff2d93ad6b" + }, "source": [ "Similarly to the flood map data, we need to do a two-stage clip again (like we did before in this tutorial to ensure we get only our area of interest without exceeding our RAM." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "id": "8299869a-2724-44c6-b5af-d134f7b9aece", - "metadata": {}, + "metadata": { + "id": "8299869a-2724-44c6-b5af-d134f7b9aece" + }, "outputs": [], "source": [ - "CLC_region = CLC.rio.clip_box(\n", - "CLC_region = CLC_region.rio.clip(" + "CLC_region = CLC # complete function\n", + "CLC_region = CLC_region # complete function" ] }, { "cell_type": "code", "execution_count": null, "id": "8706a9da-4336-4f06-a8a7-4c825639dae4", - "metadata": {}, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 291 + }, + "id": "8706a9da-4336-4f06-a8a7-4c825639dae4", + "outputId": "5389b953-fdf1-449e-932a-726e160b11b2" + }, "outputs": [], "source": [ "CLC_region = CLC_region.rename({'x': 'lat','y': 'lon'})\n", @@ -618,18 +758,22 @@ { "cell_type": "markdown", "id": "a31c0989-e96e-4809-a24d-13ab00de751f", - "metadata": {}, + "metadata": { + "id": "a31c0989-e96e-4809-a24d-13ab00de751f" + }, "source": [ - "Our next step is to prepare the visualisation of a map. What better way to explore land-cover information than plotting it on a map? \n", + "Our next step is to prepare the visualisation of a map. What better way to explore land-cover information than plotting it on a map?\n", "\n", - "As you will see below, we can create a dictionary with color codes that will color each land-cover class based on the color code provided in this dictionary. We use the colorscheme of Corine Land Cover. " + "As you will see below, we can create a dictionary with color codes that will color each land-cover class based on the color code provided in this dictionary. We use the colorscheme of Corine Land Cover. Please find the overview of classes and colors [here](https://collections.sentinel-hub.com/corine-land-cover/readme.html)." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "id": "198958ec-68a5-44d2-9b8c-91a2dd19484f", - "metadata": {}, + "metadata": { + "id": "198958ec-68a5-44d2-9b8c-91a2dd19484f" + }, "outputs": [], "source": [ "CLC_values = [111, 112, 121, 122, 123, 124, 131, 132, 133, 141, 142, 211, 212, 213, 221, 222, 223, 231, 241, 242,\n", @@ -644,16 +788,20 @@ { "cell_type": "markdown", "id": "6d2c9c52", - "metadata": {}, + "metadata": { + "id": "6d2c9c52" + }, "source": [ "The code below allows us the use the color_dict above to plot the CLC map" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "id": "59b50772-57d5-4e49-a600-00bfeaf9ffe8", - "metadata": {}, + "metadata": { + "id": "59b50772-57d5-4e49-a600-00bfeaf9ffe8" + }, "outputs": [], "source": [ "color_dict_raster = dict(zip(CLC_values,CLC_colors))\n", @@ -661,7 +809,7 @@ "# We create a colormar from our list of colors\n", "cm = ListedColormap(CLC_colors)\n", "\n", - "# Let's also define the description of each category : 1 (blue) is Sea; 2 (red) is burnt, etc... Order should be respected here ! Or using another dict maybe could help.\n", + "# Let's also define the description of each category in the raster\n", "labels = np.array(CLC_values)\n", "len_lab = len(labels)\n", "\n", @@ -678,7 +826,9 @@ { "cell_type": "markdown", "id": "68baa525-98be-4069-8129-dc6c22db4793", - "metadata": {}, + "metadata": { + "id": "68baa525-98be-4069-8129-dc6c22db4793" + }, "source": [ "And let's plot the Corine Land Cover data for our area of interest" ] @@ -687,7 +837,14 @@ "cell_type": "code", "execution_count": null, "id": "2a977453-9180-4de6-872e-1fe7818f2915", - "metadata": {}, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 906 + }, + "id": "2a977453-9180-4de6-872e-1fe7818f2915", + "outputId": "b8d0a689-46b1-4a31-d9b6-592b54f216af" + }, "outputs": [], "source": [ "fig, ax = plt.subplots(1, 1,figsize=(14,10))\n", @@ -695,59 +852,39 @@ "CLC_region[\"band_data\"].plot(ax=ax,levels=len(CLC_colors),colors=CLC_colors)" ] }, - { - "cell_type": "markdown", - "id": "465c4b28-3d01-4960-bb7c-8709a0c023bc", - "metadata": {}, - "source": [ - "
\n", - "Question 4: Describe the different land-use classes within your region that you see on the Corine Land Cover map. Do you see any dominant land-use classes? \n", - "
" - ] - }, { "cell_type": "markdown", "id": "8867d41e-2b7b-40c2-8576-611f2c04f547", - "metadata": {}, + "metadata": { + "id": "8867d41e-2b7b-40c2-8576-611f2c04f547" + }, "source": [ - "### Extract and visualize land-use information from OpenStreetMap\n", + "#### Extract and visualize land-use information from OpenStreetMap\n", "---" ] }, - { - "cell_type": "markdown", - "id": "3e0dd8ab-15e8-494d-a6fb-3861636e5ed4", - "metadata": {}, - "source": [ - "The next step is to define which area you want to focus on. In the cell below, you will now read \"Kampen, The Netherlands\". Change this to any area or municipality in the Netherlands that (1) you can think of and (2) will work. \n", - "\n", - "In some cases, the function does not recognize the location. You could either try a different phrasing or try a different location. Many parts of the Netherlands should work." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "12189f0d-5f9f-4ada-922a-6fc12f9bbf2f", - "metadata": {}, - "outputs": [], - "source": [ - "place_name = \"Kampen, The Netherlands\"\n", - "area = ox.geocode_to_gdf(place_name)" - ] - }, { "cell_type": "markdown", "id": "2077d677-c8c2-4fd5-b0d0-21fad4f3eec5", - "metadata": {}, + "metadata": { + "id": "2077d677-c8c2-4fd5-b0d0-21fad4f3eec5" + }, "source": [ - "Now let us visualize the bounding box of the area. As you will notice, we also estimate the size of the area. If the area size is above 50km2, or when you have many elements within your area (for example the amsterdam city centre), extracting the data from OpenStreetMap may take a little while. " + "Now let us visualize the bounding box of the area. As you will notice, we also estimate the size of the area. If the area size is above 50km2, or when you have many elements within your area (for example the amsterdam city centre), extracting the data from OpenStreetMap may take a little while." ] }, { "cell_type": "code", "execution_count": null, "id": "50447dc3-9d91-4a64-adea-90cbb0e0a6be", - "metadata": {}, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 724 + }, + "id": "50447dc3-9d91-4a64-adea-90cbb0e0a6be", + "outputId": "0c90ac99-794f-435c-ad35-f96d02261392" + }, "outputs": [], "source": [ "area_to_check = area.to_crs(epsg=3857)\n", @@ -757,55 +894,53 @@ "ax.set_axis_off()\n", "cx.add_basemap(ax, zoom=11)\n", "\n", - "size = int(area_to_check.area/1e6)\n", + "size = int(area_to_check.area.values/1e6)\n", "\n", "ax.set_title(\"{}. Total area: {} km2\".format(place_name,size),fontweight='bold')" ] }, - { - "cell_type": "markdown", - "id": "0154abf9-c923-4253-9e97-e8c91fe9d632", - "metadata": {}, - "source": [ - "
\n", - "Question 5: To make sure we understand which area you focus on, please submit the figure that outlines your area.\n", - "
" - ] - }, { "cell_type": "markdown", "id": "865b5084-08f0-471d-8982-06b340e5d3f5", - "metadata": {}, + "metadata": { + "id": "865b5084-08f0-471d-8982-06b340e5d3f5" + }, "source": [ "Now we are satisfied with the selected area, we are going to extract the land-use information from OpenStreetMap. To find the right information from OpenStreetMap, we use **tags**.\n", "\n", - "As you will see in the cell below, we use the tags *\"landuse\"* and *\"natural\"*. We need to use the *\"natural\"* tag to ensure we also obtain water bodies and other natural elements. " + "As you will see in the cell below, we use the tags *\"landuse\"* and *\"natural\"*. We need to use the *\"natural\"* tag to ensure we also obtain water bodies and other natural elements." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "id": "5f52137d-bf2c-4405-9df1-42ac73a5d83c", - "metadata": {}, + "metadata": { + "id": "5f52137d-bf2c-4405-9df1-42ac73a5d83c" + }, "outputs": [], "source": [ - "tags = {'landuse': True, 'natural': True} \n", + "tags = {'landuse': True, 'natural': True}\n", "landuse = ox.features_from_place(place_name, tags)" ] }, { "cell_type": "markdown", "id": "9f44095d-c47c-49d4-ac8d-6a91eae8f1ae", - "metadata": {}, + "metadata": { + "id": "9f44095d-c47c-49d4-ac8d-6a91eae8f1ae" + }, "source": [ "In case the above does not work, you can continue the assignment by using the code below (make sure you remove the hashtags to run it). If you decide to use the data as specified below, also change the map at the start to 'Kampen'." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "id": "13cd17e2-d990-447a-b3d4-75dbe2b93ed1", - "metadata": {}, + "metadata": { + "id": "13cd17e2-d990-447a-b3d4-75dbe2b93ed1" + }, "outputs": [], "source": [ "# remote_url = 'https://github.com/ElcoK/BigData_AED/raw/main/week5/kampen_landuse.gpkg'\n", @@ -818,7 +953,9 @@ { "cell_type": "markdown", "id": "2ff9e972-55b9-45a9-b727-45066032e900", - "metadata": {}, + "metadata": { + "id": "2ff9e972-55b9-45a9-b727-45066032e900" + }, "source": [ "To ensure we really only get the area that we want, we use geopandas's `clip` function to only keep the area we want. This function does exactly the same as the `clip` function in QGIS." ] @@ -826,19 +963,39 @@ { "cell_type": "markdown", "id": "f7be7294-2cc6-4997-9c62-a5aea3fd1c29", - "metadata": {}, + "metadata": { + "id": "f7be7294-2cc6-4997-9c62-a5aea3fd1c29" + }, "source": [ - "When we want to visualize or analyse the data, we want all information in a single column. However, at the moment, all information that was tagged as *\"natural\"*, has no information stored in the *\"landuse\"* tags. It is, however, very convenient if we can just use a single column for further exploration of the data. \n", + "When we want to visualize or analyse the data, we want all information in a single column. However, at the moment, all information that was tagged as *\"natural\"*, has no information stored in the *\"landuse\"* tags. It is, however, very convenient if we can just use a single column for further exploration of the data.\n", "\n", - "To overcome this issue, we need to add the missing information to the landuse column, as done below. Let's first have a look which categories we have in the **natural** column. " + "To overcome this issue, we need to add the missing information to the landuse column, as done below. Let's first have a look which categories we have in the **natural** column." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "id": "0ed6e32f-06a7-4189-8e77-efd1a9cf77f7", - "metadata": {}, - "outputs": [], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "0ed6e32f-06a7-4189-8e77-efd1a9cf77f7", + "outputId": "4aa85ca8-bb28-4943-e6aa-73cc2ba9ca46" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['tree', nan, 'water', 'scrub', 'grassland', 'wetland', 'beach',\n", + " 'tree_row', 'sand'], dtype=object)" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "landuse.natural.unique()" ] @@ -846,16 +1003,20 @@ { "cell_type": "markdown", "id": "b3a6a6af-c3db-450b-944c-95c7cef1fd32", - "metadata": {}, + "metadata": { + "id": "b3a6a6af-c3db-450b-944c-95c7cef1fd32" + }, "source": [ "And now we can add them to the **landuse** column. We made a start, but its up to you to fill in the rest." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "id": "53b14f7a-f62d-4575-ad02-39f279fde5e1", - "metadata": {}, + "metadata": { + "id": "53b14f7a-f62d-4575-ad02-39f279fde5e1" + }, "outputs": [], "source": [ "landuse.loc[landuse.natural=='water','landuse'] = 'water'\n", @@ -868,61 +1029,82 @@ { "cell_type": "markdown", "id": "851df40d-02d1-4409-9a89-9d1edcfa6bcd", - "metadata": {}, + "metadata": { + "id": "851df40d-02d1-4409-9a89-9d1edcfa6bcd" + }, "source": [ "
\n", - "Question 6: Please provide in the answer box in Canvas the code that you used to make sure that all land uses are now registered within the landuse column.\n", + "Question 4: Please provide in the answer box in Canvas the code that you used to make sure that all land uses are now registered within the landuse column.\n", "
" ] }, { "cell_type": "markdown", "id": "6ead9126-edc3-41f1-80de-339e1e42dbda", - "metadata": {}, + "metadata": { + "id": "6ead9126-edc3-41f1-80de-339e1e42dbda" + }, "source": [ - "We now create a *color_dict* like we have also done for the visualization of the land-use information to ensure we can visualize the data properly. This time, we use our own colorscheme. " + "We now create a *color_dict* like we have also done for the visualization of the land-use information to ensure we can visualize the data properly. This time, we use our own colorscheme." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "id": "64197848-0d42-480e-9d7f-4a68bff63772", - "metadata": {}, + "metadata": { + "id": "64197848-0d42-480e-9d7f-4a68bff63772" + }, "outputs": [], "source": [ "color_dict = { \"grass\":'#c3eead', \"railway\": \"#000000\",\n", " \"forest\":'#1c7426', \"orchard\":'#fe6729',\n", " \"residential\":'#f13013', \"industrial\":'#0f045c',\n", - " \"retail\":'#b71456', \"education\":'#d61181', \n", + " \"retail\":'#b71456', \"education\":'#d61181',\n", " \"commercial\":'#981cb8', \"farmland\":'#fcfcb9',\n", - " \"cemetery\":'#c39797', \"construction\":'#c0c0c0',\n", " \"meadow\":'#c3eead', \"farmyard\":'#fcfcb9',\n", - " \"plant_nursery\":'#eaffe2', \"scrub\":'#98574d',\n", - " \"allotments\":'#fbffe2', \"reservoir\":'#8af4f2',\n", - " \"static_caravan\":'#ff3a55', \"wetlands\": \"#c9f5e5\",\n", - " \"water\": \"#c9e5f5\", \"beach\": \"#ffeead\",\n", " \"landfill\" : \"#B08C4D\", \"recreation_ground\" : \"#c3eead\",\n", - " \"brownfield\" : \"#B08C4D\", \"village_green\" : \"#f13013\" ,\n", - " \"military\": \"#52514E\", \"garden\" : '#c3eead'\n", - " } " + " }" ] }, { "cell_type": "markdown", "id": "408cdac8-2ca1-4eef-8997-8c83b852f5c5", - "metadata": {}, + "metadata": { + "id": "408cdac8-2ca1-4eef-8997-8c83b852f5c5" + }, "source": [ - "Unfortunately, OpenSteetMap very often contains elements that have a unique tag. As such, it may be the case that some of our land-use categories are not in the dictionary yet. \n", + "Unfortunately, OpenSteetMap very often contains elements that have a unique tag. As such, it may be the case that some of our land-use categories are not in the dictionary yet.\n", "\n", "Let's first create an overview of the unique land-use categories within our data through using the `.unique()` function within our dataframe:" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "id": "92c41069-fb2c-4606-adcc-e73ab95778ba", - "metadata": {}, - "outputs": [], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "92c41069-fb2c-4606-adcc-e73ab95778ba", + "outputId": "19113de0-4c78-44bb-e467-db87717ac727" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['residential', 'water', 'grass', 'forest', 'wetlands', 'meadow',\n", + " 'industrial', 'retail', 'cemetery', 'farmland', 'orchard',\n", + " 'construction', 'scrub', 'commercial', 'education', 'farmyard',\n", + " 'static_caravan', 'railway', 'allotments'], dtype=object)" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "landuse.landuse.unique()" ] @@ -930,17 +1112,36 @@ { "cell_type": "markdown", "id": "f354fe05-b608-435f-acf4-6310886071dd", - "metadata": {}, + "metadata": { + "id": "f354fe05-b608-435f-acf4-6310886071dd" + }, "source": [ "Ofcourse we can visually compare the array above with our color_dict, but it is much quicker to use `Sets` to check if there is anything missing:" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "id": "cba31d28-3398-4d33-a325-eab786869020", - "metadata": {}, - "outputs": [], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cba31d28-3398-4d33-a325-eab786869020", + "outputId": "522fd89c-b76f-45d9-f635-2ad2ff30f31b" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "set()" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "set(landuse.landuse.unique())-set(color_dict)" ] @@ -948,12 +1149,14 @@ { "cell_type": "markdown", "id": "5d2de6c7-180e-43b3-ab32-ee7df7ff6ea2", - "metadata": {}, + "metadata": { + "id": "5d2de6c7-180e-43b3-ab32-ee7df7ff6ea2" + }, "source": [ - "In case anything is missing, add them to the color_dict dictionairy and re-run that cell. \n", + "In case anything is missing, add them to the color_dict dictionairy and re-run that cell.\n", "\n", "
\n", - "Question 7: Show us in Canvas (i) which land-use categories you had to add, and (ii) how your final color dictionary looks like.\n", + "Question 5: Show us in Canvas (i) which land-use categories you had to add, and (ii) how your final color dictionary looks like.\n", "
\n", "\n", "```{tip}\n", @@ -966,9 +1169,11 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "id": "45093fa0-b95b-49e1-bb32-d149ba424931", - "metadata": {}, + "metadata": { + "id": "45093fa0-b95b-49e1-bb32-d149ba424931" + }, "outputs": [], "source": [ "color_dict = {key: color_dict[key]\n", @@ -982,7 +1187,9 @@ { "cell_type": "markdown", "id": "010bec6f-fd76-40d2-a38c-be266e57d056", - "metadata": {}, + "metadata": { + "id": "010bec6f-fd76-40d2-a38c-be266e57d056" + }, "source": [ "Now we can plot the figure!\n", "\n", @@ -993,7 +1200,14 @@ "cell_type": "code", "execution_count": null, "id": "b8f01254-e1d7-4e3f-b40c-b2358223670c", - "metadata": {}, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 847 + }, + "id": "b8f01254-e1d7-4e3f-b40c-b2358223670c", + "outputId": "c16e27d2-7da3-4716-b5ab-19a4f4926cea" + }, "outputs": [], "source": [ "fig, ax = plt.subplots(1, 1,figsize=(12,10))\n", @@ -1001,7 +1215,7 @@ "# add color scheme\n", "color_scheme_map = list(color_dict.values())\n", "cmap = LinearSegmentedColormap.from_list(name='landuse',\n", - " colors=color_scheme_map) \n", + " colors=color_scheme_map)\n", "\n", "# and plot the land-use map.\n", "landuse.plot(color=landuse['col_landuse'],ax=ax,linewidth=0)\n", @@ -1014,9 +1228,9 @@ "# add a legend:\n", "legend_elements = []\n", "for iter_,item in enumerate(color_dict):\n", - " legend_elements.append(Patch(facecolor=color_scheme_map[iter_],label=item)) \n", + " legend_elements.append(Patch(facecolor=color_scheme_map[iter_],label=item))\n", "\n", - "ax.legend(handles=legend_elements,edgecolor='black',facecolor='#fefdfd',prop={'size':12},loc=(1.02,0.2)) \n", + "ax.legend(handles=legend_elements,edgecolor='black',facecolor='#fefdfd',prop={'size':12},loc=(1.02,0.2))\n", "\n", "# add a title\n", "ax.set_title(place_name,fontweight='bold')" @@ -1025,28 +1239,34 @@ { "cell_type": "markdown", "id": "af1ca96a-2ec2-4889-b30b-1f9d23cc0d18", - "metadata": {}, + "metadata": { + "id": "af1ca96a-2ec2-4889-b30b-1f9d23cc0d18" + }, "source": [ "
\n", - "Question 8: Please upload a figure of your land-use map, using OpenStreetMap. \n", + "Question 6: Please upload a figure of your land-use map, using OpenStreetMap. Feel free to change the visual appearance of the map to your liking\n", "
" ] }, { "cell_type": "markdown", "id": "99777639-4201-42aa-ab97-1705bed60392", - "metadata": {}, + "metadata": { + "id": "99777639-4201-42aa-ab97-1705bed60392" + }, "source": [ - "### Rasterize land-use information\n", + "#### Rasterize land-use information\n", "---" ] }, { "cell_type": "markdown", "id": "3f8bda0f-aea9-471c-af15-31d9bf2bd191", - "metadata": {}, + "metadata": { + "id": "3f8bda0f-aea9-471c-af15-31d9bf2bd191" + }, "source": [ - "As you have noticed already during the lecture, and as we have seen during TAA1 with the Google Earth Engine, most land-use data is in raster format. \n", + "As you have noticed already during the lecture, and as we have seen during TAA1 with the Google Earth Engine, most land-use data is in raster format.\n", "\n", "In OpenStreetMap everything is stored in vector format. As such, the land-use information we extracted from OpenStreetMap is also in vector format. While it is not always necessary to have this information in raster format, it is useful to know how to convert your data into a raster format.\n", "\n", @@ -1056,16 +1276,20 @@ { "cell_type": "markdown", "id": "6d84eb30-2657-4cd3-8300-be6e22673d11", - "metadata": {}, + "metadata": { + "id": "6d84eb30-2657-4cd3-8300-be6e22673d11" + }, "source": [ "The first thing we will need to do is to define all the unique land-use classes and store them in a dictionary:" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "id": "48d1662b-23a0-443d-8465-0acad5e374c0", - "metadata": {}, + "metadata": { + "id": "48d1662b-23a0-443d-8465-0acad5e374c0" + }, "outputs": [], "source": [ "categorical_enums = {'landuse': landuse.landuse.drop_duplicates().values.tolist()\n", @@ -1075,15 +1299,17 @@ { "cell_type": "markdown", "id": "17845c5f-ec24-498c-a185-1cbf5d4054dd", - "metadata": {}, + "metadata": { + "id": "17845c5f-ec24-498c-a185-1cbf5d4054dd" + }, "source": [ - "And now we simply use the `make_geocube()` function to convert our vector data into raster data. \n", + "And now we simply use the `make_geocube()` function to convert our vector data into raster data.\n", "\n", "In the `make_geocube()` function, we have to specify several arguments:\n", "\n", "- Through the `vector_data` argument we have to state which dataframe we want to rasterize.\n", "- Through the `output_crs` argument we have to state the coordinate reference system (CRS). We use the OpenStreetMap default EPSG:4326.\n", - "- Through the `resolution` argument we have to state the resolution. In our case, we will have to set this in degrees. 0.01 degrees is equivalent to roughly 10km around the equator. \n", + "- Through the `resolution` argument we have to state the resolution. In our case, we will have to set this in degrees. 0.01 degrees is equivalent to roughly 10km around the equator.\n", "- Through the `categorical_enums` argument we specify the different land-use categories.\n", "\n", "Play around with the different resolutions to find the level of detail. The higher the resolution (i.e., the more zeros behind the comma), the longer it will take to rasterize." @@ -1091,23 +1317,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "id": "3ca109c1-5169-4833-818d-bae97f0b33b3", - "metadata": {}, + "metadata": { + "id": "3ca109c1-5169-4833-818d-bae97f0b33b3" + }, "outputs": [], "source": [ "landuse_grid = make_geocube(\n", - " vector_data=,\n", - " output_crs=,\n", - " resolution=(-XXXX, XXXX),\n", - " categorical_enums=categorical_enums\n", + " vector_data= ,## add landuse\n", + " output_crs= ,## add CRS\n", + " resolution= ,## add resolution\n", + " categorical_enums= ## add categorical_enums\n", ")" ] }, { "cell_type": "markdown", "id": "ba3ea735-0255-4b44-ab66-210bf3655213", - "metadata": {}, + "metadata": { + "id": "ba3ea735-0255-4b44-ab66-210bf3655213" + }, "source": [ "Let's explore what this function has given us:" ] @@ -1116,7 +1346,14 @@ "cell_type": "code", "execution_count": null, "id": "2ca50588-074b-4217-a384-f582a57f6b35", - "metadata": {}, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 389 + }, + "id": "2ca50588-074b-4217-a384-f582a57f6b35", + "outputId": "a8f53190-d7a2-4139-8a54-6a3511d51c2f" + }, "outputs": [], "source": [ "landuse_grid[\"landuse\"]" @@ -1125,11 +1362,13 @@ { "cell_type": "markdown", "id": "35204590-9e19-45a0-8065-4e453d024d69", - "metadata": {}, + "metadata": { + "id": "35204590-9e19-45a0-8065-4e453d024d69" + }, "source": [ - "The output above is a typical output of the **xarray** package. \n", + "The output above is a typical output of the **xarray** package.\n", "\n", - "- The `array` shows the numpy array with the actual values. As you can see, the rasterization process has used the value `-1` for NoData. \n", + "- The `array` shows the numpy array with the actual values. As you can see, the rasterization process has used the value `-1` for NoData.\n", "- The `Coordinates` table shows the x (longitude) and y (latitude) coordinates of the array. It has the exact same size as the `array` with land-use values.\n", "- The `Attributes` table specifies the NoData value (the `_FillValue` element, which indeed shows `-1`) and the name of the dataset.\n", "\n", @@ -1140,7 +1379,14 @@ "cell_type": "code", "execution_count": null, "id": "407f75e9-4747-43e1-93a0-d1b63d90378d", - "metadata": {}, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 825 + }, + "id": "407f75e9-4747-43e1-93a0-d1b63d90378d", + "outputId": "90a878fd-5c26-49e1-c562-2430ef8d4c21" + }, "outputs": [], "source": [ "fig, ax = plt.subplots(1, 1,figsize=(14,10))\n", @@ -1160,9 +1406,11 @@ { "cell_type": "markdown", "id": "945b1ce7-f6e6-410d-be82-e24e9d224bd3", - "metadata": {}, + "metadata": { + "id": "945b1ce7-f6e6-410d-be82-e24e9d224bd3" + }, "source": [ - "As we can see in the figure above, the land-use categories have turned into numbers, instead of land-use categories described by a string value. \n", + "As we can see in the figure above, the land-use categories have turned into numbers, instead of land-use categories described by a string value.\n", "\n", "This is of course a lot harder to interpret. Let's re-do some parts to make sure we can properly link them back to the original data.\n", "\n", @@ -1173,9 +1421,11 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "id": "1882f6c1-9008-4815-b19f-7ec2771aaa55", - "metadata": {}, + "metadata": { + "id": "1882f6c1-9008-4815-b19f-7ec2771aaa55" + }, "outputs": [], "source": [ "value_dict = dict(zip(landuse.landuse.unique(),np.arange(0,len(landuse.landuse.unique()),1)))" @@ -1183,9 +1433,11 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "id": "27b572e0-d97b-47cb-8fa7-1a2c11afc8fa", - "metadata": {}, + "metadata": { + "id": "27b572e0-d97b-47cb-8fa7-1a2c11afc8fa" + }, "outputs": [], "source": [ "value_dict['nodata'] = -1" @@ -1194,22 +1446,48 @@ { "cell_type": "markdown", "id": "3cc4797d-9d48-4c83-a564-936d579dc256", - "metadata": {}, + "metadata": { + "id": "3cc4797d-9d48-4c83-a564-936d579dc256" + }, "source": [ "And we now use this dictionary to add a new column to the dataframe with the values:" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, + "id": "f14df583-5a87-4ea5-9712-915c2156c02e", + "metadata": { + "id": "f14df583-5a87-4ea5-9712-915c2156c02e" + }, + "outputs": [], + "source": [ + "landuse['landuse_value'] = landuse.landuse.apply(lambda x: value_dict[x])" + ] + }, + { + "cell_type": "markdown", + "id": "ff53e03e-058c-4397-a6ec-77ffc6f057ac", + "metadata": { + "id": "ff53e03e-058c-4397-a6ec-77ffc6f057ac" + }, + "source": [ + "Now let us use the make_geocube() function again to rasterize." + ] + }, + { + "cell_type": "code", + "execution_count": 41, "id": "c05b7dd2-84df-428c-9c70-7d07aa745346", - "metadata": {}, + "metadata": { + "id": "c05b7dd2-84df-428c-9c70-7d07aa745346" + }, "outputs": [], "source": [ "landuse_valued = make_geocube(\n", - " vector_data=XXXX,\n", - " output_crs=XXXX,\n", - " resolution=(-XXXX, XXXX),\n", + " vector_data= ## add landuse,\n", + " output_crs= ## add CRS,\n", + " resolution= ## add resolution,\n", " categorical_enums={'landuse_value': landuse.landuse_value.drop_duplicates().values.tolist()\n", "}\n", ")" @@ -1218,35 +1496,48 @@ { "cell_type": "markdown", "id": "510409be-3b7f-4f75-848b-4146bee15338", - "metadata": {}, + "metadata": { + "id": "510409be-3b7f-4f75-848b-4146bee15338" + }, "source": [ "And let's use the original `color_dict` dictionary to find the right hex codes for each of the land-use categories" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 42, "id": "458b393b-47e8-44a3-bebc-148b4d764401", - "metadata": {}, + "metadata": { + "id": "458b393b-47e8-44a3-bebc-148b4d764401" + }, "outputs": [], "source": [ "unique_classes = landuse.landuse.drop_duplicates().values.tolist()\n", - "colormap_raster = [color_dict[lu_class] for lu_class in unique_classes] " + "colormap_raster = [color_dict[lu_class] for lu_class in unique_classes]" ] }, { "cell_type": "markdown", "id": "8197f4b9-9c0f-4999-89f3-1ea657888193", - "metadata": {}, + "metadata": { + "id": "8197f4b9-9c0f-4999-89f3-1ea657888193" + }, "source": [ "To plot the new result:" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 43, "id": "a5eb9d2c-2435-485f-8daa-6c54e29e8fd0", - "metadata": {}, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 830 + }, + "id": "a5eb9d2c-2435-485f-8daa-6c54e29e8fd0", + "outputId": "2558af6a-329d-4ac5-dcc4-0793dbab498b" + }, "outputs": [], "source": [ "fig, ax = plt.subplots(1, 1,figsize=(14,10))\n", @@ -1264,23 +1555,24 @@ }, { "cell_type": "markdown", - "id": "9e42dd3a-c0c3-496f-bbc4-dbdf1f3901d1", + "id": "b999fe12", "metadata": {}, "source": [ - "
\n", - "Question 9: In the rasterization process, we use the `.make_geocube()` function. Please elaborate on the following: i)why is it important to specify the right coordinate system? What could happen if you choose the wrong coordinate system? ii) which resolution did you choose and why? iii)Why did the first result did not give us the right output with the correct colors? How did you solve this? \n", - "
" + "But this is not entirely how we want it yet. We want to make sure we assign the correct colors to the correct categories." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 44, "id": "d8789a06-d041-4d6f-aab7-48032ac8c8d1", - "metadata": {}, + "metadata": { + "id": "d8789a06-d041-4d6f-aab7-48032ac8c8d1" + }, "outputs": [], "source": [ + "# we first identify all the unique classes in the landuse dataset and assign them a unique color\n", "unique_classes = landuse.landuse.drop_duplicates().values.tolist()\n", - "colormap_raster = [color_dict[lu_class] for lu_class in unique_classes] \n", + "colormap_raster = [color_dict[lu_class] for lu_class in unique_classes]\n", "color_dict_raster = dict(zip(np.arange(-1,len(landuse.landuse.unique())+1,1),['#ffffff']+colormap_raster))\n", "\n", "# We create a colormar from our list of colors\n", @@ -1303,7 +1595,9 @@ { "cell_type": "markdown", "id": "f36beb42-1da5-4da0-bb02-b61604b0852f", - "metadata": {}, + "metadata": { + "id": "f36beb42-1da5-4da0-bb02-b61604b0852f" + }, "source": [ "Let's plot the map again!" ] @@ -1312,7 +1606,14 @@ "cell_type": "code", "execution_count": null, "id": "def51260-e57c-4957-8263-2b43a83a134f", - "metadata": {}, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 807 + }, + "id": "def51260-e57c-4957-8263-2b43a83a134f", + "outputId": "59db0647-2d46-435e-88ab-46f85775e791" + }, "outputs": [], "source": [ "fig, ax = plt.subplots(1, 1,figsize=(14,10))\n", @@ -1335,12 +1636,26 @@ "fig.delaxes(fig.axes[1])" ] }, + { + "cell_type": "markdown", + "id": "9e42dd3a-c0c3-496f-bbc4-dbdf1f3901d1", + "metadata": { + "id": "9e42dd3a-c0c3-496f-bbc4-dbdf1f3901d1" + }, + "source": [ + "
\n", + "Question 7: In the rasterization process, we use the `.make_geocube()` function. Please elaborate on the following: i)why is it important to specify the right coordinate system? What could happen if you choose the wrong coordinate system? ii) which resolution did you choose and why? iii)Why did the first result did not give us the right output with the correct colors? How did we solve this? Are you able to explain the code in your own words?\n", + "
" + ] + }, { "cell_type": "markdown", "id": "318a2267-4057-485c-85f1-1929896ad9ee", - "metadata": {}, + "metadata": { + "id": "318a2267-4057-485c-85f1-1929896ad9ee" + }, "source": [ - "## 5. Perform a raster-based damage assessment using OSM and Corine Land Cover\n", + "### 5. Perform a raster-based damage assessment Corine Land Cover\n", "
" ] }, @@ -1348,12 +1663,12 @@ "cell_type": "markdown", "id": "5dfabe80-3c8f-4e3a-a411-a29349c2d75b", "metadata": { - "id": "Agxq2HqY-g4H" + "id": "5dfabe80-3c8f-4e3a-a411-a29349c2d75b" }, "source": [ "To calculate the potential damage to both windstorms and floods, we use stage-damage curves, which relate the intensity of the hazard to the fraction of maximum damage that can be sustained by a certain land use. As you can see on the Corine Land Cover map that we just plotted, there are a lot of land use classes (44), though not all will suffer damage from either the windstorm or the flood event. For each of the land-use classes a curve and a maximum damage number are assigned.\n", "\n", - "To Assess the damage for both the flood and windstorm event, we are going to make use of the [DamageScanner](https://damagescanner.readthedocs.io/en/latest/), which is a tool to calculate potential flood damages based on inundation depth and land use using depth-damage curves in the Netherlands. The DamageScanner was originally developed for the 'Netherlands Later' project [(Klijn et al., 2007)](https://www.rivm.nl/bibliotheek/digitaaldepot/WL_rapport_Overstromingsrisicos_Nederland.pdf). The original land-use classes were based on the Land-Use Scanner in order to evaluate the effect of future land-use change on flood damages. We have tailored the input of the DamageScanner to make sure it can estimate the damages using Corine Land Cover.\n", + "To assess the damage for both the flood and windstorm event, we are going to make use of the [DamageScanner](https://damagescanner.readthedocs.io/en/latest/), which is a tool to calculate potential flood damages based on inundation depth and land use using depth-damage curves in the Netherlands. The DamageScanner was originally developed for the 'Netherlands Later' project [(Klijn et al., 2007)](https://www.rivm.nl/bibliotheek/digitaaldepot/WL_rapport_Overstromingsrisicos_Nederland.pdf). The original land-use classes were based on the Land-Use Scanner in order to evaluate the effect of future land-use change on flood damages. We have tailored the input of the DamageScanner to make sure it can estimate the damages using Corine Land Cover.\n", "\n", "Because the simplicity of the model, we can use this for any raster-based hazard map with some level of intensity. Hence, we can use it for both hazards." ] @@ -1362,45 +1677,45 @@ "cell_type": "markdown", "id": "ed5b5f52-bbad-42a6-acd5-1ea0248591f8", "metadata": { - "id": "5m_RAcp_fraF" + "id": "ed5b5f52-bbad-42a6-acd5-1ea0248591f8" }, "source": [ "
\n", - "Question 10: Describe in your own words what the `DamageScanner()` function does. Please walk us through the different steps. Which inputs do you need to be able to run this damage assessment?\n", + "Question 8: Describe in your own words what the `DamageScanner()` function does. Please walk us through the different steps. Which inputs do you need to be able to run this damage assessment?\n", "
" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 85, "id": "94d33d66-6bf6-43b2-8c24-3e1a1069af2b", "metadata": { - "id": "jDrTp44Q-g4H" + "id": "94d33d66-6bf6-43b2-8c24-3e1a1069af2b" }, "outputs": [], "source": [ "def DamageScanner(landuse_map,inun_map,curve_path,maxdam_path,cellsize=100):\n", - " \n", + "\n", " # load land-use map\n", " landuse = landuse_map.copy()\n", - " \n", + "\n", " # Load inundation map\n", " inundation = inun_map.copy()\n", - " \n", - " inundation = np.nan_to_num(inundation) \n", + "\n", + " inundation = np.nan_to_num(inundation)\n", "\n", " # Load curves\n", " if isinstance(curve_path, pd.DataFrame):\n", - " curves = curve_path.values \n", + " curves = curve_path.values\n", " elif isinstance(curve_path, np.ndarray):\n", " curves = curve_path\n", "\n", " #Load maximum damages\n", " if isinstance(maxdam_path, pd.DataFrame):\n", - " maxdam = maxdam_path.values \n", + " maxdam = maxdam_path.values\n", " elif isinstance(maxdam_path, np.ndarray):\n", " maxdam = maxdam_path\n", - " \n", + "\n", " # Speed up calculation by only considering feasible points\n", " inun = inundation * (inundation>=0) + 0\n", " inun[inun>=curves[:,0].max()] = curves[:,0].max()\n", @@ -1426,8 +1741,8 @@ " alldamage[landuse==n] = damage\n", "\n", " # create pandas dataframe with output\n", - " loss_df = pd.DataFrame(damagebin.astype(float),columns=['landuse','losses','area','avg_depth']).groupby('landuse').sum()\n", - " \n", + " loss_df = pd.DataFrame(damagebin.astype(float),columns=['landuse','losses','area','avg_intensity']).groupby('landuse').sum()\n", + "\n", " # return output\n", " return loss_df.sum().values[0],loss_df" ] @@ -1436,38 +1751,38 @@ "cell_type": "markdown", "id": "146c6b79-ce68-436b-a7fb-8a889528f513", "metadata": { - "id": "Y7PB8oJz-g4H" + "id": "146c6b79-ce68-436b-a7fb-8a889528f513" }, "source": [ - "### Windstorm Damage\n", + "#### Windstorm Damage\n", "---\n", "To estimate the potential damage of our windstorm, we use the vulnerability curves developed by [Yamin et al. (2014)](https://www.sciencedirect.com/science/article/pii/S2212420914000466). Following [Yamin et al. (2014)](https://www.sciencedirect.com/science/article/pii/S2212420914000466), we will apply a sigmoidal vulnerability function satisfying two constraints: (i) a minimum threshold for the occurrence of damage with an upper bound of 100% direct damage; (ii) a high power-law function for the slope, describing an increase in damage with increasing wind speeds. Due to the limited amount of vulnerability curves available for windstorm damage, we will use the damage curve that represents low-rise *reinforced masonry* buildings for all land-use classes that may contain buildings. Obviously, this is a large oversimplification of the real world, but this should be sufficient for this exercise. When doing a proper stand-alone windstorm risk assessment, one should take more effort in collecting the right vulnerability curves for different building types. " ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 47, "id": "e0e63daa-636b-4a1e-ba6c-5bb78e56f290", "metadata": { - "id": "-RxvAEQh-g4H", + "id": "e0e63daa-636b-4a1e-ba6c-5bb78e56f290", "tags": [] }, "outputs": [], "source": [ - "wind_curves = pd.read_excel(\"https://github.com/VU-IVM/UNIGIS_ProgrammingGIS/tree/main/TAA2/damage_curves.xlsx\",sheet_name='wind_curves')\n", - "maxdam = pd.read_excel(\"https://github.com/VU-IVM/UNIGIS_ProgrammingGIS/tree/main/TAA2/damage_curves.xlsx\",sheet_name='maxdam')" + "wind_curves = pd.read_excel(\"https://github.com/VU-IVM/UNIGIS_ProgrammingGIS/raw/main/TAA2/damage_curves.xlsx\",sheet_name='wind_curves')\n", + "maxdam = pd.read_excel(\"https://github.com/VU-IVM/UNIGIS_ProgrammingGIS/raw/main/TAA2/damage_curves.xlsx\",sheet_name='maxdam')" ] }, { "cell_type": "markdown", "id": "beb4f312-c4fb-4169-b563-e5878dfd95e2", "metadata": { - "id": "uLZ7vl1w-g4H" + "id": "beb4f312-c4fb-4169-b563-e5878dfd95e2" }, "source": [ "Unfortunately, we run into a *classic* problem when we want to overlay the windstorm data with the Corine Land Cover data. The windstorm data is not only stored in a different coordinate system (we had to convert it from **EPSG:4326** to **EPSG:3035**), it is in a different resolution (**1km** instead of the **100m** of Corine Land Cover). \n", "\n", - "Let's first have a look how our clipped data look's like. If you have decided to use Gelderland, you will see that we have 102 columns (our Lattitude/lat) and 74 rows (our Longitude/lon). If you scroll above to our Corine Land Cover data, you see that dimensions are different: 1270 columns (Lattitude/lat/x) and 870 rows (Longitude/lon/y). " + "Let's first have a look how our clipped data look's like. If you have decided to use Kampen, you will see that we have 12 columns (our Lattitude/lat) and 9 rows (our Longitude/lon). If you scroll above to our Corine Land Cover data, you see that dimensions are different: 147 columns (Lattitude/lat/x) and 111 rows (Longitude/lon/y)." ] }, { @@ -1479,8 +1794,8 @@ "base_uri": "https://localhost:8080/", "height": 291 }, - "id": "gG2OXOySj8Ra", - "outputId": "67135491-52de-4571-f8c9-7b6a74e19b66" + "id": "57bc4345-b1e5-45c7-8aa2-95ef39b1ea78", + "outputId": "47728b1f-574e-4f66-d050-57b5c568b5c6" }, "outputs": [], "source": [ @@ -1491,7 +1806,7 @@ "cell_type": "markdown", "id": "e1688219-1647-442e-8ed7-e4277ca75a16", "metadata": { - "id": "igfFBqcK-g4H" + "id": "e1688219-1647-442e-8ed7-e4277ca75a16" }, "source": [ "The first thing we are going to do is try to make sure our data will be in the correct resolution (moving from **1km** to **100m**). To do so, we will use the `rio.reproject()` function. You will see that specify the resolution as **100**. Because **EPSG:3035** is a coordinate system in meters, we can simply use meters to define the resolution. We use the `rio.clip()` function to make sure we clip it again to our area of interest. The function below (`match_rasters`) will do the hard work for us. Please note all the input variables to understand what's happening." @@ -1499,10 +1814,10 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 49, "id": "d960af61-b324-459e-9e4c-da2f70bf7ecf", "metadata": { - "id": "Kud2CWEDhz1O" + "id": "d960af61-b324-459e-9e4c-da2f70bf7ecf" }, "outputs": [], "source": [ @@ -1533,7 +1848,7 @@ " - The land use variable with matching resolution and dimensions to the hazard variable.\n", " - The hazard variable clipped to the extent of the land use variable, with matching resolution and dimensions.\n", " \"\"\"\n", - " \n", + "\n", " # Set the crs of the hazard variable to haz_crs\n", " hazard.rio.write_crs(haz_crs, inplace=True)\n", "\n", @@ -1585,7 +1900,7 @@ "cell_type": "markdown", "id": "9f9ccb0d-2644-45ea-b435-79d83cd12a8e", "metadata": { - "id": "Vkf6YKPZ-g4I" + "id": "9f9ccb0d-2644-45ea-b435-79d83cd12a8e" }, "source": [ "Now let's run the `match_rasters` function and let it do its magic." @@ -1593,10 +1908,10 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 50, "id": "d5c3409f-5c41-4ffa-b881-fa166eec2521", "metadata": { - "id": "v8NW3c1Q-g4I" + "id": "d5c3409f-5c41-4ffa-b881-fa166eec2521" }, "outputs": [], "source": [ @@ -1612,7 +1927,7 @@ "cell_type": "markdown", "id": "aa2fdc04-2327-47d2-b43a-521dc95b6882", "metadata": { - "id": "GgcwJe_6nJip" + "id": "aa2fdc04-2327-47d2-b43a-521dc95b6882" }, "source": [ "And let's have a look if the two rasters are now the same extend:\n" @@ -1627,8 +1942,8 @@ "base_uri": "https://localhost:8080/", "height": 291 }, - "id": "vzMbkiSLldlQ", - "outputId": "6e73f8b1-33ad-4a7c-b95c-d320b6c75439" + "id": "7ca69a83-350b-4d0e-adea-d6a00b9dfc38", + "outputId": "9f8a60c0-ca86-4979-bd06-95c97690b8fb" }, "outputs": [], "source": [ @@ -1644,8 +1959,8 @@ "base_uri": "https://localhost:8080/", "height": 291 }, - "id": "DXnxCBS_ldWg", - "outputId": "ec49b756-0fd9-4d49-f9ff-9f68a52bf83c" + "id": "0b0216bd-6497-4a0a-8903-31d46599a854", + "outputId": "63f88a2f-4b3a-410e-94d8-9cb85e6e6719" }, "outputs": [], "source": [ @@ -1656,7 +1971,7 @@ "cell_type": "markdown", "id": "50f3a8c5-aac5-4def-b79f-8e20be1cc822", "metadata": { - "id": "6123eX9C-g4J" + "id": "50f3a8c5-aac5-4def-b79f-8e20be1cc822" }, "source": [ "It worked! And to double check, let's also plot it:" @@ -1669,25 +1984,25 @@ "metadata": { "colab": { "base_uri": "https://localhost:8080/", - "height": 324 + "height": 506 }, - "id": "Aeay_slW-g4J", - "outputId": "11424ad3-2a00-49db-db13-b4db8e73671e" + "id": "58536a6a-6e5b-40cd-8d14-dc453d781405", + "outputId": "f5764fa2-b419-4035-d1eb-3cab1c99b316" }, "outputs": [], "source": [ - "windstorm.FX.plot()" + "# plot the data" ] }, { "cell_type": "markdown", "id": "8e445352-2695-4d54-9abe-e3215817f355", "metadata": { - "id": "JlZF-cs4gSuu" + "id": "8e445352-2695-4d54-9abe-e3215817f355" }, "source": [ "
\n", - "Question 11: Describe the various steps you have taken to make sure that the windstorm map is now exactly the same extent as the corine land cover map. Feel free to include lines of code in your answer and also describe the different functions you have used along the way.\n", + "Question 9: Describe the various steps you have taken to make sure that the windstorm map is now exactly the same extent as the corine land cover map. Feel free to include lines of code in your answer and also describe the different functions you have used along the way.\n", "
" ] }, @@ -1695,7 +2010,7 @@ "cell_type": "markdown", "id": "4959f306-df08-4548-8470-9083c814b203", "metadata": { - "id": "LW158xPh-g4J" + "id": "4959f306-df08-4548-8470-9083c814b203" }, "source": [ "Now its finally time to do our damage assessment! To do so, we need to convert our data to `numpy.arrays()` to do our calculation:" @@ -1703,10 +2018,10 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 54, "id": "f0f82a7c-f2b1-43dd-bcb6-4a9d24738d75", "metadata": { - "id": "QZIzWIeP-g4J" + "id": "f0f82a7c-f2b1-43dd-bcb6-4a9d24738d75" }, "outputs": [], "source": [ @@ -1714,27 +2029,11 @@ "wind_map = windstorm['FX'].to_numpy()[0,:,:]" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "53d83a65-c63b-427b-b950-2f4674fe8b82", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "aBqqRqbkmA1Y", - "outputId": "709d6c91-4ad9-4e27-e6a9-e6201df32dc7" - }, - "outputs": [], - "source": [ - "wind_map.shape" - ] - }, { "cell_type": "markdown", "id": "aca9bbe2-95f2-4b0d-9fb7-bb0ffc94ecef", "metadata": { - "id": "J9QHyhSU-g4J" + "id": "aca9bbe2-95f2-4b0d-9fb7-bb0ffc94ecef" }, "source": [ "And remember that our windstorm data was stored in **m/s**. Hence, we need to convert it to **km/h**:" @@ -1742,21 +2041,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 56, "id": "11ddca33-7360-4efb-84f2-7613fd360ca3", "metadata": { - "id": "GqdUCXD_-g4J" + "id": "11ddca33-7360-4efb-84f2-7613fd360ca3" }, "outputs": [], "source": [ - "wind_map_kmh = wind_map*XXX" + "wind_map_kmh = wind_map* #convert to km/h" ] }, { "cell_type": "markdown", "id": "53b5ac7e-e817-49e2-b588-614e997adf8a", "metadata": { - "id": "ln7NqRB1-g4J" + "id": "53b5ac7e-e817-49e2-b588-614e997adf8a" }, "source": [ "And now let's run the DamageScanner to obtain the damage results" @@ -1764,10 +2063,10 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 57, "id": "31da4031-fdd4-485f-af99-30fa49fdabe0", "metadata": { - "id": "y_g0pj1h-g4J", + "id": "31da4031-fdd4-485f-af99-30fa49fdabe0", "tags": [] }, "outputs": [], @@ -1784,8 +2083,8 @@ "base_uri": "https://localhost:8080/", "height": 1000 }, - "id": "-6DbFD_JeFA1", - "outputId": "fb251350-8885-4dde-e665-893fa04cde6e" + "id": "a717a4a2-8d6b-436b-b855-bebc7835d0b3", + "outputId": "1f8aaf42-367a-4073-bb05-0342e2a42898" }, "outputs": [], "source": [ @@ -1793,775 +2092,675 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "e4c4ad75-a555-414d-bb64-6af5f10a2eb1", - "metadata": {}, - "outputs": [], + "cell_type": "markdown", + "id": "5UNySYvk-g4J", + "metadata": { + "id": "5UNySYvk-g4J", + "tags": [] + }, "source": [ - "! @TASK: Let students also perform risk assessment based on rasterized OSM land use data?? Code needs to be written for that. Or think about a really good question that we can ask here about this?" + "#### Flood Damage\n", + "---\n", + "To Assess the flood damage, we are again going to make use of the [DamageScanner](https://damagescanner.readthedocs.io/en/latest/). The Corine Land Cover data is widely used in European flood risk assessments. As such, we can simply make use of pre-developed curves. We are using the damage curves as developed by Huizinga et al. (2007). Again, let's first load the maximum damages and the depth-damage curves:" ] }, { "cell_type": "code", - "execution_count": null, - "id": "38d46699-d759-48e3-a5ef-09d45ec8e41a", - "metadata": {}, + "execution_count": 86, + "id": "ua2xyAGW-g4J", + "metadata": { + "id": "ua2xyAGW-g4J" + }, "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "id": "28e483d0-06b1-432f-86e6-d7a68e9811a4", - "metadata": {}, "source": [ - "## 6. Extracting high-resolution data from OpenStreetMap\n", - "
" + "flood_curves = pd.read_excel(\"https://github.com/ElcoK/BigData_AED/raw/main/week5/damage_curves.xlsx\",sheet_name='flood_curves',engine='openpyxl')\n", + "maxdam = pd.read_excel(\"https://github.com/ElcoK/BigData_AED/raw/main/week5/damage_curves.xlsx\",sheet_name='maxdam')" ] }, { "cell_type": "markdown", - "id": "502b596d-ad9f-4e42-bc2f-e889d216f0e7", - "metadata": {}, - "source": [ - "### Extracting buildings from OpenStreetMap\n", - "---" - ] - }, - { - "cell_type": "markdown", - "id": "4f42ba03-9c17-465d-97eb-77df502dd8ee", + "id": "HT54wRvs-g4K", "metadata": { - "id": "WMOSa6JF47DS" + "id": "HT54wRvs-g4K" }, "source": [ - "There is a lot more data to extract from OpenStreetMap besides land-use information. Let's extract some building data. To do so, we use the *\"building\"* tag." + "And convert our data to `numpy.arrays()` to do our calculation:" ] }, { "cell_type": "code", - "execution_count": null, - "id": "92f86ddc-ce27-4753-9e70-af6df03d7850", - "metadata": {}, + "execution_count": 87, + "id": "qzXKNmg2-g4K", + "metadata": { + "id": "qzXKNmg2-g4K" + }, "outputs": [], "source": [ - "tags = {\"building\": True}\n", - "buildings = ox.features_from_place(place_name, tags)" + "landuse_map = CLC_region['band_data'].to_numpy()\n", + "flood_map = flood_map_area['band_data'].to_numpy()" ] }, { "cell_type": "markdown", - "id": "772d95a6-c2ce-48a6-a7d0-bc1f4b77c323", - "metadata": {}, + "id": "ttGra99k-g4K", + "metadata": { + "id": "ttGra99k-g4K" + }, "source": [ - "In case the above does not work, you can continue the assignment by using the code below (make sure you remove the hashtags to run it). If you decide to use the data as specified below, also change the map at the start to 'Kampen'." + "And now let's run the DamageScanner to obtain the damage results" ] }, { "cell_type": "code", - "execution_count": 64, - "id": "9a7e508a-b20a-416c-8f2a-c8dd36a60389", - "metadata": {}, + "execution_count": 88, + "id": "2qL8UATu-g4K", + "metadata": { + "id": "2qL8UATu-g4K" + }, "outputs": [], "source": [ - "# remote_url = https://github.com/VU-IVM/UNIGIS_ProgrammingGIS/tree/main/TAA2'\n", - "# file = 'kampen_buildings.gpkg'\n", - "# \n", - "# #request.urlretrieve(remote_url, file)\n", - "# buildings = gpd.GeoDataFrame.from_file('kampen_buildings.gpkg')" + "flood_damage_CLC = DamageScanner(landuse_map,flood_map,flood_curves,maxdam)[1]" ] }, { - "cell_type": "markdown", - "id": "53e45bdb-36a3-4efd-b0e4-111f5fd858fe", + "cell_type": "code", + "execution_count": null, + "id": "WnWu6AMUeFA2", "metadata": { - "id": "bon7osXA47DT" + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "WnWu6AMUeFA2", + "outputId": "9b3076fd-a548-462d-a9e1-f532d644ed04" }, + "outputs": [], "source": [ - "Now let's see what information is actually extracted:" + "flood_damage_CLC" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "26a60806-c927-4d0c-ab04-dc07c9c7a688", + "cell_type": "markdown", + "id": "61359310", "metadata": {}, - "outputs": [], "source": [ - "buildings.head()" + "
\n", + "Question 10: Create a plot yourself to compare the results of both the windstorm and flood damage results. This could be a simple barplot, for example.\n", + "
" ] }, { "cell_type": "markdown", - "id": "2f7f7ff1-ed38-4dca-b2ad-f09472566879", + "id": "tpS3A5DA5NiA", "metadata": { - "id": "p8dhZx1n47DT" + "id": "tpS3A5DA5NiA" }, "source": [ - "As you notice in the output of the cell above, there are many columns which just contain \"NaN\". And there even seem to be to many columns to even visualize properly in one view.\n", + "Now let's try to do this again with the OpenStreetMap data. It would be most convenient to use the same damage curves, so we want to couple our OSM land-use information to the flood curves.\n", "\n", - "Let's check what information is collected for the different buildings:" + "Let's first have a look at the column values:" ] }, { "cell_type": "code", "execution_count": null, - "id": "b78b1253-16b0-4513-8903-966b1816715f", + "id": "V9W8ngNm5dI_", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, - "executionInfo": { - "elapsed": 35, - "status": "ok", - "timestamp": 1675087861529, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "W3ZpsIkO47DT", - "outputId": "385616f8-25fe-4675-f5f0-16d7fa9b0df7" + "id": "V9W8ngNm5dI_", + "outputId": "71a6bdf8-69d1-4f12-f0c6-02e6d185ab9c" }, "outputs": [], "source": [ - "buildings.columns" + "flood_curves.columns" ] }, { "cell_type": "markdown", - "id": "772be8a9-7ab6-4996-9311-e165fcc6c8ed", + "id": "Q_FkDCtN5se3", "metadata": { - "id": "sH7NTKENA4WO" + "id": "Q_FkDCtN5se3" }, "source": [ - "
\n", - "Question 12: Let's have a look at the extracted building information. Please describe in your own words the information it contains. Is there specific information that suprises you to see, and do you think anything is missing that you expected? \n", - "
" + "Ok this does not say anything to us yet. So let's have a look at the list of classes they are refering to:\n", + "\n", + "\n", + "\n", + "![corine-ocsol-legend.png](data:image/png;base64,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)" ] }, { "cell_type": "markdown", - "id": "d7077034-4cfe-436a-b5b2-64fc77f24ae5", + "id": "C7zUFEoZ6Yzn", "metadata": { - "id": "Z37JRRc747DT" + "id": "C7zUFEoZ6Yzn" }, "source": [ - "One interesting column is called `start_date`. This shows the building year per building. \n", - "\n", - "Let's explore this year of building a bit more.\n", - "\n", - "First, it would be interesting to get an idea how many buildings are build in each year through using the `value_counts()` function. Normally, that functions ranks the values in descending order (high to low). We are more interested in how this has developed over time. So we use the `sort_index()` function to sort the values by year. Add these two functions in the cell below." + "So the first column of our damage curves relates to \"111: Continuous urban fabric\", and so on. Now let's have a look at the land uses we have within our OSM data. Can you find all the unique values in our 'landuse' column of the **landuse** dataframe?" ] }, { "cell_type": "code", "execution_count": null, - "id": "e27c9a71-68b4-4adc-a1b4-52ff94275a6f", + "id": "wPX9jZWd6sa-", "metadata": { - "executionInfo": { - "elapsed": 924, - "status": "ok", - "timestamp": 1675087884735, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 + "colab": { + "base_uri": "https://localhost:8080/" }, - "id": "lNSe826i47DT" + "id": "wPX9jZWd6sa-", + "outputId": "ba5fea0e-2791-4c81-cdc0-001a6703251f" }, "outputs": [], - "source": [ - "building_year = buildings.start_date. XXXX" - ] + "source": [] }, { "cell_type": "markdown", - "id": "e9e9c436-fd01-46f7-8f73-44eccafe7816", + "id": "qUJ7GwF_6vGf", "metadata": { - "id": "X6b_T5xs47DU" + "id": "qUJ7GwF_6vGf" }, "source": [ - "There is not better way to further explore this years than through plotting it. Don't forget to add things such as a x label, y label and title. Have a look at some of the matplotlib [tutorials](https://matplotlib.org/stable/tutorials/introductory/quick_start.html). Note that you need to look at the code that also uses subplots and where they use the `ax` option." + "Our next step would be to attach a value to each of the land-use classes that corresponds to the value of each column (to make sure we have a damage curve linked to each land-use class)" ] }, { "cell_type": "code", - "execution_count": null, - "id": "35a6ee4b-f664-4955-9781-86d56920b3e4", + "execution_count": 115, + "id": "5pGFDGjP6ujm", "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "executionInfo": { - "elapsed": 1636, - "status": "ok", - "timestamp": 1675087889714, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "fmk6m78I47DU", - "outputId": "78f3ea6a-284d-495f-b596-12db32305128" + "id": "5pGFDGjP6ujm" }, "outputs": [], "source": [ - "fig,ax = plt.subplots(1,1,figsize=(5,18))\n", - "\n", - "building_year.plot(kind='barh',ax=ax)\n", - "\n", - "ax.tick_params(axis='y', which='major', labelsize=7)" + "landuse_value_clc = [0, ## complete the list, where each value corresponds to a landuse class in the flood_curves dataframe]" ] }, { - "cell_type": "markdown", - "id": "7e5ce5b6-f7b6-47a4-b4b7-2cac7cc933bf", + "cell_type": "code", + "execution_count": 116, + "id": "IpudoRfT7pru", "metadata": { - "id": "AwRyhvNeBn0G" + "id": "IpudoRfT7pru" }, + "outputs": [], "source": [ - "
\n", - "Question 13: Please upload a figure that shows the development of building stock over the years in your region of interest. Make sure it contains all the necessary elements (labels on the axis, title, etc.)\n", - "
" + "value_dict_clc = dict(zip(landuse.landuse.unique(),landuse_value_clc))\n", + "value_dict_clc['nodata'] = ## add a nodata value\n", + "landuse['landuse_value_clc'] = landuse.landuse.apply(lambda x: value_dict_clc[x])" ] }, { "cell_type": "markdown", - "id": "089f6011-87fd-464a-ad8b-52ad810d8b75", - "metadata": { - "id": "wrcM1p-m47DU" - }, + "id": "24d86032", + "metadata": {}, "source": [ - "What we also noticed is that quite some buildings are identified as 'yes'. This is not very useful as it does not really say much about the use of the building. \n", - "\n", - "Let's see for how many buildings this is the case: " + "and now rasterize the OSM landuse data again to make it matching!" ] }, { "cell_type": "code", - "execution_count": null, - "id": "ca163a97-54bd-4050-bea6-2721d024a1eb", + "execution_count": 132, + "id": "38d46699-d759-48e3-a5ef-09d45ec8e41a", "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 205, - "status": "ok", - "timestamp": 1675087945407, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "_4eKR2Bo47DU", - "outputId": "54e29c44-9717-4eee-984f-9555659317be" + "id": "38d46699-d759-48e3-a5ef-09d45ec8e41a" }, "outputs": [], "source": [ - "buildings.building.value_counts()" + "landuse_clc = make_geocube(\n", + " vector_data= # add landuse,\n", + " output_crs= # add CRS,\n", + " resolution= # add resolution (this should be somewhat similar as the resolution of the flood map),\n", + " categorical_enums={'landuse_value': landuse.landuse_value.drop_duplicates().values.tolist()\n", + "}\n", + ")" ] }, { "cell_type": "markdown", - "id": "502fcb4a-cc93-46fa-bc1a-5dad7f4438bc", + "id": "126d4106", "metadata": {}, "source": [ - "As you have seen from the `value_counts` function, there are quite a few buildings with only very few tags. You could either consider to not include them in your plot at all (for example by using the `isin` function or the `query` function, see also [here](https://stackoverflow.com/questions/12096252/use-a-list-of-values-to-select-rows-from-a-pandas-dataframe)), or rename them, similar to how you named the natural land cover classes for the land-use map. " + "And run the **match_rasters** function now with the new landuse map" ] }, { - "cell_type": "markdown", - "id": "22598d8d-a73c-41b7-befd-f8abafc86162", + "cell_type": "code", + "execution_count": 134, + "id": "PL1evdBM4rex", "metadata": { - "id": "vF6WJ9_k47DU" + "id": "PL1evdBM4rex" }, + "outputs": [], "source": [ - "Now let's visualize the buildings again. We need to create a similar color dictionary as we did for the land-use categories. Now its up to you to make it!" + "landuse_osm_clc, flood_map_osm = match_rasters(# add landuse_clc,\n", + " ## add landuse_clc,\n", + " haz_crs=3035,\n", + " lu_crs=# add landuse CRS,\n", + " resolution= #add desired resolution (I would pick the resolution of the flood map),\n", + " hazard_col=['band_data'])" + ] + }, + { + "cell_type": "markdown", + "id": "b70655e2", + "metadata": {}, + "source": [ + "And now turn them into numpy arrays again" ] }, { "cell_type": "code", - "execution_count": null, - "id": "739a2389-8302-4e4f-8624-2beb0225ecfd", + "execution_count": 139, + "id": "2VNtw7HW9RXG", "metadata": { - "executionInfo": { - "elapsed": 226, - "status": "ok", - "timestamp": 1675087956546, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "RYRxKXxd47DU" + "id": "2VNtw7HW9RXG" }, "outputs": [], "source": [ - "color_dict = { 'yes' : \"#f1134b\", \n", - " 'house':'#f13013', \n", - " 'industrial':'#0f045c',\n", - " 'farm':'#fcfcb9', \n", - " 'bungalow':'#f13013',\n", - " 'service':'#CB8DDB' }" + "osm_landuse_map = landuse_osm_clc['band_data'] #complete function\n", + "osm_flood_map = flood_map_osm['band_data'] #complete function" + ] + }, + { + "cell_type": "markdown", + "id": "8398430d", + "metadata": {}, + "source": [ + "And run the DamageScanner" ] }, { "cell_type": "code", "execution_count": null, - "id": "54672469-3961-4b67-860e-17f9320d1a62", + "id": "91662ad6", + "metadata": {}, + "outputs": [], + "source": [ + "flood_damage_CLC = DamageScanner(# fill the dammagescanner function)[1]" + ] + }, + { + "cell_type": "markdown", + "id": "5626418e", + "metadata": {}, + "source": [ + "
\n", + "Question 11: How do the results compare to the flood damages estimated with Corine Land Cover? Are you able to visualise the differences?\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "28e483d0-06b1-432f-86e6-d7a68e9811a4", "metadata": { - "executionInfo": { - "elapsed": 232, - "status": "ok", - "timestamp": 1675087958726, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "YjRwC-K-47DU" + "id": "28e483d0-06b1-432f-86e6-d7a68e9811a4" }, - "outputs": [], "source": [ - "# Remove multiple keys from dictionary\n", - "color_dict = {key: color_dict[key]\n", - " for key in color_dict if key not in list(set(color_dict)-set(buildings.building.unique()))}\n", - "\n", - "map_dict = dict(zip(color_dict.keys(),[x for x in range(len(color_dict))]))\n", - "buildings['col_landuse'] =buildings.building.apply(lambda x: color_dict[x])" + "### 6. Extracting high-resolution data from OpenStreetMap\n", + "
" ] }, { "cell_type": "markdown", - "id": "0bbaef6d-6b28-45f4-ace9-6a5c9dec0f2f", + "id": "502b596d-ad9f-4e42-bc2f-e889d216f0e7", "metadata": { - "id": "wGh7rbnB47DU" + "id": "502b596d-ad9f-4e42-bc2f-e889d216f0e7" }, "source": [ - "And plot the figure in the same manner!" + "#### Extracting buildings from OpenStreetMap\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "4f42ba03-9c17-465d-97eb-77df502dd8ee", + "metadata": { + "id": "4f42ba03-9c17-465d-97eb-77df502dd8ee" + }, + "source": [ + "There is a lot more data to extract from OpenStreetMap besides land-use information. Let's extract some building data. To do so, we use the *\"building\"* tag." ] }, { "cell_type": "code", - "execution_count": null, - "id": "7dad1b9f-855a-468e-9090-25d7ace2990d", + "execution_count": 60, + "id": "92f86ddc-ce27-4753-9e70-af6df03d7850", "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 616 - }, - "executionInfo": { - "elapsed": 3651, - "status": "ok", - "timestamp": 1675087966347, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "oDfamvIV47DV", - "outputId": "dbcee552-e955-4d2b-ddda-909ab4265105" + "id": "92f86ddc-ce27-4753-9e70-af6df03d7850" }, "outputs": [], "source": [ - "fig, ax = plt.subplots(1, 1,figsize=(12,10))\n", - "\n", - "# add color scheme\n", - "color_scheme_map = list(color_dict.values())\n", - "cmap = LinearSegmentedColormap.from_list(name='landuse',\n", - " colors=color_scheme_map) \n", - "\n", - "# and plot the land-use map.\n", - "buildings.plot(color=buildings['col_landuse'],ax=ax,linewidth=0)\n", - "\n", - "# remove the ax labels\n", - "ax.set_xticks([])\n", - "ax.set_yticks([])\n", - "ax.set_axis_off()\n", - "\n", - "# add a legend:\n", - "legend_elements = []\n", - "for iter_,item in enumerate(color_dict):\n", - " legend_elements.append(Patch(facecolor=color_scheme_map[iter_],label=item)) \n", - "\n", - "ax.legend(handles=legend_elements,edgecolor='black',facecolor='#fefdfd',prop={'size':12},loc=(1.02,0.2)) \n", - "\n", - "# add a title\n", - "ax.set_title(place_name,fontweight='bold')" + "tags = {\"building\": True}\n", + "buildings = ox.features_from_place(place_name, tags)" ] }, { "cell_type": "markdown", - "id": "7fc1437d-8deb-4569-a3ee-9270676f0e41", + "id": "772d95a6-c2ce-48a6-a7d0-bc1f4b77c323", "metadata": { - "id": "IJalDDJvB6Yd" + "id": "772d95a6-c2ce-48a6-a7d0-bc1f4b77c323" }, "source": [ - "
\n", - "Question 14: Please upload a figure of your building stock map of your region of interest. Make sure that the interpretation is clear. If necessary, merge multiple categories into one (i.e., when some categories only contain 1 or 2 buildings).\n", - "
" + "In case the above does not work, you can continue the assignment by using the code below (make sure you remove the hashtags to run it). If you decide to use the data as specified below, also change the map at the start to 'Kampen'." ] }, { - "cell_type": "markdown", - "id": "c59fa9dc-68f1-4d39-8adc-f917a0af3a04", - "metadata": {}, + "cell_type": "code", + "execution_count": 61, + "id": "9a7e508a-b20a-416c-8f2a-c8dd36a60389", + "metadata": { + "id": "9a7e508a-b20a-416c-8f2a-c8dd36a60389" + }, + "outputs": [], "source": [ - "### Extracting roads from OpenStreetMap\n", - "---" + "# remote_url = https://github.com/VU-IVM/UNIGIS_ProgrammingGIS/tree/main/TAA2'\n", + "# file = 'kampen_buildings.gpkg'\n", + "#\n", + "# #request.urlretrieve(remote_url, file)\n", + "# buildings = gpd.GeoDataFrame.from_file('kampen_buildings.gpkg')" ] }, { "cell_type": "markdown", - "id": "83eb8f23-6b4e-47ce-a1df-12ca10e90897", + "id": "53e45bdb-36a3-4efd-b0e4-111f5fd858fe", "metadata": { - "id": "HpWnKfIk47DV" + "id": "53e45bdb-36a3-4efd-b0e4-111f5fd858fe" }, "source": [ - "Let's continue (and end) this tutorial with the core data in OpenStreetMap (it is even in the name): roads!\n", - "\n", - "Now, instead of using tags, we want to identify what type of roads we would like to extract. Let's first only extract roads that can be used to drive.\n", - "\n", - "The `graph_from_place()` function returns a `NetworkX` Graph element. You can read more about these graph elements in the introduction page of [NetworkX](https://networkx.org/documentation/stable/reference/introduction.html)." + "Now let's see what information is actually extracted:" ] }, { "cell_type": "code", "execution_count": null, - "id": "73036bbd-08b1-4d2d-bc14-9efd48d4ec76", - "metadata": { - "executionInfo": { - "elapsed": 13403, - "status": "ok", - "timestamp": 1675088179196, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 + "id": "26a60806-c927-4d0c-ab04-dc07c9c7a688", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 460 }, - "id": "MpjxUadp47DV" + "id": "26a60806-c927-4d0c-ab04-dc07c9c7a688", + "outputId": "c4e83f03-b5cf-4421-836b-4262a804f6d1" }, "outputs": [], "source": [ - "G = ox.graph_from_place(place_name, network_type=\"drive\")" + "buildings.head()" ] }, { "cell_type": "markdown", - "id": "6c1596cb-9a1b-4a67-87cd-cee4f687ad11", + "id": "2f7f7ff1-ed38-4dca-b2ad-f09472566879", "metadata": { - "id": "NA_HAmHx47DV" + "id": "2f7f7ff1-ed38-4dca-b2ad-f09472566879" }, "source": [ - "Unfortunately, it is bit difficult to easily view all the roads within such a Graph element. To be able to explore the data, we are going to convert it to a `Geopandas GeoDataFrame`, using the `to_pandas_edgelist()` function." + "As you notice in the output of the cell above, there are many columns which just contain \"NaN\". And there even seem to be to many columns to even visualize properly in one view.\n", + "\n", + "Let's check what information is collected for the different buildings:" ] }, { "cell_type": "code", "execution_count": null, - "id": "1b52effc-4eaf-44b5-b031-2481d2125197", + "id": "b78b1253-16b0-4513-8903-966b1816715f", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, - "executionInfo": { - "elapsed": 15, - "status": "ok", - "timestamp": 1675088179197, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "4dMXZb_v47DV", - "outputId": "e615d5f8-6b96-4a32-f114-ce38b1481b70" + "id": "b78b1253-16b0-4513-8903-966b1816715f", + "outputId": "b00fd26f-4ab5-4acb-8e8a-df34bc2b9fc3" }, "outputs": [], "source": [ - "roads = gpd.GeoDataFrame(nx.to_pandas_edgelist(G))" + "buildings.columns" ] }, { "cell_type": "markdown", - "id": "7a3a191c-0d36-4bb5-8ed7-4f12bb05e1f5", + "id": "772be8a9-7ab6-4996-9311-e165fcc6c8ed", + "metadata": { + "id": "772be8a9-7ab6-4996-9311-e165fcc6c8ed" + }, + "source": [ + "
\n", + "Question 12: Let's have a look at the extracted building information. Please describe in your own words the information it contains. Is there specific information that suprises you to see, and do you think anything is missing that you expected?\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "d7077034-4cfe-436a-b5b2-64fc77f24ae5", "metadata": { - "id": "yds5NBlF47DV" + "id": "d7077034-4cfe-436a-b5b2-64fc77f24ae5" }, "source": [ - "In some cases, roads are classified with more than one category. If that is the case, they are captured within a `list`. To overcome this issue, we specify that we want the entire `highway` column as a `string` dtype." + "One interesting column is called `start_date`. This shows the building year per building.\n", + "\n", + "Let's explore this year of building a bit more.\n", + "\n", + "First, it would be interesting to get an idea how many buildings are build in each year through using the `value_counts()` function. Normally, that functions ranks the values in descending order (high to low). We are more interested in how this has developed over time. So we use the `sort_index()` function to sort the values by year. Add these two functions in the cell below." ] }, { "cell_type": "code", - "execution_count": null, - "id": "d5f76461-aac1-4534-8a97-2abc841107b4", - "metadata": { - "executionInfo": { - "elapsed": 294, - "status": "ok", - "timestamp": 1675088191403, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "NxTg1jb847DV" + "execution_count": 64, + "id": "e27c9a71-68b4-4adc-a1b4-52ff94275a6f", + "metadata": { + "id": "e27c9a71-68b4-4adc-a1b4-52ff94275a6f" }, "outputs": [], "source": [ - "roads.highway = roads.highway.astype('str')" + "building_year = buildings. #complete function" ] }, { "cell_type": "markdown", - "id": "5080124a-c7f4-45f6-aced-a27f8793ef59", + "id": "e9e9c436-fd01-46f7-8f73-44eccafe7816", "metadata": { - "id": "rbzl5JPR47DW" + "id": "e9e9c436-fd01-46f7-8f73-44eccafe7816" }, "source": [ - "Now we can create a plot to see how the road network is configured." + "There is not better way to further explore this years than through plotting it. Don't forget to add things such as a x label, y label and title. Have a look at some of the matplotlib [tutorials](https://matplotlib.org/stable/tutorials/introductory/quick_start.html). Note that you need to look at the code that also uses subplots and where they use the `ax` option. Perhaps also consider setting a threshold to make the figure more easy to visualise?" ] }, { "cell_type": "code", "execution_count": null, - "id": "b0c2f581-4182-471e-823b-0280181494e0", + "id": "35a6ee4b-f664-4955-9781-86d56920b3e4", "metadata": { "colab": { "base_uri": "https://localhost:8080/", - "height": 575 - }, - "executionInfo": { - "elapsed": 888, - "status": "ok", - "timestamp": 1675088196301, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 + "height": 1000 }, - "id": "uyo3Ggpc47DW", - "outputId": "e58c915a-b085-498c-e7ea-8d62f237d417" + "id": "35a6ee4b-f664-4955-9781-86d56920b3e4", + "outputId": "f51f5e22-aeda-4ec6-c0d4-7be7b6dbdd42" }, "outputs": [], "source": [ - "fig, ax = plt.subplots(1, 1,figsize=(12,10))\n", - "\n", - "\n", - "roads.plot(column='highway',legend=True,ax=ax,legend_kwds={'loc': 'lower right'});\n", + "fig,ax = plt.subplots(1,1,figsize=(5,18))\n", "\n", + "building_year.plot(kind='barh',ax=ax)\n", "\n", - "# remove the ax labels\n", - "ax.set_xticks([])\n", - "ax.set_yticks([])\n", - "ax.set_axis_off()" + "ax.tick_params(axis='y', which='major', labelsize=7)" ] }, { "cell_type": "markdown", - "id": "82a98a1c-e8d3-4f84-80df-5e8577a3458b", + "id": "7e5ce5b6-f7b6-47a4-b4b7-2cac7cc933bf", "metadata": { - "id": "M18fuTWM47DW", - "tags": [] + "id": "7e5ce5b6-f7b6-47a4-b4b7-2cac7cc933bf" + }, + "source": [ + "
\n", + "Question 13: Please upload a figure that shows the development of building stock over the years in your region of interest. Make sure it contains all the necessary elements (labels on the axis, title, etc.)\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "089f6011-87fd-464a-ad8b-52ad810d8b75", + "metadata": { + "id": "089f6011-87fd-464a-ad8b-52ad810d8b75" }, "source": [ - "It would also be interesting to explore the network a little but more interactively. **OSMnx** has a function called `plot_graph_folium()`, which allow us to use the [folium](https://python-visualization.github.io/folium/quickstart.html#Getting-Started) package to plot data interactively on a map. " + "What we also noticed is that quite some buildings are identified as 'yes'. This is not very useful as it does not really say much about the use of the building.\n", + "\n", + "Let's see for how many buildings this is the case. Use the .value_counts function:" ] }, { "cell_type": "code", "execution_count": null, - "id": "dcc7ab55-f4ce-4706-83a0-5b944c2bfd7d", + "id": "ca163a97-54bd-4050-bea6-2721d024a1eb", "metadata": { "colab": { "base_uri": "https://localhost:8080/", - "height": 866 - }, - "executionInfo": { - "elapsed": 1720, - "status": "ok", - "timestamp": 1675088204394, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 + "height": 993 }, - "id": "lpWHR0Ez47DW", - "outputId": "38be3bea-b399-4e8f-a081-210baa559ef7" + "id": "ca163a97-54bd-4050-bea6-2721d024a1eb", + "outputId": "94a378d4-bd6a-4efb-94e6-076ed1f1afca" }, "outputs": [], "source": [ - "m1 = ox.plot_graph_folium(G, popup_attribute=\"highway\", weight=2, color=\"#8b0000\")\n", - "m1" + "buildings.building. #complete function" ] }, { - "attachments": {}, "cell_type": "markdown", - "id": "274d172a-62df-4095-987d-1de387104e8d", + "id": "502fcb4a-cc93-46fa-bc1a-5dad7f4438bc", "metadata": { - "id": "gm8NIAR947DW" + "id": "502fcb4a-cc93-46fa-bc1a-5dad7f4438bc" }, "source": [ - "One of the exiting things we can do with this data is that we can compute and plot routes between two points on a map.\n", - "\n", - "Let's first select two random start and end points from the graph and compute the shortest route between them through using the `shortest_path()` function of the `NetworkX` package.\n", - "\n", - "The function `ox.nearest_nodes()` looks for the nearest point in your network based on a `X` and `Y` coordinate. For example, in the code below, the origin node is based on the northwestern corner of your bounding box, whereas the destination node is based on the coordinates of the southeastern corner of your bounding box. \n", - "\n", - "So this can also be rewritten as:\n", - "\n", - "```\n", - "origin_node = ox.nearest_nodes(G,4.65465, 56.6778) \n", - "destination_node = ox.nearest_nodes(G,4.61055, 59.5487) \n", - "route = nx.shortest_path(G, origin_node, destination_node) \n", - "```" + "As you have seen from the `value_counts` function, there are quite a few buildings with only very few tags. You could either consider to not include them in your plot at all (for example by using the `isin` function or the `query` function, see also [here](https://stackoverflow.com/questions/12096252/use-a-list-of-values-to-select-rows-from-a-pandas-dataframe)), or rename them, similar to how you named the natural land cover classes for the land-use map. Here, we filter the dataframe to include only specific classes of buildings." ] }, { - "cell_type": "markdown", - "id": "6e1d7552-5ec6-42f0-90a7-7e70b5c435ca", + "cell_type": "code", + "execution_count": 67, + "id": "6ffd00f1-e13c-4c60-885e-d7fb6ebe895b", "metadata": { - "id": "Zi_xhqXTCi3h" + "id": "6ffd00f1-e13c-4c60-885e-d7fb6ebe895b" }, + "outputs": [], "source": [ - "
\n", - "Question 15: The last element of this tutorial is to play around with routing. Please explain in your own words what the .shortest_path() algorithm does. Include the term 'Dijkstra algorithm' in your answer.\n", - "
" + "buildings = buildings[buildings['building'].isin(['yes', 'house', 'industrial', 'apartment'])]" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "a5e7faf0-43f4-4947-a5b7-0d5f2c1632ea", - "metadata": { - "executionInfo": { - "elapsed": 837, - "status": "ok", - "timestamp": 1675088236066, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "Dr7Ftbbh47DW" + "cell_type": "markdown", + "id": "22598d8d-a73c-41b7-befd-f8abafc86162", + "metadata": { + "id": "22598d8d-a73c-41b7-befd-f8abafc86162" }, - "outputs": [], "source": [ - "origin_node = ox.nearest_nodes(G,area['bbox_west'].values[0], area['bbox_north'].values[0])\n", - "destination_node = ox.nearest_nodes(G,area['bbox_east'].values[0], area['bbox_south'].values[0])\n", - "route = nx.shortest_path(G, origin_node, destination_node)" + "Now let's visualize the buildings again. We need to create a similar color dictionary as we did for the land-use categories. Now its up to you to make it!" ] }, { - "cell_type": "markdown", - "id": "b3724e1e-0cfa-4e7c-8d94-1d76e10c06d1", + "cell_type": "code", + "execution_count": 68, + "id": "739a2389-8302-4e4f-8624-2beb0225ecfd", "metadata": { - "id": "4UuCS8G247DW" + "id": "739a2389-8302-4e4f-8624-2beb0225ecfd" }, + "outputs": [], "source": [ - "We can plot the route with folium. Like above, you can pass keyword args along to folium PolyLine to style the lines." + "color_dict = { 'yes' : \"#f1134b\",\n", + " 'house':'#f13013',\n", + " 'industrial':'#0f045c',\n", + " 'apartment':'#fcfcb9' }" ] }, { "cell_type": "code", "execution_count": null, - "id": "ac7785a7-c4c3-491b-8c65-44353cdddc43", + "id": "54672469-3961-4b67-860e-17f9320d1a62", "metadata": { "colab": { - "base_uri": "https://localhost:8080/", - "height": 866 - }, - "executionInfo": { - "elapsed": 240, - "status": "ok", - "timestamp": 1675088397348, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 + "base_uri": "https://localhost:8080/" }, - "id": "7QrZ6Gpi47DX", - "outputId": "33fecead-a6d7-4090-99da-e09d0c34081a" + "id": "54672469-3961-4b67-860e-17f9320d1a62", + "outputId": "c172f78b-7643-4c4a-f0c6-655dcc2da355" }, "outputs": [], "source": [ - "m2 = ox.plot_route_folium(G, route, weight=10)\n", - "m2" + "map_dict = dict(zip(color_dict.keys(),[x for x in range(len(color_dict))]))\n", + "buildings['col_landuse'] =buildings.building.apply(lambda x: color_dict[x])" ] }, { "cell_type": "markdown", - "id": "9df6de86-02e3-4a06-b99f-ec39c71385e8", + "id": "0bbaef6d-6b28-45f4-ace9-6a5c9dec0f2f", "metadata": { - "id": "eedHqPli47DX" + "id": "0bbaef6d-6b28-45f4-ace9-6a5c9dec0f2f" }, "source": [ - "Plot the route with folium on top of the previously created map\n" + "And plot the figure in the same manner!" ] }, { "cell_type": "code", "execution_count": null, - "id": "d0813cf0-0fb3-4ba7-9012-dc5c3f362743", + "id": "7dad1b9f-855a-468e-9090-25d7ace2990d", "metadata": { "colab": { "base_uri": "https://localhost:8080/", - "height": 866 + "height": 847 }, - "executionInfo": { - "elapsed": 2518, - "status": "ok", - "timestamp": 1675088413924, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "aHzxZAbZ47DX", - "outputId": "01ee7d97-4792-41fb-925c-c44fb9b15a3f" + "id": "7dad1b9f-855a-468e-9090-25d7ace2990d", + "outputId": "68968e35-8949-4abd-c593-2ef1254d81d8" }, "outputs": [], "source": [ - "m3 = ox.plot_route_folium(G, route, route_map=m1, popup_attribute=\"name\", weight=7)\n", - "m3" + "fig, ax = plt.subplots(1, 1,figsize=(12,10))\n", + "\n", + "# add color scheme\n", + "color_scheme_map = list(color_dict.values())\n", + "cmap = LinearSegmentedColormap.from_list(name='landuse',\n", + " colors=color_scheme_map)\n", + "\n", + "# and plot the land-use map.\n", + "buildings.plot(color=buildings['col_landuse'],ax=ax,linewidth=0)\n", + "\n", + "# remove the ax labels\n", + "ax.set_xticks([])\n", + "ax.set_yticks([])\n", + "ax.set_axis_off()\n", + "\n", + "# add a legend:\n", + "legend_elements = []\n", + "for iter_,item in enumerate(color_dict):\n", + " legend_elements.append(Patch(facecolor=color_scheme_map[iter_],label=item))\n", + "\n", + "ax.legend(handles=legend_elements,edgecolor='black',facecolor='#fefdfd',prop={'size':12},loc=(1.02,0.2))\n", + "\n", + "# add a title\n", + "ax.set_title(place_name,fontweight='bold')" ] }, { - "attachments": {}, "cell_type": "markdown", - "id": "d0eda49e-6b12-42b9-b88d-ba0938f2f507", - "metadata": {}, + "id": "7fc1437d-8deb-4569-a3ee-9270676f0e41", + "metadata": { + "id": "7fc1437d-8deb-4569-a3ee-9270676f0e41" + }, "source": [ "
\n", - "Question 16: Please add one more routes on a map and upload the resulting figure here.\n", + "Question 14: Please upload a figure of your building stock map of your region of interest. Make sure that the interpretation is clear. If necessary, merge multiple categories into one (i.e., when some categories only contain 1 or 2 buildings).\n", "
" ] }, { "cell_type": "markdown", "id": "508022f5-46d7-4c69-91d2-46711d6a514c", - "metadata": {}, + "metadata": { + "id": "508022f5-46d7-4c69-91d2-46711d6a514c" + }, "source": [ - "## 7. Perform a damage assessment of the road network using OpenStreetMap\n", + "### 7. Perform a damage assessment of the road network using OpenStreetMap\n", "
" ] }, @@ -2569,7 +2768,7 @@ "cell_type": "markdown", "id": "b8d7623d-40ee-4262-9781-0c2ed3ea1889", "metadata": { - "id": "bKFmTKpj-g4K" + "id": "b8d7623d-40ee-4262-9781-0c2ed3ea1889" }, "source": [ "Generally, wind damage does not cause much damage to roads. There will be clean-up cost of the trees that will fall on the roads, but structural damage is rare. As such, we will only do a flood damage assessment for the road network of our region.\n", @@ -2579,10 +2778,10 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 71, "id": "abacf8e1-b27c-4156-8521-87f38004ac2e", "metadata": { - "id": "CUqFG7AD-g4K" + "id": "abacf8e1-b27c-4156-8521-87f38004ac2e" }, "outputs": [], "source": [ @@ -2594,7 +2793,7 @@ "cell_type": "markdown", "id": "87de9a96-e3fc-4ab5-b090-be6412a0d0a1", "metadata": { - "id": "modIJTEz-g4K" + "id": "87de9a96-e3fc-4ab5-b090-be6412a0d0a1" }, "source": [ "Now we convert the road network to a `geodataframe`." @@ -2602,9 +2801,11 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 72, "id": "90acac15-3b1e-4c0a-b0a4-6033d243f9ea", - "metadata": {}, + "metadata": { + "id": "90acac15-3b1e-4c0a-b0a4-6033d243f9ea" + }, "outputs": [], "source": [ "roads = gpd.GeoDataFrame(nx.to_pandas_edgelist(G))\n", @@ -2614,22 +2815,26 @@ { "cell_type": "markdown", "id": "56f95cc0-2611-472f-92fa-c256f368c33c", - "metadata": {}, + "metadata": { + "id": "56f95cc0-2611-472f-92fa-c256f368c33c" + }, "source": [ - "In case the above does not work, you can continue the assignment by using the code below (make sure you remove the hashtags to run it). " + "In case the above does not work, you can continue the assignment by using the code below (make sure you remove the hashtags to run it)." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 73, "id": "55752d12-81de-4eb5-b849-90473f88478a", - "metadata": {}, + "metadata": { + "id": "55752d12-81de-4eb5-b849-90473f88478a" + }, "outputs": [], "source": [ "#from urllib import request\n", "# remote_url = 'https://github.com/VU-IVM/UNIGIS_ProgrammingGIS/tree/main/TAA2'\n", "# file = 'kampen_roads.gpkg'\n", - "# \n", + "#\n", "# #request.urlretrieve(remote_url, file)\n", "# roads = gpd.GeoDataFrame.from_file('kampen_roads.gpkg')" ] @@ -2638,7 +2843,7 @@ "cell_type": "markdown", "id": "73f4a201-87b1-4cd8-a206-6b965c9b4107", "metadata": { - "id": "VIaMGLxA-g4K" + "id": "73f4a201-87b1-4cd8-a206-6b965c9b4107" }, "source": [ "And lets have a look at the data:" @@ -2651,10 +2856,10 @@ "metadata": { "colab": { "base_uri": "https://localhost:8080/", - "height": 495 + "height": 807 }, - "id": "dx_299FS-g4L", - "outputId": "ffdab479-6a25-4794-da3a-cbacf2accaa4" + "id": "91a864f8-6af7-454f-869c-197e5e47151b", + "outputId": "01bfca83-8de6-4d76-90df-4702886e66fb" }, "outputs": [], "source": [ @@ -2674,18 +2879,18 @@ "cell_type": "markdown", "id": "4789ae59-e6c9-4a1c-a1ad-44e94c9172ca", "metadata": { - "id": "PSGo7dC3-g4L" + "id": "4789ae59-e6c9-4a1c-a1ad-44e94c9172ca" }, "source": [ - "It is actually quite inconvenient to have all these lists in the data for when we want to do the damage assessment. Let's clean this up a bit. To do so, we first make sure that all the lists are represented as actual lists, and not lists wrapped within a string." + "Dependening on the region you have selected, you may have lists in your data. It is actually quite inconvenient to have all these lists in the data for when we want to do the damage assessment. Let's clean this up a bit. To do so, we first make sure that all the lists are represented as actual lists, and not lists wrapped within a string." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 75, "id": "51c4746a-6efd-4b59-8b6b-5fe9a8c42372", "metadata": { - "id": "S_LZSRI6-g4L" + "id": "51c4746a-6efd-4b59-8b6b-5fe9a8c42372" }, "outputs": [], "source": [ @@ -2696,7 +2901,7 @@ "cell_type": "markdown", "id": "eb311b10-0a1c-4e0a-ad1f-cef37aa40ad7", "metadata": { - "id": "cwQKiRDd-g4L" + "id": "eb311b10-0a1c-4e0a-ad1f-cef37aa40ad7" }, "source": [ "Now we just need to grab the first element of each of the lists." @@ -2704,10 +2909,10 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 76, "id": "9e449847-c279-479e-bf3b-382b8c50e018", "metadata": { - "id": "qe86tcET-g4L" + "id": "9e449847-c279-479e-bf3b-382b8c50e018" }, "outputs": [], "source": [ @@ -2719,7 +2924,7 @@ "cell_type": "markdown", "id": "5b3f95ad-9a1f-43e1-b098-45255c9d5dd2", "metadata": { - "id": "TkyDDDIP-g4L" + "id": "5b3f95ad-9a1f-43e1-b098-45255c9d5dd2" }, "source": [ "And let's have a look whether this worked:" @@ -2732,10 +2937,10 @@ "metadata": { "colab": { "base_uri": "https://localhost:8080/", - "height": 495 + "height": 807 }, - "id": "f5qPSBmq-g4L", - "outputId": "6ac152f2-14f1-4e6c-c53a-9d68db347ce6" + "id": "21dc3a62-c266-4d0e-bd03-ad1d1b4b22e8", + "outputId": "0361fc7e-ad9c-40f4-a767-aac6ac1d84cc" }, "outputs": [], "source": [ @@ -2749,23 +2954,11 @@ "ax.set_axis_off()" ] }, - { - "cell_type": "markdown", - "id": "a3049d42-da1f-4dc2-a56f-1ce6b3080fd0", - "metadata": { - "id": "u0crazq8iQjQ" - }, - "source": [ - "
\n", - "Question 17: Upload a figure of the cleaned road network (e.g. in which you do not see any of the listed road types anymore)\n", - "
" - ] - }, { "cell_type": "markdown", "id": "d784f6dc-7091-4e60-b7df-58682efb66ef", "metadata": { - "id": "J63sExRp-g4L" + "id": "d784f6dc-7091-4e60-b7df-58682efb66ef" }, "source": [ "Nice! now let's start with the damage calculation. As you already have may have noticed, our data is now not stored in raster format, but in vector format. One way to deal with this issue is to convert our vector data to raster data, but we will lose a lot of information and detail. As such, we will perform the damage assessment on the road elements, using the xarray flood map.\n", @@ -2775,10 +2968,10 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 78, "id": "af68dc43-fd65-416c-bc7a-a1b1231187d3", "metadata": { - "id": "uHmaZFXV-g4L" + "id": "af68dc43-fd65-416c-bc7a-a1b1231187d3" }, "outputs": [], "source": [ @@ -2800,7 +2993,7 @@ "cell_type": "markdown", "id": "9894f1ba-e637-4ede-b46c-5aa4747eaea0", "metadata": { - "id": "sKb-ig4Q-g4M" + "id": "9894f1ba-e637-4ede-b46c-5aa4747eaea0" }, "source": [ "And let's plot the results:" @@ -2813,10 +3006,10 @@ "metadata": { "colab": { "base_uri": "https://localhost:8080/", - "height": 306 + "height": 481 }, - "id": "LL3YU6r1-g4M", - "outputId": "e0a9e61f-e376-436c-a11a-fa58651bf15a" + "id": "5f6ab83a-62af-4142-bb26-157e077d868b", + "outputId": "adbb0e5e-7487-4890-f767-3bbd11ded3ae" }, "outputs": [], "source": [ @@ -2827,80 +3020,145 @@ "cell_type": "markdown", "id": "1cdbc0d8-beba-4b37-be49-f5226953f19b", "metadata": { - "id": "XBsxnhjN-g4M" + "id": "1cdbc0d8-beba-4b37-be49-f5226953f19b" }, "source": [ - "We will need a bunch of functions to make sure we can do our calculations. They are specified below. " + "We will need a bunch of functions to make sure we can do our calculations. They are specified below." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 80, "id": "d470c747-42aa-4f20-bbf3-90773c3d4cc8", "metadata": { - "id": "T-XfgGLB-g4M" + "id": "d470c747-42aa-4f20-bbf3-90773c3d4cc8" }, "outputs": [], "source": [ - "def reproject(df_ds,current_crs=\"epsg:4326\",approximate_crs = \"epsg:3035\"):\n", + "def reproject(df_ds, current_crs=\"epsg:4326\", approximate_crs=\"epsg:3035\"):\n", + " \"\"\"\n", + " Reproject geometries in a DataFrame from one coordinate reference system (CRS) to another.\n", + "\n", + " Parameters:\n", + " df_ds : pandas.DataFrame\n", + " A DataFrame containing a 'geometry' column with geometries to reproject.\n", + " current_crs : str or pyproj.CRS, optional\n", + " The current coordinate reference system of the geometries. Default is \"epsg:4326\".\n", + " approximate_crs : str or pyproj.CRS, optional\n", + " The target coordinate reference system to reproject the geometries into. Default is \"epsg:3035\".\n", + "\n", + " Returns:\n", + " shapely.GeometryArray\n", + " A Shapely GeometryArray containing the reprojected geometries.\n", + " \"\"\"\n", " geometries = df_ds['geometry']\n", " coords = shapely.get_coordinates(geometries)\n", - " transformer=pyproj.Transformer.from_crs(current_crs, approximate_crs,always_xy=True)\n", + " transformer = pyproj.Transformer.from_crs(current_crs, approximate_crs, always_xy=True)\n", " new_coords = transformer.transform(coords[:, 0], coords[:, 1])\n", - " \n", - " return shapely.set_coordinates(geometries.copy(), np.array(new_coords).T) \n", "\n", - "def buffer_assets(assets,buffer_size=100):\n", - " assets['buffered'] = shapely.buffer(assets.geometry.values,buffer_size)\n", + " return shapely.set_coordinates(geometries.copy(), np.array(new_coords).T)\n", + "\n", + "\n", + "def buffer_assets(assets, buffer_size=100):\n", + " \"\"\"\n", + " Create a buffer around each geometry in the assets DataFrame.\n", + "\n", + " Parameters:\n", + " assets : pandas.DataFrame\n", + " A DataFrame containing a 'geometry' column with geometries to buffer.\n", + " buffer_size : float, optional\n", + " The distance to buffer around each geometry. Default is 100 units.\n", + "\n", + " Returns:\n", + " pandas.DataFrame\n", + " The input DataFrame with an additional 'buffered' column containing the buffered geometries.\n", + " \"\"\"\n", + " assets['buffered'] = shapely.buffer(assets.geometry.values, buffer_size)\n", " return assets\n", "\n", - "def overlay_hazard_assets(df_ds,assets):\n", "\n", - " #overlay \n", + "def overlay_hazard_assets(df_ds, assets):\n", + " \"\"\"\n", + " Find the indices of hazards that overlay or intersect with assets.\n", + "\n", + " Parameters:\n", + " df_ds : pandas.DataFrame\n", + " A DataFrame containing hazard geometries in a 'geometry' column.\n", + " assets : pandas.DataFrame\n", + " A DataFrame containing asset geometries in a 'geometry' column.\n", + "\n", + " Returns:\n", + " numpy.ndarray\n", + " An array of indices of hazards that intersect with the assets.\n", + " \"\"\"\n", + " # Build a spatial index for the hazard geometries\n", " hazard_tree = shapely.STRtree(df_ds.geometry.values)\n", - " if (shapely.get_type_id(assets.iloc[0].geometry) == 3) | (shapely.get_type_id(assets.iloc[0].geometry) == 6):\n", - " return hazard_tree.query(assets.geometry,predicate='intersects') \n", + " # Determine geometry type of the first asset\n", + " asset_geom_type = shapely.get_type_id(assets.iloc[0].geometry)\n", + " # If the asset geometry is a polygon or multipolygon\n", + " if (asset_geom_type == 3) or (asset_geom_type == 6):\n", + " return hazard_tree.query(assets.geometry, predicate='intersects')\n", " else:\n", - " return hazard_tree.query(assets.buffered,predicate='intersects')\n", - " \n", - "def get_damage_per_asset(asset,df_ds,assets):\n", - " # find the exact hazard overlays:\n", - " get_hazard_points = df_ds.iloc[asset[1]['hazard_point'].values].reset_index()\n", - " get_hazard_points = get_hazard_points.loc[shapely.intersects(get_hazard_points.geometry.values,assets.iloc[asset[0]].geometry)]\n", + " # If the asset geometry is not polygon/multipolygon, use buffered geometries\n", + " return hazard_tree.query(assets.buffered, predicate='intersects')\n", "\n", + "\n", + "def get_damage_per_asset(asset, df_ds, assets):\n", + " \"\"\"\n", + " Calculate the total damage for a single asset based on overlapping hazards.\n", + "\n", + " Parameters:\n", + " asset : tuple\n", + " A tuple containing the asset index and a DataFrame with hazard points intersecting the asset.\n", + " df_ds : pandas.DataFrame\n", + " A DataFrame containing hazard data with a 'geometry' column.\n", + " assets : pandas.DataFrame\n", + " A DataFrame containing asset data with a 'geometry' column.\n", + "\n", + " Returns:\n", + " tuple\n", + " A tuple containing the asset index and the calculated damage.\n", + " \"\"\"\n", + " # Find the exact hazard overlays\n", + " get_hazard_points = df_ds.iloc[asset[1]['hazard_point'].values].reset_index()\n", + " # Select hazard points that intersect with the asset geometry\n", " asset_geom = assets.iloc[asset[0]].geometry\n", + " get_hazard_points = get_hazard_points.loc[shapely.intersects(get_hazard_points.geometry.values, asset_geom)]\n", + "\n", + " # Parameters for damage calculation\n", + " maxdam_asset = 100 # Maximum damage per asset\n", + " hazard_intensity = np.arange(0, 10, 0.1) # Hazard intensity levels\n", + " fragility_values = np.arange(0, 1, 0.01) # Fragility values corresponding to hazard intensity\n", "\n", - " maxdam_asset = 100\n", - " hazard_intensity = np.arange(0,10,0.1) \n", - " fragility_values = np.arange(0,1,0.01) \n", - " \n", " if len(get_hazard_points) == 0:\n", - " return asset[0],0\n", + " return asset[0], 0\n", " else:\n", - " get_hazard_points['overlay_meters'] = shapely.length(shapely.intersection(get_hazard_points.geometry.values,asset_geom))\n", - " return asset[0],np.sum((np.interp(get_hazard_points.band_data.values,hazard_intensity,fragility_values))*get_hazard_points.overlay_meters*maxdam_asset)" + " # Calculate the length of the intersection between hazard and asset geometries\n", + " get_hazard_points['overlay_meters'] = shapely.length(\n", + " shapely.intersection(get_hazard_points.geometry.values, asset_geom))\n", + " # Interpolate fragility values based on hazard intensity\n", + " damage = np.sum(\n", + " (np.interp(get_hazard_points.band_data.values, hazard_intensity, fragility_values))\n", + " * get_hazard_points.overlay_meters * maxdam_asset)\n", + " return asset[0], damage" ] }, { "cell_type": "markdown", "id": "622a243c-dd99-44c1-975c-7cb4eab99359", "metadata": { - "id": "og2Bkcv--g4M" + "id": "622a243c-dd99-44c1-975c-7cb4eab99359" }, "source": [ - "Now we need to make sure that the road data is the same coordinate system. " + "Now we need to make sure that the road data is the same coordinate system." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 81, "id": "484c68a5-90ae-4394-9e4f-4ed5ba0c665d", "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "NvtDuspN-g4M", - "outputId": "8d920938-ab07-42f9-bb88-34483e751c3f" + "id": "484c68a5-90ae-4394-9e4f-4ed5ba0c665d" }, "outputs": [], "source": [ @@ -2911,7 +3169,7 @@ "cell_type": "markdown", "id": "efebb735-7955-4a75-bedf-1b213067fe20", "metadata": { - "id": "4JT25WTv-g4M" + "id": "efebb735-7955-4a75-bedf-1b213067fe20" }, "source": [ "And we can now overlay the roads with the flood data" @@ -2919,10 +3177,10 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 82, "id": "60de298f-9e06-40c3-b3a2-eecf2aa7205d", "metadata": { - "id": "8rtBYbX_-g4M" + "id": "60de298f-9e06-40c3-b3a2-eecf2aa7205d" }, "outputs": [], "source": [ @@ -2933,7 +3191,7 @@ "cell_type": "markdown", "id": "53aeaec5-4ea3-48a5-93b5-109a1578c77e", "metadata": { - "id": "s82DyD_y-g4M" + "id": "53aeaec5-4ea3-48a5-93b5-109a1578c77e" }, "source": [ "And estimate the damages" @@ -2947,8 +3205,8 @@ "colab": { "base_uri": "https://localhost:8080/" }, - "id": "LGqPFklh-g4N", - "outputId": "207937c9-dcc5-41a5-ebc4-76aa03003022" + "id": "daa56503-90e8-4b7f-a5dc-82a4b235e95b", + "outputId": "059ff95d-6e35-4a68-ebcf-31ee13910468" }, "outputs": [], "source": [ @@ -2956,7 +3214,7 @@ "for asset in tqdm(overlay_roads.groupby('asset'),total=len(overlay_roads.asset.unique()),\n", " desc='polyline damage calculation for'):\n", " collect_output.append(get_damage_per_asset(asset,flood_map_vector,roads))\n", - " \n", + "\n", "damaged_roads = roads.merge(pd.DataFrame(collect_output,columns=['index','damage']),\n", " left_index=True,right_on='index')[['highway','geometry','damage']]" ] @@ -2965,11 +3223,11 @@ "cell_type": "markdown", "id": "580663ca-b83f-4724-a699-b6a4790678ad", "metadata": { - "id": "RFGZxWl7i7pQ" + "id": "580663ca-b83f-4724-a699-b6a4790678ad" }, "source": [ "
\n", - "Question 18: Describe the various steps we have taken to perform the damage assessment on the road network. How is this approach different compared to the raster-based approach? Highlight the differences you find most important. Include any line of code you may want to include to make your story clear.\n", + "Question 15: Describe the various steps we have taken to perform the damage assessment on the road network. How is this approach different compared to the raster-based approach? Highlight the differences you find most important. Include any line of code you may want to include to make your story clear.\n", "
" ] }, @@ -2977,7 +3235,7 @@ "cell_type": "markdown", "id": "2e42c7f3-c868-400c-858e-7ac0c848fd4c", "metadata": { - "id": "B5jpsbyC-g4N" + "id": "2e42c7f3-c868-400c-858e-7ac0c848fd4c" }, "source": [ "And let's plot the results" @@ -2990,40 +3248,33 @@ "metadata": { "colab": { "base_uri": "https://localhost:8080/", - "height": 514 + "height": 864 }, - "id": "n25j-3wG-g4N", - "outputId": "b926a8e7-7e51-4434-f3b8-d61e6278bc24" + "id": "ef910b4e-201e-444b-92b6-826be82a5164", + "outputId": "eead7d6c-01ea-4851-d8d0-b756fea0798e" }, "outputs": [], "source": [ "fig, ax = plt.subplots(1, 1,figsize=(12,10))\n", "\n", - "damaged_roads.plot(column='damage',cmap='Reds',ax=ax);" - ] - }, - { - "cell_type": "markdown", - "id": "49d5033f-ac25-4ae1-9991-ca0899c1b8d4", - "metadata": { - "id": "bTfmvwW2jchB" - }, - "source": [ - "
\n", - "Question 19: Describe the most severely damaged parts of the road network. Use Google Maps to identify these roads. Are you surprised by the results?\n", - "
" + "damaged_roads.plot(column='damage',cmap='Reds',ax=ax)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 84, "id": "fe92fb12-9049-4e15-8992-b3d0cbd459b5", - "metadata": {}, + "metadata": { + "id": "fe92fb12-9049-4e15-8992-b3d0cbd459b5" + }, "outputs": [], "source": [] } ], "metadata": { + "colab": { + "provenance": [] + }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", @@ -3039,7 +3290,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.3" + "version": "3.11.9" } }, "nbformat": 4, diff --git a/TAA2/tutorial1.ipynb b/TAA2/tutorial1.ipynb deleted file mode 100644 index 071cda0..0000000 --- a/TAA2/tutorial1.ipynb +++ /dev/null @@ -1,1913 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "jTmaE4gi47C9" - }, - "source": [ - "# Tutorial 1: Working with OpenStreetMap\n", - "\n", - "Within this tutorial, we will explore the power of OpenStreetMap. We will learn how to extract information from OpenStreetMap, how you can explore and visualize this, and how to use it for some basic analysis.\n", - "\n", - "### Important before we start\n", - "---\n", - "Make sure that you save this file before you continue, else you will lose everything. To do so, go to **Bestand/File** and click on **Een kopie opslaan in Drive/Save a Copy on Drive**!\n", - "\n", - "Now, rename the file into Week5_Tutorial1.ipynb. You can do so by clicking on the name in the top of this screen." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "KqMg54GZ47DB", - "tags": [] - }, - "source": [ - "## Learning Objectives\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "JC0K9vub47DC" - }, - "source": [ - "- To understand the use of **OSMnx** to extract geospatial data from OpenStreetmap.\n", - "- To know how to rasterize vector data through using **Geocube**.\n", - "- To know how to visualise vector and raster data.\n", - "- To understand the basic functioning of **Matplotlib** to create a map.\n", - "- To know how one can generate routes between two points using **NetworkX**.\n", - "- To visualize networks on an interactive map." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "W6efV5lD47DC" - }, - "source": [ - "

Tutorial Outline

\n", - "
\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "xVGN7_hz47DD", - "tags": [] - }, - "source": [ - "## 1.Introducing the packages\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "mr4J-7kq47DD" - }, - "source": [ - "Within this tutorial, we are going to make use of the following packages: \n", - "\n", - "[**GeoPandas**](https://geopandas.org/) is a Python package that extends the datatypes used by pandas to allow spatial operations on geometric types.\n", - "\n", - "[**OSMnx**](https://osmnx.readthedocs.io/) is a Python package that lets you download geospatial data from OpenStreetMap and model, project, visualize, and analyze real-world street networks and any other geospatial geometries. You can download and model walkable, drivable, or bikeable urban networks with a single line of Python code then easily analyze and visualize them. You can just as easily download and work with other infrastructure types, amenities/points of interest, building footprints, elevation data, street bearings/orientations, and speed/travel time.\n", - "\n", - "[**NetworkX**](https://networkx.org/) is a Python package for the creation, manipulation, and study of the structure, dynamics, and functions of complex networks.\n", - "\n", - "[**Matplotlib**](https://matplotlib.org/) is a comprehensive Python package for creating static, animated, and interactive visualizations in Python. Matplotlib makes easy things easy and hard things possible.\n", - "\n", - "[**Geocube**](https://corteva.github.io/geocube) is a Python package to convert geopandas vector data into rasterized data.\n", - "\n", - "[**xarray**](https://docs.xarray.dev/) is a Python package that allows for easy and efficient use of multi-dimensional arrays.\n", - "\n", - "*We will first need to install these packages in the cell below. Uncomment them to make sure we can pip install them*" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 31325, - "status": "ok", - "timestamp": 1675086280074, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "VD7sW5hx47DE", - "outputId": "36a15ed9-7936-4f89-9284-6562c265d75c" - }, - "outputs": [], - "source": [ - "!pip install osmnx\n", - "!pip install geocube\n", - "!pip install contextily" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "eVsADIc847DG" - }, - "source": [ - "Now we will import these packages in the cell below:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "executionInfo": { - "elapsed": 3237, - "status": "ok", - "timestamp": 1675086283294, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "EJeE3bc047DG" - }, - "outputs": [], - "source": [ - "import warnings\n", - "warnings.filterwarnings('ignore') \n", - "\n", - "import osmnx as ox\n", - "import numpy as np\n", - "import networkx as nx\n", - "import contextily as cx\n", - "import matplotlib\n", - "import geopandas as gpd\n", - "\n", - "from matplotlib.colors import LinearSegmentedColormap,ListedColormap\n", - "from matplotlib.patches import Patch\n", - "import matplotlib.pyplot as plt\n", - "from geocube.api.core import make_geocube\n", - "from urllib import request\n", - "\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "YPgVj6al47DH" - }, - "source": [ - "## 2. Extract and visualize land-use information from OpenStreetMap\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Uhh94J5Z47DI" - }, - "source": [ - "The first step is to define which area you want to focus on. In the cell below, you will now read \"Zoeterwoude, The Netherlands\". Change this to any area or municipality in the Netherlands that (1) you can think of and (2) will work. \n", - "\n", - "In some cases, the function does not recognize the location. You could either try a different phrasing or try a different location. Many parts of the Netherlands should work." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "executionInfo": { - "elapsed": 1398, - "status": "ok", - "timestamp": 1675086381517, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "9cijX5J047DI" - }, - "outputs": [], - "source": [ - "place_name = \"Zoeterwoude, The Netherlands\"\n", - "area = ox.geocode_to_gdf(place_name)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "kX3feV7O47DJ" - }, - "source": [ - "Now let us visualize the bounding box of the area. As you will notice, we also estimate the size of the area. If the area size is above 50km2, or when you have many elements within your area (for example the amsterdam city centre), extracting the data from OpenStreetMap may take a little while. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 608 - }, - "executionInfo": { - "elapsed": 5155, - "status": "ok", - "timestamp": 1675086404602, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "JFBsptnt47DJ", - "outputId": "3a628a04-9ade-43dd-f684-efae51795dc5", - "tags": [] - }, - "outputs": [], - "source": [ - "area_to_check = area.to_crs(epsg=3857)\n", - "ax = area_to_check.plot(figsize=(10, 10), color=\"none\", edgecolor=\"k\", linewidth=4)\n", - "ax.set_xticks([])\n", - "ax.set_yticks([])\n", - "ax.set_axis_off()\n", - "cx.add_basemap(ax, zoom=11)\n", - "\n", - "size = int(area_to_check.area/1e6)\n", - "\n", - "ax.set_title(\"{}. Total area: {} km2\".format(place_name,size),fontweight='bold')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "pT5odIz-6fki" - }, - "source": [ - "
\n", - "Question 1: To make sure we understand which area you focus on, please submit the figure that outlines your area.\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "6zbwxAev47DL" - }, - "source": [ - "Now we are satisfied with the selected area, we are going to extract the land-use information from OpenStreetMap. To find the right information from OpenStreetMap, we use **tags**.\n", - "\n", - "As you will see in the cell below, we use the tags *\"landuse\"* and *\"natural\"*. We need to use the *\"natural\"* tag to ensure we also obtain water bodies and other natural elements. " - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": { - "executionInfo": { - "elapsed": 104940, - "status": "ok", - "timestamp": 1675086538272, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "pWxGFjgN47DL" - }, - "outputs": [], - "source": [ - "tags = {'landuse': True, 'natural': True} \n", - "landuse = ox.features_from_place(place_name, tags)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In case the above does not work, you can continue the assignment by using the code below (make sure you remove the hashtags to run it). If you decide to use the data as specified below, also change the map at the start to 'Kampen'." - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [], - "source": [ - "# remote_url = 'https://github.com/ElcoK/BigData_AED/raw/main/week5/kampen_landuse.gpkg'\n", - "# file = 'kampen_landuse.gpkg'\n", - "\n", - "# request.urlretrieve(remote_url, file)\n", - "#landuse = gpd.GeoDataFrame.from_file('kampen_landuse.gpkg')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "brNqZmi547DM" - }, - "source": [ - "To ensure we really only get the area that we want, we use geopandas's `clip` function to only keep the area we want. This function does exactly the same as the `clip` function in QGIS." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Anrn7wiL47DM" - }, - "source": [ - "When we want to visualize or analyse the data, we want all information in a single column. However, at the moment, all information that was tagged as *\"natural\"*, has no information stored in the *\"landuse\"* tags. It is, however, very convenient if we can just use a single column for further exploration of the data. \n", - "\n", - "To overcome this issue, we need to add the missing information to the landuse column, as done below. Let's first have a look which categories we have in the **natural** column. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "landuse.natural.unique()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And now we can add them to the **landuse** column. We made a start, but its up to you to fill in the rest." - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": { - "executionInfo": { - "elapsed": 429, - "status": "ok", - "timestamp": 1675086633493, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "nlyHmEzg47DM" - }, - "outputs": [], - "source": [ - "landuse.loc[landuse.natural=='water','landuse'] = 'water'\n", - "landuse.loc[landuse.natural=='wetland','landuse'] = 'wetlands'\n", - "\n", - "\n", - "landuse = landuse.dropna(subset=['landuse'])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "FOhhcbFs8Nsz" - }, - "source": [ - "
\n", - "Question 2: Please provide in the answer box in Canvas the code that you used to make sure that all land uses are now registered within the landuse column.\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Ii4rjR3q47DN" - }, - "source": [ - "Our next step is to prepare the visualisation of a map. What better way to explore land-use information than plotting it on a map? \n", - "\n", - "As you will see below, we can create a dictionary with color codes that will color each land-use class based on the color code provided in this dictionary." - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": { - "executionInfo": { - "elapsed": 864, - "status": "ok", - "timestamp": 1675086777083, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "urAI5MAG47DN" - }, - "outputs": [], - "source": [ - "color_dict = { \"grass\":'#c3eead', \"railway\": \"#000000\",\n", - " \"forest\":'#1c7426', \"orchard\":'#fe6729',\n", - " \"residential\":'#f13013', \"industrial\":'#0f045c',\n", - " \"retail\":'#b71456', \"education\":'#d61181', \n", - " \"commercial\":'#981cb8', \"farmland\":'#fcfcb9',\n", - " \"cemetery\":'#c39797', \"construction\":'#c0c0c0',\n", - " \"meadow\":'#c3eead', \"farmyard\":'#fcfcb9',\n", - " \"plant_nursery\":'#eaffe2', \"scrub\":'#98574d',\n", - " \"allotments\":'#fbffe2', \"reservoir\":'#8af4f2',\n", - " \"static_caravan\":'#ff3a55', \"wetlands\": \"#c9f5e5\",\n", - " \"water\": \"#c9e5f5\", \"beach\": \"#ffeead\",\n", - " \"landfill\" : \"#B08C4D\", \"recreation_ground\" : \"#c3eead\",\n", - " \"brownfield\" : \"#B08C4D\", \"village_green\" : \"#f13013\" ,\n", - " \"military\": \"#52514E\", \"garden\" : '#c3eead'\n", - " } " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Daf-4BMa47DN" - }, - "source": [ - "Unfortunately, OpenSteetMap very often contains elements that have a unique tag. As such, it may be the case that some of our land-use categories are not in the dictionary yet. \n", - "\n", - "Let's first create an overview of the unique land-use categories within our data through using the `.unique()` function within our dataframe:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 221, - "status": "ok", - "timestamp": 1675086893656, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "h8t5a6_Z47DN", - "outputId": "9e17ba91-d0a4-4dcc-df05-8483f352a228" - }, - "outputs": [], - "source": [ - "landuse.landuse.unique()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "h0p7fYBd47DN" - }, - "source": [ - "Ofcourse we can visually compare the array above with our color_dict, but it is much quicker to use `Sets` to check if there is anything missing:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 248, - "status": "ok", - "timestamp": 1675086896661, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "UZaHsgNq47DO", - "outputId": "8a7f6f9e-8bde-4c5c-8012-6ed7f8b071ed" - }, - "outputs": [], - "source": [ - "set(landuse.landuse.unique())-set(color_dict)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "EtMHGvQk47DO" - }, - "source": [ - "In case anything is missing, add them to the color_dict dictionairy and re-run that cell. \n", - "\n", - "
\n", - "Question 3: Show us in Canvas (i) which land-use categories you had to add, and (ii) how your final color dictionary looks like.\n", - "
\n", - "\n", - "```{tip}\n", - "You can easily find hexcodes online to find the right colour for each land-use category. Just google hexcodes!\n", - "```\n", - "\n", - "\n", - "Our next step is to make sure that we can connect our color codes to our dataframe with land-use categories." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "executionInfo": { - "elapsed": 208, - "status": "ok", - "timestamp": 1675086997214, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "Fkkqz3Px47DO" - }, - "outputs": [], - "source": [ - "color_dict = {key: color_dict[key]\n", - " for key in color_dict if key not in list(set(color_dict)-set(landuse.landuse.unique()))}\n", - "\n", - "map_dict = dict(zip(color_dict.keys(),[x for x in range(len(color_dict))]))\n", - "\n", - "landuse['col_landuse'] = landuse.landuse.apply(lambda x: color_dict[x])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "NxWuztp347DO" - }, - "source": [ - "Now we can plot the figure!\n", - "\n", - "As you will see in the cell below, we first state that we want to create a figure with a specific figure size. You can change the dimensions to your liking." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 608 - }, - "executionInfo": { - "elapsed": 1825, - "status": "ok", - "timestamp": 1675087046285, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "NH6j-qJ147DO", - "outputId": "23c77638-0509-4bb3-dc19-904f586b2a70" - }, - "outputs": [], - "source": [ - "fig, ax = plt.subplots(1, 1,figsize=(12,10))\n", - "\n", - "# add color scheme\n", - "color_scheme_map = list(color_dict.values())\n", - "cmap = LinearSegmentedColormap.from_list(name='landuse',\n", - " colors=color_scheme_map) \n", - "\n", - "# and plot the land-use map.\n", - "landuse.plot(color=landuse['col_landuse'],ax=ax,linewidth=0)\n", - "\n", - "# remove the ax labels\n", - "ax.set_xticks([])\n", - "ax.set_yticks([])\n", - "ax.set_axis_off()\n", - "\n", - "# add a legend:\n", - "legend_elements = []\n", - "for iter_,item in enumerate(color_dict):\n", - " legend_elements.append(Patch(facecolor=color_scheme_map[iter_],label=item)) \n", - "\n", - "ax.legend(handles=legend_elements,edgecolor='black',facecolor='#fefdfd',prop={'size':12},loc=(1.02,0.2)) \n", - "\n", - "# add a title\n", - "ax.set_title(place_name,fontweight='bold')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "EGwHPQEL9_hD" - }, - "source": [ - "
\n", - "Question 4: Please upload a figure of your land-use map, using OpenStreetMap. \n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "EzQP70Om47DO" - }, - "source": [ - "## 3. Rasterize land-use information\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "4w-Py4fw47DP" - }, - "source": [ - "As you have noticed already during the lecture, and as we will again see next week when using the Google Earth Engine, most land-use data is in raster format. \n", - "\n", - "In OpenStreetMap everything is stored in vector format. As such, the land-use information we extracted from OpenStreetMap is also in vector format. While it is not always necessary to have this information in raster format, it is useful to know how to convert your data into a raster format.\n", - "\n", - "To do so, we can make use of the **GeoCube** package, which is a newly developed Python package that can very easily convert vector data into a raster format." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "PXETqUIN47DP" - }, - "source": [ - "The first thing we will need to do is to define all the unique land-use classes and store them in a dictionary:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "executionInfo": { - "elapsed": 290, - "status": "ok", - "timestamp": 1675087253309, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "4st7ApDp47DP" - }, - "outputs": [], - "source": [ - "categorical_enums = {'landuse': landuse.landuse.drop_duplicates().values.tolist()\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "4_qzExh447DP" - }, - "source": [ - "And now we simply use the `make_geocube()` function to convert our vector data into raster data. \n", - "\n", - "In the `make_geocube()` function, we have to specify several arguments:\n", - "\n", - "- Through the `vector_data` argument we have to state which dataframe we want to rasterize.\n", - "- Through the `output_crs` argument we have to state the coordinate reference system (CRS). We use the OpenStreetMap default EPSG:4326.\n", - "- Through the `resolution` argument we have to state the resolution. In our case, we will have to set this in degrees. 0.01 degrees is equivalent to roughly 10km around the equator. \n", - "- Through the `categorical_enums` argument we specify the different land-use categories.\n", - "\n", - "Play around with the different resolutions to find the level of detail. The higher the resolution (i.e., the more zeros behind the comma), the longer it will take to rasterize." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "executionInfo": { - "elapsed": 551, - "status": "ok", - "timestamp": 1675087257707, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "wjGoNrwg47DP", - "tags": [] - }, - "outputs": [], - "source": [ - "landuse_grid = make_geocube(\n", - " vector_data=XXXX,\n", - " output_crs=\"epsg:4326\",\n", - " resolution=(-XXXX, XXXX),\n", - " categorical_enums=categorical_enums\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "wx4FAAsg47DP" - }, - "source": [ - "Let's explore what this function has given us:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 389 - }, - "executionInfo": { - "elapsed": 429, - "status": "ok", - "timestamp": 1675087480922, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "JqdlWZUe47DQ", - "outputId": "8880c112-9200-4613-ef45-01e8b88c0bde" - }, - "outputs": [], - "source": [ - "landuse_grid[\"landuse\"]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "UB4gbheF47DQ" - }, - "source": [ - "The output above is a typical output of the **xarray** package. \n", - "\n", - "- The `array` shows the numpy array with the actual values. As you can see, the rasterization process has used the value `-1` for NoData. \n", - "- The `Coordinates` table shows the x (longitude) and y (latitude) coordinates of the array. It has the exact same size as the `array` with land-use values.\n", - "- The `Attributes` table specifies the NoData value (the `_FillValue` element, which indeed shows `-1`) and the name of the dataset.\n", - "\n", - "Now let's plot the data to see the result!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 608 - }, - "executionInfo": { - "elapsed": 1852, - "status": "ok", - "timestamp": 1675087494788, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "extRLk1W47DQ", - "outputId": "19fe91a4-5785-494e-a370-9408a563a70a" - }, - "outputs": [], - "source": [ - "fig, ax = plt.subplots(1, 1,figsize=(14,10))\n", - "\n", - "landuse_grid[\"landuse\"].plot(ax=ax,vmin=0,vmax=15,levels=15,cmap='tab20')\n", - "\n", - "# remove the ax labels\n", - "ax.set_xticks([])\n", - "ax.set_yticks([])\n", - "ax.set_axis_off()\n", - "\n", - "#add a title\n", - "\n", - "ax.set_title('')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "94GLYG5K47DQ" - }, - "source": [ - "As we can see in the figure above, the land-use categories have turned into numbers, instead of land-use categories described by a string value. \n", - "\n", - "This is of course a lot harder to interpret. Let's re-do some parts to make sure we can properly link them back to the original data.\n", - "\n", - "To do so, we will first need to make sure that we know which values (numbers) are connected to each land-use category. Instead of trying to match, let's predefine this ourselves!\n", - "\n", - "We will start with creating a dictionary that allows us to couple a number to each category:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "executionInfo": { - "elapsed": 209, - "status": "ok", - "timestamp": 1675087654241, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "iSHZ4nq247DQ" - }, - "outputs": [], - "source": [ - "value_dict = dict(zip(landuse.landuse.unique(),np.arange(0,len(landuse.landuse.unique()),1)))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "executionInfo": { - "elapsed": 2, - "status": "ok", - "timestamp": 1675087655102, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "ZCng7Xyk47DQ" - }, - "outputs": [], - "source": [ - "value_dict['nodata'] = -1" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "zv1-QoKv47DR" - }, - "source": [ - "And we now use this dictionary to add a new column to the dataframe with the values:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "executionInfo": { - "elapsed": 904, - "status": "ok", - "timestamp": 1675087658329, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "9c2byjZn47DR" - }, - "outputs": [], - "source": [ - "landuse['landuse_value'] = landuse.landuse.apply(lambda x: value_dict[x])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "FP4pzj2A47DR" - }, - "source": [ - "Now let us use the `make_geocube()` function again to rasterize." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "executionInfo": { - "elapsed": 1101, - "status": "ok", - "timestamp": 1675087662054, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "Z-1RmkFC47DR" - }, - "outputs": [], - "source": [ - "landuse_valued = make_geocube(\n", - " vector_data=XXXX,\n", - " output_crs=XXXX,\n", - " resolution=(-XXXX, XXXX),\n", - " categorical_enums={'landuse_value': landuse.landuse_value.drop_duplicates().values.tolist()\n", - "}\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "V0-NKtL147DR" - }, - "source": [ - "And let's use the original `color_dict` dictionary to find the right hex codes for each of the land-use categories" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "executionInfo": { - "elapsed": 227, - "status": "ok", - "timestamp": 1675087671651, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "4FKdnZ4V47DR" - }, - "outputs": [], - "source": [ - "unique_classes = landuse.landuse.drop_duplicates().values.tolist()\n", - "colormap_raster = [color_dict[lu_class] for lu_class in unique_classes] " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "be1TcNAK47DR" - }, - "source": [ - "To plot the new result:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 608 - }, - "executionInfo": { - "elapsed": 1116, - "status": "ok", - "timestamp": 1675087675785, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "qBo9kmWy47DR", - "outputId": "269fe715-c71f-4f82-ca71-021b67a3ccf7" - }, - "outputs": [], - "source": [ - "fig, ax = plt.subplots(1, 1,figsize=(14,10))\n", - "\n", - "landuse_valued[\"landuse_value\"].plot(ax=ax,vmin=0,vmax=19,levels=len(unique_classes),colors=colormap_raster)\n", - "\n", - "# remove the ax labels\n", - "ax.set_xticks([])\n", - "ax.set_yticks([])\n", - "ax.set_axis_off()\n", - "\n", - "# add title\n", - "ax.set_title('')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "cO2YPNMU-9hQ" - }, - "source": [ - "
\n", - "Question 5: In the rasterization process, we use the `.make_geocube()` function. Please elaborate on the following: i)why is it important to specify the right coordinate system? What could happen if you choose the wrong coordinate system? ii) which resolution did you choose and why? iii)Why did the first result did not give us the right output with the correct colors? How did you solve this? \n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "dx5ZK8Vm47DS" - }, - "source": [ - "But to be honest, this legend is still not entirely what we are looking for. So let's do some Python magic to get a legend like we desire when plotting a land-use map" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "executionInfo": { - "elapsed": 242, - "status": "ok", - "timestamp": 1675087680453, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "plSLRJp947DS" - }, - "outputs": [], - "source": [ - "unique_classes = landuse.landuse.drop_duplicates().values.tolist()\n", - "colormap_raster = [color_dict[lu_class] for lu_class in unique_classes] \n", - "color_dict_raster = dict(zip(np.arange(-1,len(landuse.landuse.unique())+1,1),['#ffffff']+colormap_raster))\n", - "\n", - "# We create a colormar from our list of colors\n", - "cm = ListedColormap([color_dict_raster[x] for x in color_dict_raster.keys()])\n", - "\n", - "# Let's also define the description of each category. Order should be respected here!\n", - "labels = np.array(['nodata'] + unique_classes)\n", - "len_lab = len(labels)\n", - "\n", - "# prepare normalizer\n", - "## Prepare bins for the normalizer\n", - "norm_bins = np.sort([*color_dict_raster.keys()]) + 0.5\n", - "norm_bins = np.insert(norm_bins, 0, np.min(norm_bins) - 1.0)\n", - "\n", - "## Make normalizer and formatter\n", - "norm = matplotlib.colors.BoundaryNorm(norm_bins, len_lab, clip=True)\n", - "fmt = matplotlib.ticker.FuncFormatter(lambda x, pos: labels[norm(x)])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "MRsijBkf47DS" - }, - "source": [ - "Let's plot the map again!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 591 - }, - "executionInfo": { - "elapsed": 1663, - "status": "ok", - "timestamp": 1675087684895, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "odFEVMUc47DS", - "outputId": "31905199-3798-4cf3-b4c6-effb7dacff10" - }, - "outputs": [], - "source": [ - "fig, ax = plt.subplots(1, 1,figsize=(14,10))\n", - "\n", - "ax = landuse_valued[\"landuse_value\"].plot(levels=len(unique_classes), cmap=cm, norm=norm)\n", - "\n", - "# remove the ax labels\n", - "diff = norm_bins[1:] - norm_bins[:-1]\n", - "tickz = norm_bins[:-1] + diff / 2\n", - "cb = fig.colorbar(ax, format=fmt, ticks=tickz)\n", - "\n", - "# set title again\n", - "fig.axes[0].set_title('')\n", - "\n", - "fig.axes[0].set_xticks([])\n", - "fig.axes[0].set_yticks([])\n", - "fig.axes[0].set_axis_off()\n", - "\n", - "# for some weird reason we get two colorbars, so we remove one:\n", - "fig.delaxes(fig.axes[1])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "u9yzw5hE47DS" - }, - "source": [ - "## 4. Extracting buildings from OpenStreetMap\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "WMOSa6JF47DS" - }, - "source": [ - "There is a lot more data to extract from OpenStreetMap besides land-use information. Let's extract some building data. To do so, we use the *\"building\"* tag." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "executionInfo": { - "elapsed": 119709, - "status": "ok", - "timestamp": 1675087861528, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "B6EiF_dN47DS" - }, - "outputs": [], - "source": [ - "tags = {\"building\": True}\n", - "buildings = ox.features_from_place(place_name, tags)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In case the above does not work, you can continue the assignment by using the code below (make sure you remove the hashtags to run it). If you decide to use the data as specified below, also change the map at the start to 'Kampen'." - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [], - "source": [ - "# remote_url = 'https://github.com/ElcoK/BigData_AED/raw/main/week5/kampen_buildings.gpkg'\n", - "# file = 'kampen_buildings.gpkg'\n", - "# \n", - "# #request.urlretrieve(remote_url, file)\n", - "# buildings = gpd.GeoDataFrame.from_file('kampen_buildings.gpkg')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "bon7osXA47DT" - }, - "source": [ - "Now let's see what information is actually extracted:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 765 - }, - "executionInfo": { - "elapsed": 37, - "status": "ok", - "timestamp": 1675087861529, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "6HdghuMv47DT", - "outputId": "dbec25d2-8c62-4420-f125-b1a4ac80c318" - }, - "outputs": [], - "source": [ - "buildings.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "p8dhZx1n47DT" - }, - "source": [ - "As you notice in the output of the cell above, there are many columns which just contain \"NaN\". And there even seem to be to many columns to even visualize properly in one view.\n", - "\n", - "Let's check what information is collected for the different buildings:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 35, - "status": "ok", - "timestamp": 1675087861529, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "W3ZpsIkO47DT", - "outputId": "385616f8-25fe-4675-f5f0-16d7fa9b0df7" - }, - "outputs": [], - "source": [ - "buildings.columns" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "sH7NTKENA4WO" - }, - "source": [ - "
\n", - "Question 6: Let's have a look at the extracted building information. Please describe in your own words the information it contains. Is there specific information that suprises you to see, and do you think anything is missing that you expected? \n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "8OHDhc-047DT" - }, - "source": [ - "## 5. Analyze and visualize building stock\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Z37JRRc747DT" - }, - "source": [ - "One interesting column is called `start_date`. This shows the building year per building. \n", - "\n", - "Let's explore this year of building a bit more.\n", - "\n", - "First, it would be interesting to get an idea how many buildings are build in each year through using the `value_counts()` function. Normally, that functions ranks the values in descending order (high to low). We are more interested in how this has developed over time. So we use the `sort_index()` function to sort the values by year. Add these two functions in the cell below." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "executionInfo": { - "elapsed": 924, - "status": "ok", - "timestamp": 1675087884735, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "lNSe826i47DT" - }, - "outputs": [], - "source": [ - "building_year = buildings.start_date. XXXX" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "X6b_T5xs47DU" - }, - "source": [ - "There is not better way to further explore this years than through plotting it. Don't forget to add things such as a x label, y label and title. Have a look at some of the matplotlib [tutorials](https://matplotlib.org/stable/tutorials/introductory/quick_start.html). Note that you need to look at the code that also uses subplots and where they use the `ax` option." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "executionInfo": { - "elapsed": 1636, - "status": "ok", - "timestamp": 1675087889714, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "fmk6m78I47DU", - "outputId": "78f3ea6a-284d-495f-b596-12db32305128" - }, - "outputs": [], - "source": [ - "fig,ax = plt.subplots(1,1,figsize=(5,18))\n", - "\n", - "building_year.plot(kind='barh',ax=ax)\n", - "\n", - "ax.tick_params(axis='y', which='major', labelsize=7)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "AwRyhvNeBn0G" - }, - "source": [ - "
\n", - "Question 7: Please upload a figure that shows the development of building stock over the years in your region of interest. Make sure it contains all the necessary elements (labels on the axis, title, etc.)\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "wrcM1p-m47DU" - }, - "source": [ - "What we also noticed is that quite some buildings are identified as 'yes'. This is not very useful as it does not really say much about the use of the building. \n", - "\n", - "Let's see for how many buildings this is the case: " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 205, - "status": "ok", - "timestamp": 1675087945407, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "_4eKR2Bo47DU", - "outputId": "54e29c44-9717-4eee-984f-9555659317be" - }, - "outputs": [], - "source": [ - "buildings.building.value_counts()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As you have seen from the `value_counts` function, there are quite a few buildings with only very few tags. You could either consider to not include them in your plot at all (for example by using the `isin` function or the `query` function, see also [here](https://stackoverflow.com/questions/12096252/use-a-list-of-values-to-select-rows-from-a-pandas-dataframe)), or rename them, similar to how you named the natural land cover classes for the land-use map. " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "vF6WJ9_k47DU" - }, - "source": [ - "Now let's visualize the buildings again. We need to create a similar color dictionary as we did for the land-use categories. Now its up to you to make it!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "executionInfo": { - "elapsed": 226, - "status": "ok", - "timestamp": 1675087956546, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "RYRxKXxd47DU" - }, - "outputs": [], - "source": [ - "color_dict = { 'yes' : \"#f1134b\", \n", - " 'house':'#f13013', \n", - " 'industrial':'#0f045c',\n", - " 'farm':'#fcfcb9', \n", - " 'bungalow':'#f13013',\n", - " 'service':'#CB8DDB' }" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "executionInfo": { - "elapsed": 232, - "status": "ok", - "timestamp": 1675087958726, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "YjRwC-K-47DU" - }, - "outputs": [], - "source": [ - "# Remove multiple keys from dictionary\n", - "color_dict = {key: color_dict[key]\n", - " for key in color_dict if key not in list(set(color_dict)-set(buildings.building.unique()))}\n", - "\n", - "map_dict = dict(zip(color_dict.keys(),[x for x in range(len(color_dict))]))\n", - "buildings['col_landuse'] =buildings.building.apply(lambda x: color_dict[x])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "wGh7rbnB47DU" - }, - "source": [ - "And plot the figure in the same manner!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 616 - }, - "executionInfo": { - "elapsed": 3651, - "status": "ok", - "timestamp": 1675087966347, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "oDfamvIV47DV", - "outputId": "dbcee552-e955-4d2b-ddda-909ab4265105" - }, - "outputs": [], - "source": [ - "fig, ax = plt.subplots(1, 1,figsize=(12,10))\n", - "\n", - "# add color scheme\n", - "color_scheme_map = list(color_dict.values())\n", - "cmap = LinearSegmentedColormap.from_list(name='landuse',\n", - " colors=color_scheme_map) \n", - "\n", - "# and plot the land-use map.\n", - "buildings.plot(color=buildings['col_landuse'],ax=ax,linewidth=0)\n", - "\n", - "# remove the ax labels\n", - "ax.set_xticks([])\n", - "ax.set_yticks([])\n", - "ax.set_axis_off()\n", - "\n", - "# add a legend:\n", - "legend_elements = []\n", - "for iter_,item in enumerate(color_dict):\n", - " legend_elements.append(Patch(facecolor=color_scheme_map[iter_],label=item)) \n", - "\n", - "ax.legend(handles=legend_elements,edgecolor='black',facecolor='#fefdfd',prop={'size':12},loc=(1.02,0.2)) \n", - "\n", - "# add a title\n", - "ax.set_title(place_name,fontweight='bold')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "IJalDDJvB6Yd" - }, - "source": [ - "
\n", - "Question 8: Please upload a figure of your building stock map of your region of interest. Make sure that the interpretation is clear. If necessary, merge multiple categories into one (i.e., when some categories only contain 1 or 2 buildings).\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "3NeIaiLO47DV" - }, - "source": [ - "## 6. Extracting roads from OpenStreetMap\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "HpWnKfIk47DV" - }, - "source": [ - "Let's continue (and end) this tutorial with the core data in OpenStreetMap (it is even in the name): roads!\n", - "\n", - "Now, instead of using tags, we want to identify what type of roads we would like to extract. Let's first only extract roads that can be used to drive.\n", - "\n", - "The `graph_from_place()` function returns a `NetworkX` Graph element. You can read more about these graph elements in the introduction page of [NetworkX](https://networkx.org/documentation/stable/reference/introduction.html)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "executionInfo": { - "elapsed": 13403, - "status": "ok", - "timestamp": 1675088179196, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "MpjxUadp47DV" - }, - "outputs": [], - "source": [ - "G = ox.graph_from_place(place_name, network_type=\"drive\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "NA_HAmHx47DV" - }, - "source": [ - "Unfortunately, it is bit difficult to easily view all the roads within such a Graph element. To be able to explore the data, we are going to convert it to a `Geopandas GeoDataFrame`, using the `to_pandas_edgelist()` function." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 15, - "status": "ok", - "timestamp": 1675088179197, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "4dMXZb_v47DV", - "outputId": "e615d5f8-6b96-4a32-f114-ce38b1481b70" - }, - "outputs": [], - "source": [ - "roads = gpd.GeoDataFrame(nx.to_pandas_edgelist(G))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "yds5NBlF47DV" - }, - "source": [ - "In some cases, roads are classified with more than one category. If that is the case, they are captured within a `list`. To overcome this issue, we specify that we want the entire `highway` column as a `string` dtype." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "executionInfo": { - "elapsed": 294, - "status": "ok", - "timestamp": 1675088191403, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "NxTg1jb847DV" - }, - "outputs": [], - "source": [ - "roads.highway = roads.highway.astype('str')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "rbzl5JPR47DW" - }, - "source": [ - "Now we can create a plot to see how the road network is configured." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 575 - }, - "executionInfo": { - "elapsed": 888, - "status": "ok", - "timestamp": 1675088196301, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "uyo3Ggpc47DW", - "outputId": "e58c915a-b085-498c-e7ea-8d62f237d417" - }, - "outputs": [], - "source": [ - "fig, ax = plt.subplots(1, 1,figsize=(12,10))\n", - "\n", - "\n", - "roads.plot(column='highway',legend=True,ax=ax,legend_kwds={'loc': 'lower right'});\n", - "\n", - "\n", - "# remove the ax labels\n", - "ax.set_xticks([])\n", - "ax.set_yticks([])\n", - "ax.set_axis_off()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "M18fuTWM47DW", - "tags": [] - }, - "source": [ - "It would also be interesting to explore the network a little but more interactively. **OSMnx** has a function called `plot_graph_folium()`, which allow us to use the [folium](https://python-visualization.github.io/folium/quickstart.html#Getting-Started) package to plot data interactively on a map. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 866 - }, - "executionInfo": { - "elapsed": 1720, - "status": "ok", - "timestamp": 1675088204394, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "lpWHR0Ez47DW", - "outputId": "38be3bea-b399-4e8f-a081-210baa559ef7" - }, - "outputs": [], - "source": [ - "m1 = ox.plot_graph_folium(G, popup_attribute=\"highway\", weight=2, color=\"#8b0000\")\n", - "m1" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "M6-fqL9L47DW", - "tags": [] - }, - "source": [ - "## 7. Plot Routes Using OpenStreetMap and Folium\n", - "
" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": { - "id": "gm8NIAR947DW" - }, - "source": [ - "One of the exiting things we can do with this data is that we can compute and plot routes between two points on a map.\n", - "\n", - "Let's first select two random start and end points from the graph and compute the shortest route between them through using the `shortest_path()` function of the `NetworkX` package.\n", - "\n", - "The function `ox.nearest_nodes()` looks for the nearest point in your network based on a `X` and `Y` coordinate. For example, in the code below, the origin node is based on the northwestern corner of your bounding box, whereas the destination node is based on the coordinates of the southeastern corner of your bounding box. \n", - "\n", - "So this can also be rewritten as:\n", - "\n", - "```\n", - "origin_node = ox.nearest_nodes(G,4.65465, 56.6778) \n", - "destination_node = ox.nearest_nodes(G,4.61055, 59.5487) \n", - "route = nx.shortest_path(G, origin_node, destination_node) \n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Zi_xhqXTCi3h" - }, - "source": [ - "
\n", - "Question 9: The last element of this tutorial is to play around with routing. Please explain in your own words what the .shortest_path() algorithm does. Include the term 'Dijkstra algorithm' in your answer.\n", - "
" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "executionInfo": { - "elapsed": 837, - "status": "ok", - "timestamp": 1675088236066, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "Dr7Ftbbh47DW" - }, - "outputs": [], - "source": [ - "origin_node = ox.nearest_nodes(G,area['bbox_west'].values[0], area['bbox_north'].values[0])\n", - "destination_node = ox.nearest_nodes(G,area['bbox_east'].values[0], area['bbox_south'].values[0])\n", - "route = nx.shortest_path(G, origin_node, destination_node)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "4UuCS8G247DW" - }, - "source": [ - "We can plot the route with folium. Like above, you can pass keyword args along to folium PolyLine to style the lines." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 866 - }, - "executionInfo": { - "elapsed": 240, - "status": "ok", - "timestamp": 1675088397348, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "7QrZ6Gpi47DX", - "outputId": "33fecead-a6d7-4090-99da-e09d0c34081a" - }, - "outputs": [], - "source": [ - "m2 = ox.plot_route_folium(G, route, weight=10)\n", - "m2" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "eedHqPli47DX" - }, - "source": [ - "Plot the route with folium on top of the previously created map\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 866 - }, - "executionInfo": { - "elapsed": 2518, - "status": "ok", - "timestamp": 1675088413924, - "user": { - "displayName": "RA Odongo", - "userId": "17326618845752559881" - }, - "user_tz": -60 - }, - "id": "aHzxZAbZ47DX", - "outputId": "01ee7d97-4792-41fb-925c-c44fb9b15a3f" - }, - "outputs": [], - "source": [ - "m3 = ox.plot_route_folium(G, route, route_map=m1, popup_attribute=\"name\", weight=7)\n", - "m3" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "Question 10: Please add one more routes on a map and upload the resulting figure here.\n", - "
" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "colab": { - "provenance": [ - { - "file_id": "https://github.com/ElcoK/BigData_AED/blob/main/week4/tutorial1.ipynb", - "timestamp": 1675085725524 - } - ] - }, - "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.11" - }, - "vscode": { - "interpreter": { - "hash": "f323064ae63d54ed8d769390a968e914fbf7abacffc63e116cd2e04a08ed2d24" - } - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/TAA2/tutorial2.ipynb b/TAA2/tutorial2.ipynb deleted file mode 100644 index 35384c5..0000000 --- a/TAA2/tutorial2.ipynb +++ /dev/null @@ -1,1846 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "s1nFKY6h-g35", - "tags": [] - }, - "source": [ - "# Tutorial 2: Natural Hazard Risk Assessment" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "F5jQ4EU--g38" - }, - "source": [ - "In the second tutorial of this week, we are going to use publicly available hazard data and exposure data to do a risk assessment for an area of choice within Europe. More specifically we will look at damage due to wind storms and flooding. \n", - "\n", - "We will use both Copernicus Land Cover data and OpenStreetMap to estimate the potential damage of natural hazards to the built environment. We will use Copernicus Land Cover data to estimate the damage to specific land-uses, whereas we will use OpenStreetMap to assess the potential damage to the road system." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "K66fASIyP--9" - }, - "source": [ - "### Important before we start\n", - "---\n", - "Make sure that you save this file before you continue, else you will lose everything. To do so, go to **Bestand/File** and click on **Een kopie opslaan in Drive/Save a Copy on Drive**!\n", - "\n", - "Now, rename the file into Week5_Tutorial2.ipynb. You can do so by clicking on the name in the top of this screen." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "hkXRFEqH-g38" - }, - "source": [ - "## Learning Objectives\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "WDQJZqvL-g39" - }, - "source": [ - "- To know how to download data from the Copernicus Climate Data Store using the `cdsapi` and access it through Python.\n", - "- To be able to open and visualize this hazard data.\n", - "- To know how to access and open information from the Copernicus Land Monitoring System. Specifically the Corine Land Cover data.\n", - "- To understand the basic approach of a natural hazard risk assessment.\n", - "- To be able to use the `DamageScanner` to do a damage assessment.\n", - "- To interpret and compare the damage estimates." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "4KseyvEh-g39" - }, - "source": [ - "

Tutorial Outline

\n", - "
\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ysRSLb-6-g3-" - }, - "source": [ - "## 1.Introducing the packages\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "h3aMPYWo-g3-" - }, - "source": [ - "Within this tutorial, we are going to make use of the following packages: \n", - "\n", - "[**GeoPandas**](https://geopandas.org/) is a Python packagee that extends the datatypes used by pandas to allow spatial operations on geometric types.\n", - "\n", - "[**OSMnx**](https://osmnx.readthedocs.io/) is a Python package that lets you download geospatial data from OpenStreetMap and model, project, visualize, and analyze real-world street networks and any other geospatial geometries. You can download and model walkable, drivable, or bikeable urban networks with a single line of Python code then easily analyze and visualize them. You can just as easily download and work with other infrastructure types, amenities/points of interest, building footprints, elevation data, street bearings/orientations, and speed/travel time.\n", - "\n", - "[**xarray**](https://docs.xarray.dev/) is a Python package that allows for easy and efficient use of multi-dimensional arrays.\n", - "\n", - "[**Matplotlib**](https://matplotlib.org/) is a comprehensive Python package for creating static, animated, and interactive visualizations in Python. Matplotlib makes easy things easy and hard things possible.\n", - "\n", - "*We will first need to install the missing packages in the cell below. Uncomment them to make sure we can pip install them*" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "xAk93LFz-g3-", - "outputId": "b0dca5b3-3894-457e-8f2e-e0188b7b8706" - }, - "outputs": [], - "source": [ - "!pip install osmnx\n", - "!pip install rioxarray\n", - "!pip install cdsapi" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "T28OUcKK-g3_" - }, - "source": [ - "Now we will import these packages in the cell below:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "HNZcbQQ_-g4A", - "outputId": "2e8b1214-69e9-40f5-bc84-d02672bf3a5d" - }, - "outputs": [], - "source": [ - "import os\n", - "import cdsapi\n", - "import shapely \n", - "import matplotlib\n", - "import urllib3\n", - "import pyproj\n", - "\n", - "import osmnx as ox\n", - "import numpy as np\n", - "import xarray as xr\n", - "import geopandas as gpd\n", - "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "import networkx as nx\n", - "\n", - "from matplotlib.colors import ListedColormap\n", - "from zipfile import ZipFile\n", - "from io import BytesIO\n", - "from urllib.request import urlopen\n", - "from zipfile import ZipFile\n", - "from tqdm import tqdm\n", - "\n", - "urllib3.disable_warnings()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "TJr_yUdjFMKz" - }, - "source": [ - "### Connect to google drive\n", - "---\n", - "To be able to read the data from Google Drive, we need to *mount* our Drive to this notebook.\n", - "\n", - "As you can see in the cell below, make sure that in your **My Drive** folder, you have created a **BigData** folder and within that folder, you have created a **Week5_Data** folder in which you can store the files that are required to run this analysis.\n", - "\n", - "Please go the URL when its prompted in the box underneath the following cell, and copy the authorization code in that box." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "-Xqbo0nMFTkd", - "outputId": "8ce3d2fd-fb29-44f4-b874-a77a9199a41f" - }, - "outputs": [], - "source": [ - "from google.colab import drive\n", - "drive.mount('/content/gdrive/')\n", - "\n", - "import sys\n", - "sys.path.append(\"/content/gdrive/My Drive/BigData/\")\n", - "\n", - "data_path = os.path.join('/content/gdrive/My Drive/BigData/','Week5_Data')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "fqDSHMah-g4A", - "tags": [] - }, - "source": [ - "## 2. Downloading and accessing natural hazard data\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "1YWXcMRV-g4A" - }, - "source": [ - "We are going to perform a damage assessment using both windstorm data and flood data for Europe.\n", - "\n", - "### Windstorm Data\n", - "\n", - "The windstorm data will be downloaded from the [Copernicus Climate Data Store](https://cds.climate.copernicus.eu/). As we have seen during the lecture, and as you can also see by browsing on this website, there is an awful lot of climate data available through this Data Store. As such, it is very valuable to understand how to access and download this information to use within an analysis. To keep things simple, we only download one dataset today: [A winter windstorm](https://cds.climate.copernicus.eu/cdsapp#!/dataset/sis-european-wind-storm-indicators?tab=overview). \n", - "\n", - "We will do so using an **API**, which is the acronym for application programming interface. It is a software intermediary that allows two applications to talk to each other. APIs are an accessible way to extract and share data within and across organizations. APIs are all around us. Every time you use a rideshare app, send a mobile payment, or change the thermostat temperature from your phone, you’re using an API.\n", - "\n", - "However, before we can access this **API**, we need to take a few steps. Most importantly, we need to register ourselves on the [Copernicus Climate Data Store](https://cds.climate.copernicus.eu/) portal. To do so, we need to register, as explained in the video clip below:\n", - "\n", - "\n", - "
\n", - "\n", - "Now, the next step is to access the API. You can now login on the website of the [Copernicus Climate Data Store](https://cds.climate.copernicus.eu/). After you login, you can click on your name in the top right corner of the webpage (next to the login button). On the personal page that has just opened, you will find your user ID (**uid**) and your personal **API**. You need to add those in the cell below to be able to download the windstorm.\n", - "\n", - "As you can see in the cell below, we download a specific windstorm that has occured on the 28th of October in 2013. This is storm [Carmen (also called St Jude)](https://en.wikipedia.org/wiki/St._Jude_storm). " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "42ejGQJF-g4B", - "outputId": "2936be1c-6e11-4d67-91cc-e339af3e661b" - }, - "outputs": [], - "source": [ - "uid = XXX\n", - "apikey = 'XXX'\n", - "\n", - "c = cdsapi.Client(key=f\"{uid}:{apikey}\", url=\"https://cds.climate.copernicus.eu/api/v2\")\n", - "\n", - "c.retrieve(\n", - " 'sis-european-wind-storm-indicators',\n", - " {\n", - " 'variable': 'all',\n", - " 'format': 'zip',\n", - " 'product': 'windstorm_footprints',\n", - " 'year': '2013',\n", - " 'month': '10',\n", - " 'day': '28',\n", - " },\n", - " 'Carmen.zip')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "0RKepWbV-g4B", - "tags": [] - }, - "source": [ - "### Flood Data\n", - "\n", - "The flood data we will extract from a repository maintained by the European Commission Joint Research Centre. We will download river flood hazard maps from their [Flood Data Collection](https://data.jrc.ec.europa.eu/dataset/1d128b6c-a4ee-4858-9e34-6210707f3c81). \n", - "\n", - "Here we do not need to use an API and we also do not need to register ourselves, so we can download any of the files directly. To do so, we use the `urllib` package." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 363 - }, - "id": "gdS3cvIv-g4B", - "outputId": "233e924d-c368-471b-9590-5b13c9e4e806" - }, - "outputs": [], - "source": [ - "## this is the link to the 1/100 flood map for Europe\n", - "zipurl = 'https://jeodpp.jrc.ec.europa.eu/ftp/jrc-opendata/FLOODS/EuropeanMaps/floodMap_RP100.zip'\n", - "\n", - "# and now we open and extract the data\n", - "with urlopen(zipurl) as zipresp:\n", - " with ZipFile(BytesIO(zipresp.read())) as zfile:\n", - " zfile.extractall(data_path)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "IJrBotZevbZ6" - }, - "source": [ - "The download and zip in the cell above sometimes does not work. If that is indeed the case (e.g., when it seems to remain stuck), download the files manually through the link and upload them in the data folder for this week (as explained at the start of this tutorial.)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "GCBoCWv2-g4B" - }, - "source": [ - "### Set location to explore\n", - "---\n", - "Before we continue, we need to specify our location of interest. This should be a province that will have some flooding and relative high wind speeds occuring (else we will find zero damage).\n", - "\n", - "Specify the region in the cell below by using the `geocode_to_gdf()` function again. I have chosen Gelderland, but feel free to choose a different region. It would be good to double check later on whether there is actually some high wind speeds and flooding in your chosen area." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "bQfZLu6T-g4B" - }, - "outputs": [], - "source": [ - "place_name = \"Gelderland, The Netherlands\"\n", - "area = ox.geocode_to_gdf(place_name)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "qES1iP8N-g4C" - }, - "source": [ - "## 3. Explore the natural hazard data\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "v89JIHRz-g4C" - }, - "source": [ - "As you can see in the section above, we have downloaded the storm footprint in a zipfile. Let's open the zipfile and load the dataset using the `xarray` package through the `open_dataset()` function." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "I8FlFSFw-g4C" - }, - "source": [ - "### Windstorm Data\n", - "---" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "UFcP1DTs-g4C" - }, - "outputs": [], - "source": [ - "with ZipFile('Carmen.zip') as zf:\n", - " \n", - " # Let's get the filename first\n", - " file = zf.namelist()[0]\n", - " \n", - " # And now we can open and select the file within Python\n", - " with zf.open(file) as f:\n", - " windstorm_europe = xr.open_dataset(f)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "KFZEcL_C-g4C" - }, - "source": [ - "Let's have a look at the storm we have downloaded!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "windstorm_europe['FX'].plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Xz30IPy7QAiY" - }, - "source": [ - "
\n", - "Question 1: Describe windstorm Carmen. When did this event happen, which areas were most affected? Can you say something about the maximum wind speeds in different areas, based on the plot? And what does FX mean?\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "zLb6mFA9-g4D" - }, - "source": [ - "Unfortunately, our data does not have a proper coordinate system defined yet. As such, we will need to use the `rio.write_crs()` function to set the coordinate system to **EPSG:4326** (the standard global coordinate reference system). \n", - "\n", - "We also need to make sure that the functions will know what the exact parameters are that we have to use for our spatial dimenions (e.g. longitude and latitude). It prefers to be named `x` and `y`. So we use the `rename()` function before we use the `set_spatial_dims()` function." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 291 - }, - "id": "WqAmuTVo-g4D", - "outputId": "0337b286-bc80-4d33-f182-f35d0458686f" - }, - "outputs": [], - "source": [ - "windstorm_europe.rio.write_crs(4326, inplace=True)\n", - "windstorm_europe = windstorm_europe.rename({'Latitude': 'y','Longitude': 'x'})\n", - "windstorm_europe.rio.set_spatial_dims(x_dim=\"x\",y_dim=\"y\", inplace=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "sHxrXrOkRNqA" - }, - "source": [ - "
\n", - "Question 2: Climate data is often stored as a netCDF file. Please describe what a netCDF file is. Which information is stored in the netCDF file we have downloaded for the windstorm? What type of metadata does it contain?\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "E2cHd5hV-g4D" - }, - "source": [ - "Following, we also make sure it will be in the European coordinate system **EPSG:3035** to ensure we can easily use it together with the other data. To do so, we use the `reproject()` function. You can simple add the number of the coordinate system." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "AqZvdyGk-g4D" - }, - "outputs": [], - "source": [ - "windstorm_europe = windstorm_europe.rio.reproject(XXXX)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "6o_aa1sp-g4D" - }, - "source": [ - "Now we have all the information to clip the windstorm data to our area of interest:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "NRQV7Io3-g4E" - }, - "outputs": [], - "source": [ - "windstorm_map = windstorm_europe.rio.clip(area.envelope.values, area.crs)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "WlWwtOKH-g4E" - }, - "source": [ - "And let's have a look as well by using the `plot()` function. Please note that the legend is in meters per second." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 324 - }, - "id": "AzolOfUC-g4E", - "outputId": "3de9b3d2-8907-48ee-b828-4b03a097a80d" - }, - "outputs": [], - "source": [ - "windstorm_map['FX']. XXXX" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "5jQ2_51Z-g4E" - }, - "source": [ - "### Flood data\n", - "---" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "btJy-1aR-g4E" - }, - "source": [ - "And similarly, we want to open the flood map. But now we do not have to unzip the file anymore and we can directly open it through using `xarray`:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "oRvMEvkm-g4E" - }, - "outputs": [], - "source": [ - "flood_map_path = os.path.join(data_path,'floodmap_EFAS_RP100_C.tif')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 328 - }, - "id": "eEA1EKlt-g4E", - "outputId": "1968dec7-b036-4df4-bd9f-b16c41102b33" - }, - "outputs": [], - "source": [ - "flood_map = xr.open_dataset(flood_map_path, engine=\"rasterio\")\n", - "flood_map" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "O4EIxBK_-g4F" - }, - "source": [ - "And let's make sure we set all the variables and the CRS correctly again to be able to open the data properly. Note that we now use **EPSG:3035**. This is the standard coordinate system for Europe, in meters (instead of degrees)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 291 - }, - "id": "LxTaPlzW-g4F", - "outputId": "8c9d5bcb-3ceb-4628-88fb-0aabe161365f", - "tags": [] - }, - "outputs": [], - "source": [ - "flood_map.rio.write_crs(3035, inplace=True)\n", - "flood_map.rio.set_spatial_dims(x_dim=\"x\",y_dim=\"y\", inplace=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "utiDVMpJ-g4F" - }, - "source": [ - "Now it is pretty difficult to explore the data for our area of interest, so let's clip the flood data. \n", - "\n", - "We want to clip our flood data to our chosen area. The code, however, is very inefficient and will run into memories issues on Google Colab. As such, we first need to clip it by using a bounding box, followed by the actual clip.\n", - "\n", - "
\n", - "Question 3: Please provide the lines of code below in which you show how you have clipped the flood map to your area.\n", - "
\n", - "\n", - "*A few hints*:\n", - "\n", - "* carefully read the documentation of the `.clip_box()` function of rioxarray. Which information do you need? \n", - "* is the GeoDataFrame of your region (the area GeoDataframe) in the same coordinate system? Perhaps you need to convert it using the `.to_crs()` function. \n", - "* how do you get the bounds from your area GeoDataFrame? \n", - "* The final step of the clip would be to use the `.rio.clip()` function, using the actual area file and the flood map clipped to the bounding box. Please note that you should **not** use the envelope here, like we did in the previous clip. Here we really want to use the exact geometry values.\n", - "\n", - "As you will see, we first clip it very efficiently using the bounding box. After that, we do an exact clip." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "PuJ290bGISlL" - }, - "outputs": [], - "source": [ - "min_lon = area.to_crs(epsg=3035).bounds.minx.values[0]\n", - "min_lat = area.to_crs(epsg=3035).bounds.miny\n", - "max_lon = area.to_crs(epsg=3035).bounds\n", - "max_lat = area.to_crs(epsg=3035).\n", - "\n", - "flood_map_area = flood_map.rio.clip_box(minx=.... )\n", - "flood_map_area = flood_map_area.rio.clip(area.XXXX.values, area.crs)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "xNjj8RT--g4F" - }, - "source": [ - "And let's have a look as well. Please note that the legend is in meters." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 324 - }, - "id": "v_wldK5x-g4F", - "outputId": "15c3b526-d094-40e1-dae1-9dbfe57339ea" - }, - "outputs": [], - "source": [ - "flood_map_area['band_data'].plot(cmap='Blues',vmax=10)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "iiOgZMi0-g4F", - "tags": [] - }, - "source": [ - "## 4. Download and access Copernicus Land Cover data\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "JTp2SMuK-g4F" - }, - "source": [ - "Unfortunately, there is no API option to download the [Corine Land Cover](https://land.copernicus.eu/pan-european/corine-land-cover) data. We will have to download the data from the website first.\n", - "\n", - "To do so, we will first have to register ourselves again on the website. Please find in the video clip below how to register yourself on the website of the [Copernicus Land Monitoring Service](https://land.copernicus.eu/):\n", - "\n", - "\n", - "\n", - "Now click on the Login button in the top right corner to login on the website. There are many interesting datasets on this website, but we just want to download the Corine Land Cover data, and specifically the latest version: [Corine Land Cover 2018](https://land.copernicus.eu/pan-european/corine-land-cover/clc2018?tab=download). To do so, please select the **Corine Land Cover - 100 meter**. Now click on the large green Download button. Your download should start any minute.\n", - "\n", - "Slightly annoying, the file you have downloaded is double zipped. Its slightly inconvenient to open this through Python and within Google Drive. So let's unzip it twice outside of Python (on your local machine) and then direct yourself to the `DATA` directory within the unzipped file. Here you can find a file called `U2018_CLC2018_V2020_20u1.tif`. Drop this file into this week's data directory, as specified at the start of this tutorial when we mounted our Google Drive." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "e3OV0J1N-g4G" - }, - "outputs": [], - "source": [ - "CLC_location = os.path.join(data_path,'U2018_CLC2018_V2020_20u1.tif')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "stGRY3U5-g4G", - "outputId": "afaec16f-d144-46ba-af4c-6cc03df68763" - }, - "outputs": [], - "source": [ - "CLC = xr.open_dataset(CLC_location, engine=\"rasterio\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "EF_na6jnKAvZ" - }, - "source": [ - "Similarly to the flood map data, we need to do a two-stage clip again (like we did before in this tutorial to ensure we get only our area of interest without exceeding our RAM." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "LHBLJONMJ_Zf" - }, - "outputs": [], - "source": [ - "CLC_region = CLC.rio.clip_box(minx=.....,)\n", - "CLC_region = CLC_region.rio.clip(area.geometry.values,area.crs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 291 - }, - "id": "CE5AhRYt-g4G", - "outputId": "861397ac-9256-4e1d-a876-c17f0d18cfca" - }, - "outputs": [], - "source": [ - "CLC_region = CLC_region.rename({'x': 'lat','y': 'lon'})\n", - "CLC_region.rio.set_spatial_dims(x_dim=\"lat\",y_dim=\"lon\", inplace=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "dGDKag4cKTnO" - }, - "source": [ - "And now we create a *color_dict* again, similarly as we did for the raster data in the previous tutorial " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "g7I4fbKs-g4G" - }, - "outputs": [], - "source": [ - "CLC_values = [111, 112, 121, 122, 123, 124, 131, 132, 133, 141, 142, 211, 212, 213, 221, 222, 223, 231, 241, 242,\n", - " 243, 244, 311, 312, 313, 321, 322, 323, 324, 331, 332, 333, 334, 335, 411, 412, 421, 422, 423, 511, 512, 521, 522, 523]\n", - "\n", - "CLC_colors = ['#E6004D', '#FF0000', '#CC4DF2', '#CC0000', '#E6CCCC', '#E6CCE6', '#A600CC', '#A64DCC', '#FF4DFF', '#FFA6FF', '#FFE6FF', '#FFFFA8', '#FFFF00', '#E6E600',\n", - " '#E68000', '#F2A64D', '#E6A600', '#E6E64D', '#FFE6A6', '#FFE64D', '#E6CC4D', '#F2CCA6', '#80FF00', '#00A600',\n", - " '#4DFF00', '#CCF24D', '#A6FF80', '#A6E64D', '#A6F200', '#E6E6E6', '#CCCCCC', '#CCFFCC', '#000000', '#A6E6CC',\n", - " '#A6A6FF', '#4D4DFF', '#CCCCFF', '#E6E6FF', '#A6A6E6', '#00CCF2', '#80F2E6', '#00FFA6', '#A6FFE6', '#E6F2FF']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Y9Ye19av-g4G" - }, - "outputs": [], - "source": [ - "color_dict_raster = dict(zip(CLC_values,CLC_colors))\n", - "\n", - "# We create a colormar from our list of colors\n", - "cm = ListedColormap(CLC_colors)\n", - "\n", - "# Let's also define the description of each category : 1 (blue) is Sea; 2 (red) is burnt, etc... Order should be respected here ! Or using another dict maybe could help.\n", - "labels = np.array(CLC_values)\n", - "len_lab = len(labels)\n", - "\n", - "# prepare normalizer\n", - "## Prepare bins for the normalizer\n", - "norm_bins = np.sort([*color_dict_raster.keys()]) + 0.5\n", - "norm_bins = np.insert(norm_bins, 0, np.min(norm_bins) - 1.0)\n", - "\n", - "## Make normalizer and formatter\n", - "norm = matplotlib.colors.BoundaryNorm(norm_bins, len_lab, clip=True)\n", - "fmt = matplotlib.ticker.FuncFormatter(lambda x, pos: labels[norm(x)])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "5CQoFmdqKcMe" - }, - "source": [ - "And let's plot the Corine Land Cover data for our area of interest" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 650 - }, - "id": "JIPpIZRh-g4G", - "outputId": "59ecd822-c679-42a5-eb5f-ead83aee5102" - }, - "outputs": [], - "source": [ - "fig, ax = plt.subplots(1, 1,figsize=(14,10))\n", - "\n", - "CLC_region[\"band_data\"].plot(ax=ax,levels=len(CLC_colors),colors=CLC_colors)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "AdSaPHzIfNbi" - }, - "source": [ - "
\n", - "Question 4: Describe the different land-use classes within your region that you see on the Corine Land Cover map.\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "9zbsc7d_-g4G", - "tags": [] - }, - "source": [ - "## 5. Perform a damage assessment using Coring Land Cover\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Agxq2HqY-g4H" - }, - "source": [ - "To calculate the potential damage to both windstorms and floods, we use stage-damage curves, which relate the intensity of the hazard to the fraction of maximum damage that can be sustained by a certain land use. As you can see on the Corine Land Cover map that we just plotted, there are a lot of land use classes (44), though not all will suffer damage from either the windstorm or the flood event. For each of the land-use classes a curve and a maximum damage number are assigned.\n", - "\n", - "To Assess the damage for both the flood and windstorm event, we are going to make use of the [DamageScanner](https://damagescanner.readthedocs.io/en/latest/), which is a tool to calculate potential flood damages based on inundation depth and land use using depth-damage curves in the Netherlands. The DamageScanner was originally developed for the 'Netherlands Later' project [(Klijn et al., 2007)](https://www.rivm.nl/bibliotheek/digitaaldepot/WL_rapport_Overstromingsrisicos_Nederland.pdf). The original land-use classes were based on the Land-Use Scanner in order to evaluate the effect of future land-use change on flood damages. We have tailored the input of the DamageScanner to make sure it can estimate the damages using Corine Land Cover.\n", - "\n", - "Because the simplicity of the model, we can use this for any raster-based hazard map with some level of intensity. Hence, we can use it for both hazards." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "5m_RAcp_fraF" - }, - "source": [ - "
\n", - "Question 5: Describe in your own words what the `DamageScanner()` function does. Please walk us through the different steps. Which inputs do you need to be able to run this damage assessment?\n", - "
" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "jDrTp44Q-g4H" - }, - "outputs": [], - "source": [ - "def DamageScanner(landuse_map,inun_map,curve_path,maxdam_path,cellsize=100):\n", - " \n", - " # load land-use map\n", - " landuse = landuse_map.copy()\n", - " \n", - " # Load inundation map\n", - " inundation = inun_map.copy()\n", - " \n", - " inundation = np.nan_to_num(inundation) \n", - "\n", - " # Load curves\n", - " if isinstance(curve_path, pd.DataFrame):\n", - " curves = curve_path.values \n", - " elif isinstance(curve_path, np.ndarray):\n", - " curves = curve_path\n", - "\n", - " #Load maximum damages\n", - " if isinstance(maxdam_path, pd.DataFrame):\n", - " maxdam = maxdam_path.values \n", - " elif isinstance(maxdam_path, np.ndarray):\n", - " maxdam = maxdam_path\n", - " \n", - " # Speed up calculation by only considering feasible points\n", - " inun = inundation * (inundation>=0) + 0\n", - " inun[inun>=curves[:,0].max()] = curves[:,0].max()\n", - " waterdepth = inun[inun>0]\n", - " landuse = landuse[inun>0]\n", - "\n", - " # Calculate damage per land-use class for structures\n", - " numberofclasses = len(maxdam)\n", - " alldamage = np.zeros(landuse.shape[0])\n", - " damagebin = np.zeros((numberofclasses, 4,))\n", - " for i in range(0,numberofclasses):\n", - " n = maxdam[i,0]\n", - " damagebin[i,0] = n\n", - " wd = waterdepth[landuse==n]\n", - " alpha = np.interp(wd,((curves[:,0])),curves[:,i+1])\n", - " damage = alpha*(maxdam[i,1]*cellsize)\n", - " damagebin[i,1] = sum(damage)\n", - " damagebin[i,2] = len(wd)\n", - " if len(wd) == 0:\n", - " damagebin[i,3] = 0\n", - " else:\n", - " damagebin[i,3] = np.mean(wd)\n", - " alldamage[landuse==n] = damage\n", - "\n", - " # create pandas dataframe with output\n", - " loss_df = pd.DataFrame(damagebin.astype(float),columns=['landuse','losses','area','avg_depth']).groupby('landuse').sum()\n", - " \n", - " # return output\n", - " return loss_df.sum().values[0],loss_df" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Y7PB8oJz-g4H" - }, - "source": [ - "### Windstorm Damage\n", - "---\n", - "To estimate the potential damage of our windstorm, we use the vulnerability curves developed by [Yamin et al. (2014)](https://www.sciencedirect.com/science/article/pii/S2212420914000466). Following [Yamin et al. (2014)](https://www.sciencedirect.com/science/article/pii/S2212420914000466), we will apply a sigmoidal vulnerability function satisfying two constraints: (i) a minimum threshold for the occurrence of damage with an upper bound of 100% direct damage; (ii) a high power-law function for the slope, describing an increase in damage with increasing wind speeds. Due to the limited amount of vulnerability curves available for windstorm damage, we will use the damage curve that represents low-rise *reinforced masonry* buildings for all land-use classes that may contain buildings. Obviously, this is a large oversimplification of the real world, but this should be sufficient for this exercise. When doing a proper stand-alone windstorm risk assessment, one should take more effort in collecting the right vulnerability curves for different building types. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "-RxvAEQh-g4H", - "tags": [] - }, - "outputs": [], - "source": [ - "wind_curves = pd.read_excel(\"https://github.com/ElcoK/BigData_AED/raw/main/week5/damage_curves.xlsx\",sheet_name='wind_curves')\n", - "maxdam = pd.read_excel(\"https://github.com/ElcoK/BigData_AED/raw/main/week5/damage_curves.xlsx\",sheet_name='maxdam')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "uLZ7vl1w-g4H" - }, - "source": [ - "Unfortunately, we run into a *classic* problem when we want to overlay the windstorm data with the Corine Land Cover data. The windstorm data is not only stored in a different coordinate system (we had to convert it from **EPSG:4326** to **EPSG:3035**), it is in a different resolution (**1km** instead of the **100m** of Corine Land Cover). \n", - "\n", - "Let's first have a look how our clipped data look's like. If you have decided to use Gelderland, you will see that we have 102 columns (our Lattitude/lat) and 74 rows (our Longitude/lon). If you scroll above to our Corine Land Cover data, you see that dimensions are different: 1270 columns (Lattitude/lat/x) and 870 rows (Longitude/lon/y). " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 291 - }, - "id": "gG2OXOySj8Ra", - "outputId": "67135491-52de-4571-f8c9-7b6a74e19b66" - }, - "outputs": [], - "source": [ - "windstorm_map" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "igfFBqcK-g4H" - }, - "source": [ - "The first thing we are going to do is try to make sure our data will be in the correct resolution (moving from **1km** to **100m**). To do so, we will use the `rio.reproject()` function. You will see that specify the resolution as **100**. Because **EPSG:3035** is a coordinate system in meters, we can simply use meters to define the resolution. We use the `rio.clip()` function to make sure we clip it again to our area of interest. The function below (`match_rasters`) will do the hard work for us. Please note all the input variables to understand what's happening." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Kud2CWEDhz1O" - }, - "outputs": [], - "source": [ - "def match_rasters(hazard,landuse,haz_crs=3035,lu_crs=3035,resolution=100,hazard_col=['FX']):\n", - " \"\"\"\n", - " Clips, reprojections, and matches the resolutions of two rasters, `hazard` and `landuse`,\n", - " to prepare them for further analysis.\n", - "\n", - " Parameters\n", - " ----------\n", - " hazard : xarray.DataArray\n", - " A 2D or 3D array containing hazard data.\n", - " landuse : xarray.DataArray\n", - " A 2D array containing land use data.\n", - " haz_crs : int, optional\n", - " The CRS of `hazard`. Default is EPSG:3035.\n", - " lu_crs : int, optional\n", - " The CRS of `landuse`. Default is EPSG:3035.\n", - " resolution : float, optional\n", - " The desired resolution in meters for both `hazard` and `landuse` after reprojection. Default is 100.\n", - " hazard_col : list, optional\n", - " A list of column names or indices for the hazard variable. Default is ['FX'].\n", - "\n", - " Returns\n", - " -------\n", - " tuple\n", - " A tuple containing two xarray.DataArray objects:\n", - " - The land use variable with matching resolution and dimensions to the hazard variable.\n", - " - The hazard variable clipped to the extent of the land use variable, with matching resolution and dimensions.\n", - " \"\"\"\n", - " \n", - " # Set the crs of the hazard variable to haz_crs\n", - " hazard.rio.write_crs(haz_crs, inplace=True)\n", - "\n", - " # Set the x and y dimensions in the hazard variable to 'x' and 'y' respectively\n", - " hazard.rio.set_spatial_dims(x_dim=\"x\",y_dim=\"y\", inplace=True)\n", - "\n", - " # Reproject the landuse variable from EPSG:4326 to EPSG:3857\n", - " landuse = CLC_region.rio.reproject(\"EPSG:3857\",resolution=resolution)\n", - "\n", - " # Get the minimum longitude and latitude values in the landuse variable\n", - " min_lon = landuse.x.min().to_dict()['data']\n", - " min_lat = landuse.y.min().to_dict()['data']\n", - "\n", - " # Get the maximum longitude and latitude values in the landuse variable\n", - " max_lon = landuse.x.max().to_dict()['data']\n", - " max_lat = landuse.y.max().to_dict()['data']\n", - "\n", - " # Create a bounding box using the minimum and maximum latitude and longitude values\n", - " area = gpd.GeoDataFrame([shapely.box(min_lon,min_lat,max_lon, max_lat)],columns=['geometry'])\n", - "\n", - " # Set the crs of the bounding box to EPSG:3857\n", - " area.crs = 'epsg:3857'\n", - "\n", - " # Convert the crs of the bounding box to EPSG:4326\n", - " area = area.to_crs(f'epsg:{haz_crs}')\n", - "\n", - " # Clip the hazard variable to the extent of the bounding box\n", - " hazard = hazard.rio.clip(area.geometry.values, area.crs)\n", - "\n", - " # Reproject the hazard variable to EPSG:3857 with the desired resolution\n", - " hazard = hazard.rio.reproject(\"EPSG:3857\",resolution=resolution)\n", - "\n", - " # Clip the hazard variable again to the extent of the bounding box\n", - " hazard = hazard.rio.clip(area.geometry.values, area.crs)\n", - "\n", - " # If the hazard variable has fewer columns and rows than the landuse variable, reproject the landuse variable to match the hazard variable\n", - " if (len(hazard.x)len(landuse.x)) & (len(hazard.y)>len(landuse.y)):\n", - " hazard = hazard.rio.reproject_match(landuse)\n", - "\n", - " # return the new landuse and hazard map\n", - " return landuse,hazard" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Vkf6YKPZ-g4I" - }, - "source": [ - "Now let's run the `match_rasters` function and let it do its magic." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "v8NW3c1Q-g4I" - }, - "outputs": [], - "source": [ - "CLC_region_wind, windstorm = match_rasters(windstorm_europe,\n", - " CLC_region,\n", - " haz_crs=3035,\n", - " lu_crs=3035,\n", - " resolution=100,\n", - " hazard_col=['FX'])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "GgcwJe_6nJip" - }, - "source": [ - "And let's have a look if the two rasters are now the same extend:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 291 - }, - "id": "vzMbkiSLldlQ", - "outputId": "6e73f8b1-33ad-4a7c-b95c-d320b6c75439" - }, - "outputs": [], - "source": [ - "CLC_region_wind" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 291 - }, - "id": "DXnxCBS_ldWg", - "outputId": "ec49b756-0fd9-4d49-f9ff-9f68a52bf83c" - }, - "outputs": [], - "source": [ - "windstorm" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "6123eX9C-g4J" - }, - "source": [ - "It worked! And to double check, let's also plot it:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 324 - }, - "id": "Aeay_slW-g4J", - "outputId": "11424ad3-2a00-49db-db13-b4db8e73671e" - }, - "outputs": [], - "source": [ - "windstorm.FX.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "JlZF-cs4gSuu" - }, - "source": [ - "
\n", - "Question 6: Describe the various steps you have taken to make sure that the windstorm map is now exactly the same extent as the corine land cover map. Feel free to include lines of code in your answer and also describe the different functions you have used along the way.\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "LW158xPh-g4J" - }, - "source": [ - "Now its finally time to do our damage assessment! To do so, we need to convert our data to `numpy.arrays()` to do our calculation:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "QZIzWIeP-g4J" - }, - "outputs": [], - "source": [ - "landuse_map = CLC_region_wind['band_data'].to_numpy()[0,:,:]\n", - "wind_map = windstorm['FX'].to_numpy()[0,:,:]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "aBqqRqbkmA1Y", - "outputId": "709d6c91-4ad9-4e27-e6a9-e6201df32dc7" - }, - "outputs": [], - "source": [ - "wind_map.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "J9QHyhSU-g4J" - }, - "source": [ - "And remember that our windstorm data was stored in **m/s**. Hence, we need to convert it to **km/h**:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "GqdUCXD_-g4J" - }, - "outputs": [], - "source": [ - "wind_map_kmh = wind_map*XXX" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ln7NqRB1-g4J" - }, - "source": [ - "And now let's run the DamageScanner to obtain the damage results" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "y_g0pj1h-g4J", - "tags": [] - }, - "outputs": [], - "source": [ - "wind_damage_CLC = DamageScanner(landuse_map,wind_map_kmh,wind_curves,maxdam)[1]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "id": "-6DbFD_JeFA1", - "outputId": "fb251350-8885-4dde-e665-893fa04cde6e" - }, - "outputs": [], - "source": [ - "wind_damage_CLC" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "5UNySYvk-g4J", - "tags": [] - }, - "source": [ - "### Flood Damage\n", - "---\n", - "To Assess the flood damage, we are again going to make use of the [DamageScanner](https://damagescanner.readthedocs.io/en/latest/). The Corine Land Cover data is widely used in European flood risk assessments. As such, we can simply make use of pre-developed curves. We are using the damage curves as developed by Huizinga et al. (2007). Again, let's first load the maximum damages and the depth-damage curves:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "ua2xyAGW-g4J" - }, - "outputs": [], - "source": [ - "flood_curves = pd.read_excel(\"https://github.com/ElcoK/BigData_AED/raw/main/week5/damage_curves.xlsx\",sheet_name='flood_curves',engine='openpyxl')\n", - "maxdam = pd.read_excel(\"https://github.com/ElcoK/BigData_AED/raw/main/week5/damage_curves.xlsx\",sheet_name='maxdam')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "HT54wRvs-g4K" - }, - "source": [ - "And convert our data to `numpy.arrays()` to do our calculation:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "qzXKNmg2-g4K" - }, - "outputs": [], - "source": [ - "landuse_map = CLC_region['band_data'].to_numpy()\n", - "flood_map = flood_map_area['band_data'].to_numpy()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ttGra99k-g4K" - }, - "source": [ - "And now let's run the DamageScanner to obtain the damage results" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "2qL8UATu-g4K" - }, - "outputs": [], - "source": [ - "flood_damage_CLC = DamageScanner(landuse_map,flood_map,flood_curves,maxdam)[1]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "id": "WnWu6AMUeFA2", - "outputId": "a16faddd-7a66-40e4-f103-9a1c1f723735" - }, - "outputs": [], - "source": [ - "flood_damage_CLC" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "hGWhg9fogvM3" - }, - "source": [ - "
\n", - "Question 7: Describe the results of the flood and wind damage assessments. Do you notice any differences between the outcomes? Do you observe specific land-use classes that are severely damaged?\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "E0ohOKwd-g4K" - }, - "source": [ - "## 6. Perform a damage assessment of the road network using OpenStreetMap\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "bKFmTKpj-g4K" - }, - "source": [ - "Generally, wind damage does not cause much damage to roads. There will be clean-up cost of the trees that will fall on the roads, but structural damage is rare. As such, we will only do a flood damage assessment for the road network of our region.\n", - "\n", - "To do so, we first need to extract the roads again. We will use the `graph_from_place()` function again to do so. However, the area will be to large to extract roads, so we will focus our analysis on the main network." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "CUqFG7AD-g4K" - }, - "outputs": [], - "source": [ - "cf = '[\"highway\"~\"trunk|motorway|primary|secondary\"]'\n", - "G = ox.graph_from_place(place_name, network_type=\"drive\", custom_filter=cf)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "modIJTEz-g4K" - }, - "source": [ - "And convert the road network to a `geodataframe`, as done in the previous tutorial as well." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "sxOBriok-g4K", - "outputId": "6ddc37c2-d8d1-4222-f989-08a2f9d08d43" - }, - "outputs": [], - "source": [ - "roads = gpd.GeoDataFrame(nx.to_pandas_edgelist(G))\n", - "roads.highway = roads.highway.astype('str')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In case the above does not work, you can continue the assignment by using the code below (make sure you remove the hashtags to run it). " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#from urllib import request\n", - "# remote_url = 'https://github.com/ElcoK/BigData_AED/raw/main/week5/kampen_roads.gpkg'\n", - "# file = 'kampen_roads.gpkg'\n", - "# \n", - "# #request.urlretrieve(remote_url, file)\n", - "# roads = gpd.GeoDataFrame.from_file('kampen_roads.gpkg')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "VIaMGLxA-g4K" - }, - "source": [ - "And lets have a look at the data:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 495 - }, - "id": "dx_299FS-g4L", - "outputId": "ffdab479-6a25-4794-da3a-cbacf2accaa4" - }, - "outputs": [], - "source": [ - "fig, ax = plt.subplots(1, 1,figsize=(12,10))\n", - "\n", - "\n", - "roads.plot(column='highway',legend=True,ax=ax,legend_kwds={'loc': 'lower right'});\n", - "\n", - "\n", - "# remove the ax labels\n", - "ax.set_xticks([])\n", - "ax.set_yticks([])\n", - "ax.set_axis_off()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "PSGo7dC3-g4L" - }, - "source": [ - "It is actually quite inconvenient to have all these lists in the data for when we want to do the damage assessment. Let's clean this up a bit. To do so, we first make sure that all the lists are represented as actual lists, and not lists wrapped within a string." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "S_LZSRI6-g4L" - }, - "outputs": [], - "source": [ - "roads.highway = roads.highway.apply(lambda x: x.strip('][').split(', '))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "cwQKiRDd-g4L" - }, - "source": [ - "Now we just need to grab the first element of each of the lists." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "qe86tcET-g4L" - }, - "outputs": [], - "source": [ - "roads.highway = roads.highway.apply(lambda x: x[0] if isinstance(x, list) else x)\n", - "roads.highway = roads.highway.str.replace(\"'\",\"\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "TkyDDDIP-g4L" - }, - "source": [ - "And let's have a look whether this worked:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 495 - }, - "id": "f5qPSBmq-g4L", - "outputId": "6ac152f2-14f1-4e6c-c53a-9d68db347ce6" - }, - "outputs": [], - "source": [ - "fig, ax = plt.subplots(1, 1,figsize=(12,10))\n", - "\n", - "roads.plot(column='highway',legend=True,ax=ax,legend_kwds={'loc': 'upper left','ncol':1});\n", - "\n", - "# remove the ax labels\n", - "ax.set_xticks([])\n", - "ax.set_yticks([])\n", - "ax.set_axis_off()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "u0crazq8iQjQ" - }, - "source": [ - "
\n", - "Question 8: Upload a figure of the cleaned road network (e.g. in which you do not see any of the listed road types anymore)\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "J63sExRp-g4L" - }, - "source": [ - "Nice! now let's start with the damage calculation. As you already have may have noticed, our data is now not stored in raster format, but in vector format. One way to deal with this issue is to convert our vector data to raster data, but we will lose a lot of information and detail. As such, we will perform the damage assessment on the road elements, using the xarray flood map.\n", - "\n", - "Let's start with preparing the flood data into vector format:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "uHmaZFXV-g4L" - }, - "outputs": [], - "source": [ - "# get the mean values\n", - "flood_map_vector = flood_map_area['band_data'].to_dataframe().reset_index()\n", - "\n", - "# create geometry values and drop lat lon columns\n", - "flood_map_vector['geometry'] = [shapely.points(x) for x in list(zip(flood_map_vector['x'],flood_map_vector['y']))]\n", - "flood_map_vector = flood_map_vector.drop(['x','y','band','spatial_ref'],axis=1)\n", - "\n", - "# drop all non values to reduce size\n", - "flood_map_vector = flood_map_vector.loc[~flood_map_vector['band_data'].isna()].reset_index(drop=True)\n", - "\n", - "# and turn them into squares again:\n", - "flood_map_vector.geometry= shapely.buffer(flood_map_vector.geometry,distance=100/2,cap_style='square').values" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "sKb-ig4Q-g4M" - }, - "source": [ - "And let's plot the results:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 306 - }, - "id": "LL3YU6r1-g4M", - "outputId": "e0a9e61f-e376-436c-a11a-fa58651bf15a" - }, - "outputs": [], - "source": [ - "gpd.GeoDataFrame(flood_map_vector.copy()).plot(column='band_data',cmap='Blues',vmax=5,linewidth=0)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "XBsxnhjN-g4M" - }, - "source": [ - "We will need a bunch of functions to make sure we can do our calculations. They are specified below. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "T-XfgGLB-g4M" - }, - "outputs": [], - "source": [ - "def reproject(df_ds,current_crs=\"epsg:4326\",approximate_crs = \"epsg:3035\"):\n", - " geometries = df_ds['geometry']\n", - " coords = shapely.get_coordinates(geometries)\n", - " transformer=pyproj.Transformer.from_crs(current_crs, approximate_crs,always_xy=True)\n", - " new_coords = transformer.transform(coords[:, 0], coords[:, 1])\n", - " \n", - " return shapely.set_coordinates(geometries.copy(), np.array(new_coords).T) \n", - "\n", - "def buffer_assets(assets,buffer_size=100):\n", - " assets['buffered'] = shapely.buffer(assets.geometry.values,buffer_size)\n", - " return assets\n", - "\n", - "def overlay_hazard_assets(df_ds,assets):\n", - "\n", - " #overlay \n", - " hazard_tree = shapely.STRtree(df_ds.geometry.values)\n", - " if (shapely.get_type_id(assets.iloc[0].geometry) == 3) | (shapely.get_type_id(assets.iloc[0].geometry) == 6):\n", - " return hazard_tree.query(assets.geometry,predicate='intersects') \n", - " else:\n", - " return hazard_tree.query(assets.buffered,predicate='intersects')\n", - " \n", - "def get_damage_per_asset(asset,df_ds,assets):\n", - " # find the exact hazard overlays:\n", - " get_hazard_points = df_ds.iloc[asset[1]['hazard_point'].values].reset_index()\n", - " get_hazard_points = get_hazard_points.loc[shapely.intersects(get_hazard_points.geometry.values,assets.iloc[asset[0]].geometry)]\n", - "\n", - " asset_geom = assets.iloc[asset[0]].geometry\n", - "\n", - " maxdam_asset = 100\n", - " hazard_intensity = np.arange(0,10,0.1) \n", - " fragility_values = np.arange(0,1,0.01) \n", - " \n", - " if len(get_hazard_points) == 0:\n", - " return asset[0],0\n", - " else:\n", - " get_hazard_points['overlay_meters'] = shapely.length(shapely.intersection(get_hazard_points.geometry.values,asset_geom))\n", - " return asset[0],np.sum((np.interp(get_hazard_points.band_data.values,hazard_intensity,fragility_values))*get_hazard_points.overlay_meters*maxdam_asset)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "og2Bkcv--g4M" - }, - "source": [ - "Now we need to make sure that the road data is the same coordinate system. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "NvtDuspN-g4M", - "outputId": "8d920938-ab07-42f9-bb88-34483e751c3f" - }, - "outputs": [], - "source": [ - "roads.geometry = reproject(roads)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "4JT25WTv-g4M" - }, - "source": [ - "And we can now overlay the roads with the flood data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "8rtBYbX_-g4M" - }, - "outputs": [], - "source": [ - "overlay_roads = pd.DataFrame(overlay_hazard_assets(flood_map_vector,buffer_assets(roads)).T,columns=['asset','hazard_point'])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "s82DyD_y-g4M" - }, - "source": [ - "And estimate the damages" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "LGqPFklh-g4N", - "outputId": "207937c9-dcc5-41a5-ebc4-76aa03003022" - }, - "outputs": [], - "source": [ - "collect_output = []\n", - "for asset in tqdm(overlay_roads.groupby('asset'),total=len(overlay_roads.asset.unique()),\n", - " desc='polyline damage calculation for'):\n", - " collect_output.append(get_damage_per_asset(asset,flood_map_vector,roads))\n", - " \n", - "damaged_roads = roads.merge(pd.DataFrame(collect_output,columns=['index','damage']),\n", - " left_index=True,right_on='index')[['highway','geometry','damage']]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "RFGZxWl7i7pQ" - }, - "source": [ - "
\n", - "Question 9: Describe the various steps we have taken to perform the damage assessment on the road network. How is this approach different compared to the raster-based approach? Highlight the differences you find most important. Include any line of code you may want to include to make your story clear.\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "B5jpsbyC-g4N" - }, - "source": [ - "And let's plot the results" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 514 - }, - "id": "n25j-3wG-g4N", - "outputId": "b926a8e7-7e51-4434-f3b8-d61e6278bc24" - }, - "outputs": [], - "source": [ - "fig, ax = plt.subplots(1, 1,figsize=(12,10))\n", - "\n", - "damaged_roads.plot(column='damage',cmap='Reds',ax=ax);" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "bTfmvwW2jchB" - }, - "source": [ - "
\n", - "Question 10: Describe the most severely damaged parts of the road network. Use Google Maps to identify these roads. Are you surprised by the results?\n", - "
" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "SG3FSqsLeFA5" - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "colab": { - "provenance": [], - "toc_visible": true - }, - "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.6" - }, - "vscode": { - "interpreter": { - "hash": "f323064ae63d54ed8d769390a968e914fbf7abacffc63e116cd2e04a08ed2d24" - } - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/_toc.yml b/_toc.yml index eec1f67..ee8c310 100644 --- a/_toc.yml +++ b/_toc.yml @@ -19,10 +19,10 @@ parts: chapters: - file: TAA1/lecture - file: TAA1/tutorial - # - caption: TAA2 - # chapters: - # - file: TAA2/lecture - # - file: TAA2/tutorial + - caption: TAA2 + chapters: + - file: TAA2/lecture + - file: TAA2/tutorial # - caption: TAA3 # chapters: # - file: TAA3/lecture