diff --git a/_static/custom.css b/_static/custom.css index e49cdc4..a6b4aca 100644 --- a/_static/custom.css +++ b/_static/custom.css @@ -1,4 +1,3 @@ div.navbar-brand-box a.navbar-brand img { - max-height: unset !important; - max-width: 80% + max-height: 13em !important; } diff --git a/_toc.yml b/_toc.yml index cb4e2c8..39754e9 100644 --- a/_toc.yml +++ b/_toc.yml @@ -1,17 +1,17 @@ # Table of contents # Learn more at https://jupyterbook.org/customize/toc.html -- file: README - title: "Remote Sensing for Journalism" +- file: "README.md" - part: "Data Retrieval and Processing" chapters: - file: "sources/01 Overview.md" - file: "sources/01a Download from Scihub.ipynb" - file: "sources/01b Plot downloaded products.ipynb" - file: "sources/01c Coverage analysis.ipynb" - - file: "sources/1d Brandenburg mosaic.ipynb" + - file: "sources/01d Brandenburg mosaic.ipynb" - file: "sources/01e True-color pipeline.ipynb" - part: "Spectral Indices" chapters: + - file: "sources/02 Overview.md" - file: "sources/02a NDVI.ipynb" - file: "sources/02b Timeseries.ipynb" sections: @@ -21,6 +21,7 @@ - file: "sources/02e Spectral Indices.ipynb" - part: "Burn Ratio Calculations" chapters: + - file: "sources/03 Overview.md" - file: "sources/03a Forest Fire Product Downloads.ipynb" - file: "sources/03b Example Initialized Downloads.ipynb" - file: "sources/03b Forest Fires 2018 and 2019.ipynb" diff --git a/sources/02 Overview.md b/sources/02 Overview.md new file mode 100644 index 0000000..7c5a467 --- /dev/null +++ b/sources/02 Overview.md @@ -0,0 +1,9 @@ +# Overview + +The parts of the Sentinel-2 data that extend the visible spectrum can be used to calculate _Spectral Indices_ or _Spectral Indicators_. + +These indicators can be used for a range of different tasks. The Normalised Difference in Water Index (NDWI) for example gives information about how likely a pixel represents water, the Bare-Soil Index (BSI) gives an estimate about how likely a pixel represents unvegetaed soil. Other indices give an indication about vegetation health or plant activity using reflectance properties of the ground in different spectra of light. + +This chapter explores how to calculate these indices over long and short time spans, leveraging the high spatial resolution to provide highly localized information using these indices. + +It ends with a notebook that implements the BSI, the NDWI, the Normalized Difference In Vegetation Index (NDVI) and the Normalized Burn Ratio (NBR) which can be used to determine burn severity after a fire. The implementation is extensible enough to perform many different kinds of index calculations on downloaded products with only minimal changes. diff --git a/sources/02e Spectral Indices.ipynb b/sources/02e Spectral Indices.ipynb index 604893e..ed6afd8 100644 --- a/sources/02e Spectral Indices.ipynb +++ b/sources/02e Spectral Indices.ipynb @@ -152,10 +152,12 @@ "outputs": [], "source": [ "indices = {\n", - " # normalized difference in vegetation\n", - " 'ndvi': (div, (sub, 'B08', 'B04'), (add, 'B08', 'B04')),\n", " # normalized burn ratio\n", " 'nbr': (div, (sub, 'B08', 'B12'), (add, 'B08', 'B12')),\n", + " # normalized difference in vegetation\n", + " 'ndvi': (div, (sub, 'B08', 'B04'), (add, 'B08', 'B04')),\n", + " # normalized difference in water index\n", + " 'ndwi': (div (sub, 'B03', 'B08'), (add, 'B03', 'B08')),\n", " # bare soil index\n", " 'bsi': (div, (sub, (add, 'B11', 'B04'), (add, 'B08', 'B02')),\n", " (add, (add, 'B11', 'B04'), (add, 'B08', 'B02')))\n", diff --git a/sources/03 Overview.md b/sources/03 Overview.md new file mode 100644 index 0000000..07dd0c5 --- /dev/null +++ b/sources/03 Overview.md @@ -0,0 +1 @@ +# Overview diff --git a/sources/03b Forest Fires 2018 and 2019.ipynb b/sources/03b Forest Fires 2018 and 2019.ipynb index 54d329d..0458ef5 100644 --- a/sources/03b Forest Fires 2018 and 2019.ipynb +++ b/sources/03b Forest Fires 2018 and 2019.ipynb @@ -81,10 +81,10 @@ { "data": { "text/html": [ - "
Make this Notebook Trusted to load map: File -> Trust Notebook
" + "
Make this Notebook Trusted to load map: File -> Trust Notebook
" ], "text/plain": [ - "" + "" ] }, "execution_count": 4, @@ -299,7 +299,50 @@ "cell_type": "code", "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2702698598e54e98af641ec984eaf23f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(HTML(value='Downloading'), FloatProgress(value=0.0, max=24010296.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9f3cae91148b47a4adc90687cdb8050f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(HTML(value='MD5 checksumming'), FloatProgress(value=0.0, max=24010296.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], "source": [ "out_dir.mkdir(exist_ok=True, parents=True)\n", "downloaded, initialized, failed = api.download_all(product_uuids_2018, out_dir)" @@ -313,7 +356,7 @@ { "data": { "text/plain": [ - "1" + "2" ] }, "execution_count": 15, @@ -353,7 +396,7 @@ { "data": { "text/plain": [ - "1" + "0" ] }, "execution_count": 17, @@ -380,7 +423,8 @@ { "data": { "text/plain": [ - "[None]" + "[None,\n", + " 'input/forest_fires/S2A_MSIL2A_20180919T102021_N0208_R065_T33UUT_20180919T132226.zip']" ] }, "execution_count": 18, @@ -497,10 +541,10 @@ { "data": { "text/html": [ - "
Make this Notebook Trusted to load map: File -> Trust Notebook
" + "
Make this Notebook Trusted to load map: File -> Trust Notebook
" ], "text/plain": [ - "" + "" ] }, "execution_count": 20, @@ -536,10 +580,10 @@ { "data": { "text/html": [ - "
Make this Notebook Trusted to load map: File -> Trust Notebook
" + "
Make this Notebook Trusted to load map: File -> Trust Notebook
" ], "text/plain": [ - "" + "" ] }, "execution_count": 22, @@ -715,7 +759,50 @@ "cell_type": "code", "execution_count": 29, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ea9d141fa8814b688226635222a65450", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(HTML(value='Downloading'), FloatProgress(value=0.0, max=14958136.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "08fa6fd7ca854550804209fa5d4bf922", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(HTML(value='MD5 checksumming'), FloatProgress(value=0.0, max=14958136.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], "source": [ "downloaded, initialized, failed = api.download_all(product_uuids_2019, out_dir)" ] @@ -728,7 +815,7 @@ { "data": { "text/plain": [ - "0" + "1" ] }, "execution_count": 30, @@ -768,7 +855,7 @@ { "data": { "text/plain": [ - "2" + "1" ] }, "execution_count": 32, @@ -788,17 +875,7 @@ { "data": { "text/plain": [ - "{'42633406-e729-4d38-94df-942813cac1c0': {'id': '42633406-e729-4d38-94df-942813cac1c0',\n", - " 'title': 'S2A_MSIL2A_20190613T101031_N0212_R022_T33UUT_20190614T125329',\n", - " 'size': 1111903391,\n", - " 'md5': '1979124f0a7e11f4b134c36e1516ccce',\n", - " 'date': datetime.datetime(2019, 6, 13, 10, 10, 31, 24000),\n", - " 'footprint': 'POLYGON((12.109949135874256 51.62754367459543,12.12855260381174 51.67223353291847,12.189749670211857 51.8181446227169,12.251335944032553 51.96394652824928,12.313165570575627 52.109686926175314,12.374979421078276 52.25542506753664,12.402567238605169 52.3200953024738,13.675924550313963 52.34305438492137,13.704578464673325 51.35607984388353,12.12921085152078 51.3280532483229,12.109949135874256 51.62754367459543))',\n", - " 'url': \"https://scihub.copernicus.eu/apihub/odata/v1/Products('42633406-e729-4d38-94df-942813cac1c0')/$value\",\n", - " 'Online': False,\n", - " 'Creation Date': datetime.datetime(2019, 6, 15, 0, 11, 53, 498000),\n", - " 'Ingestion Date': datetime.datetime(2019, 6, 14, 22, 44, 51, 876000)},\n", - " '1e9358eb-2c1e-45a5-aabd-ee7b193eda0e': {'id': '1e9358eb-2c1e-45a5-aabd-ee7b193eda0e',\n", + "{'1e9358eb-2c1e-45a5-aabd-ee7b193eda0e': {'id': '1e9358eb-2c1e-45a5-aabd-ee7b193eda0e',\n", " 'title': 'S2A_MSIL2A_20190603T101031_N0212_R022_T33UUT_20190603T114652',\n", " 'size': 1099877545,\n", " 'md5': 'b6472601cbf27fd3fe121e9e8ce15c99',\n", @@ -839,7 +916,18 @@ { "data": { "text/plain": [ - "[]" + "[{'id': '99c568e9-8f98-4263-bc66-d8450658cdc8',\n", + " 'title': 'S2A_MSIL2A_20190626T102031_N0212_R065_T33UUT_20190626T125319',\n", + " 'size': 14958136,\n", + " 'md5': '310c0479f5b346cb07796b51659eb9e8',\n", + " 'date': datetime.datetime(2019, 6, 26, 10, 20, 31, 24000),\n", + " 'footprint': 'POLYGON((12.065798228229744 52.31402323817268,13.675924550313963 52.34305438492137,13.704578464673325 51.35607984388353,12.12921085152078 51.3280532483229,12.065798228229744 52.31402323817268))',\n", + " 'url': \"https://scihub.copernicus.eu/apihub/odata/v1/Products('99c568e9-8f98-4263-bc66-d8450658cdc8')/$value\",\n", + " 'Online': True,\n", + " 'Creation Date': datetime.datetime(2019, 6, 27, 18, 44, 15, 261000),\n", + " 'Ingestion Date': datetime.datetime(2019, 6, 27, 18, 43, 49, 503000),\n", + " 'path': 'input/forest_fires/S2A_MSIL2A_20190626T102031_N0212_R065_T33UUT_20190626T125319.zip',\n", + " 'downloaded_bytes': 14958136}]" ] }, "execution_count": 34, @@ -859,7 +947,7 @@ { "data": { "text/plain": [ - "[]" + "['input/forest_fires/S2A_MSIL2A_20190626T102031_N0212_R065_T33UUT_20190626T125319.zip']" ] }, "execution_count": 35, @@ -973,10 +1061,10 @@ { "data": { "text/html": [ - "
Make this Notebook Trusted to load map: File -> Trust Notebook
" + "
Make this Notebook Trusted to load map: File -> Trust Notebook
" ], "text/plain": [ - "" + "" ] }, "execution_count": 37, @@ -1483,8 +1571,50 @@ "outputs": [ { "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0f9702cfa96540eb93473a6b1bb363ff", + "version_major": 2, + "version_minor": 0 + }, "text/plain": [ - "(2, 1, 0)" + "HBox(children=(HTML(value='Downloading'), FloatProgress(value=0.0, max=17260088.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "82748c2890794d218471ce7207fc5317", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(HTML(value='MD5 checksumming'), FloatProgress(value=0.0, max=17260088.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/plain": [ + "(3, 0, 0)" ] }, "execution_count": 47, @@ -1512,7 +1642,9 @@ { "data": { "text/plain": [ - "[None, None]" + "[None,\n", + " None,\n", + " 'input/forest_fires/S2A_MSIL2A_20190629T103031_N0212_R108_T32UPE_20190629T135351.zip']" ] }, "execution_count": 48,