{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Rendering a Single Recent True-Color Mosaic\n", "\n", "Use the variables below to configure the pipeline output:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from datetime import date, timedelta" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# the area you want to create a true color image from; will be the first area returned from nominatim.openstreetmap.com\n", "region_of_interest = 'Berlin, Germany'\n", "# start and end of the time span from which to select satellite data\n", "start_date = date(2020, 7, 1)\n", "end_date = start_date + timedelta(days=31)\n", "# maximum amount of cloud coverage of a single product in order to be considered for the mosaic\n", "max_cloud_cover = 30\n", "# coordinate reference system of the final image\n", "target_crs = 'EPSG:25833'\n", "# should the pixels outside of the region of interest be discarded?\n", "discard_exterior_pixels = False" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pipeline\n", "\n", "All of the code below should not need to be changed." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from sentinelsat import SentinelAPI\n", "from sentinel_helpers import search_osm, plot_all\n", "import datetime\n", "import os" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "api = SentinelAPI(os.getenv('SCIHUB_USERNAME'), os.getenv('SCIHUB_PASSWORD'))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
place_idosm_typeosm_iddisplay_nameplace_rankcategorytypeimportanceicongeometry
1256375666relation62422Berlin, Deutschland8boundaryadministrative0.897539https://nominatim.openstreetmap.org/ui/mapicon...MULTIPOLYGON (((13.08835 52.41963, 13.09021 52...
\n", "
" ], "text/plain": [ " place_id osm_type osm_id display_name place_rank category \\\n", "1 256375666 relation 62422 Berlin, Deutschland 8 boundary \n", "\n", " type importance \\\n", "1 administrative 0.897539 \n", "\n", " icon \\\n", "1 https://nominatim.openstreetmap.org/ui/mapicon... \n", "\n", " geometry \n", "1 MULTIPOLYGON (((13.08835 52.41963, 13.09021 52... " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "footprint = search_osm(region_of_interest)\n", "footprint = footprint[footprint['osm_type'] == 'relation'].iloc[:1]\n", "footprint" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "convex_hull = footprint.iloc[0]['geometry'].convex_hull.wkt\n", "products = api.query(convex_hull,\n", " platformname='Sentinel-2',\n", " processinglevel='Level-2A',\n", " date=(start_date, end_date),\n", " cloudcoverpercentage=(0, max_cloud_cover))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How many results do we have?" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Found 5 results\n" ] } ], "source": [ "print('Found ' + str(len(products)) + ' results')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`products` is a map of product UUID to detailed meta information for each product. This meta information contains scene classification image and more, all if which we can use to further narrow down the products as needed." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/opt/conda/lib/python3.8/site-packages/pyproj/crs/crs.py:53: FutureWarning: '+init=:' syntax is deprecated. ':' is the preferred initialization method. When making the change, be mindful of axis order changes: https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6\n", " return _prepare_from_string(\" \".join(pjargs))\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "gdf = api.to_geodataframe(products)\n", "plot_all([gdf, footprint],\n", " [{'color': 'none', 'edgecolor': 'blue', 'alpha': 0.1, 'figsize': (16, 9)},\n", " {'color': 'none', 'edgecolor': 'red'}])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We want to select the least cloudy products" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "from tqdm.notebook import tqdm\n", "from sentinel_helpers import scihub_product_ids" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "gdf = gdf.sort_values(by='cloudcoverpercentage', ascending=False)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "3c660859c7bf4703980f41d7ae6439c5", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(HTML(value=''), FloatProgress(value=0.0, max=5.0), HTML(value='')))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "geometry = footprint.iloc[0].geometry\n", "for idx, product in tqdm(gdf.iterrows(), total=len(gdf)):\n", " union = gdf.loc[:idx].unary_union\n", " if union.contains(geometry):\n", " break" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that due to the structure of the loop above, the `tqdm` progress bar will display a number of completed loops that is one less than the number of products included." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_all([gdf.loc[:idx], footprint],\n", " [{'facecolor': 'none', 'edgecolor': 'blue', 'alpha': 0.1},\n", " {'facecolor': 'none', 'edgecolor': 'red'}])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Below you can find the products we use to plot the resulting raster file. You can use the table to find out information about the exact capture time." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
titlelinklink_alternativelink_iconsummaryondemandbeginpositionendpositioningestiondateorbitnumber...sizes2datatakeidproducttypeplatformidentifierorbitdirectionplatformserialidentifierprocessinglevelidentifieruuidgeometry
09ca3647-d666-45b8-afab-609dcfd5daf9S2A_MSIL2A_20200730T102031_N0214_R065_T33UVU_2...https://scihub.copernicus.eu/apihub/odata/v1/P...https://scihub.copernicus.eu/apihub/odata/v1/P...https://scihub.copernicus.eu/apihub/odata/v1/P...Date: 2020-07-30T10:20:31.024Z, Instrument: MS...false2020-07-30 10:20:31.0242020-07-30 10:20:31.0242020-07-30 13:31:57.38726660...808.40 MBGS2A_20200730T102031_026660_N02.14S2MSI2A2015-028ADESCENDINGSentinel-2ALevel-2AS2A_MSIL2A_20200730T102031_N0214_R065_T33UVU_2...09ca3647-d666-45b8-afab-609dcfd5daf9MULTIPOLYGON (((13.53443 52.25345, 14.36238 52...
523a8204-74b6-4acc-a5b2-33fb367249a1S2A_MSIL2A_20200730T102031_N0214_R065_T33UUU_2...https://scihub.copernicus.eu/apihub/odata/v1/P...https://scihub.copernicus.eu/apihub/odata/v1/P...https://scihub.copernicus.eu/apihub/odata/v1/P...Date: 2020-07-30T10:20:31.024Z, Instrument: MS...false2020-07-30 10:20:31.0242020-07-30 10:20:31.0242020-07-30 13:31:02.10126660...1.08 GBGS2A_20200730T102031_026660_N02.14S2MSI2A2015-028ADESCENDINGSentinel-2ALevel-2AS2A_MSIL2A_20200730T102031_N0214_R065_T33UUU_2...523a8204-74b6-4acc-a5b2-33fb367249a1MULTIPOLYGON (((12.07160 52.22621, 13.67854 52...
\n", "

2 rows × 36 columns

\n", "
" ], "text/plain": [ " title \\\n", "09ca3647-d666-45b8-afab-609dcfd5daf9 S2A_MSIL2A_20200730T102031_N0214_R065_T33UVU_2... \n", "523a8204-74b6-4acc-a5b2-33fb367249a1 S2A_MSIL2A_20200730T102031_N0214_R065_T33UUU_2... \n", "\n", " link \\\n", "09ca3647-d666-45b8-afab-609dcfd5daf9 https://scihub.copernicus.eu/apihub/odata/v1/P... \n", "523a8204-74b6-4acc-a5b2-33fb367249a1 https://scihub.copernicus.eu/apihub/odata/v1/P... \n", "\n", " link_alternative \\\n", "09ca3647-d666-45b8-afab-609dcfd5daf9 https://scihub.copernicus.eu/apihub/odata/v1/P... \n", "523a8204-74b6-4acc-a5b2-33fb367249a1 https://scihub.copernicus.eu/apihub/odata/v1/P... \n", "\n", " link_icon \\\n", "09ca3647-d666-45b8-afab-609dcfd5daf9 https://scihub.copernicus.eu/apihub/odata/v1/P... \n", "523a8204-74b6-4acc-a5b2-33fb367249a1 https://scihub.copernicus.eu/apihub/odata/v1/P... \n", "\n", " summary \\\n", "09ca3647-d666-45b8-afab-609dcfd5daf9 Date: 2020-07-30T10:20:31.024Z, Instrument: MS... \n", "523a8204-74b6-4acc-a5b2-33fb367249a1 Date: 2020-07-30T10:20:31.024Z, Instrument: MS... \n", "\n", " ondemand beginposition \\\n", "09ca3647-d666-45b8-afab-609dcfd5daf9 false 2020-07-30 10:20:31.024 \n", "523a8204-74b6-4acc-a5b2-33fb367249a1 false 2020-07-30 10:20:31.024 \n", "\n", " endposition \\\n", "09ca3647-d666-45b8-afab-609dcfd5daf9 2020-07-30 10:20:31.024 \n", "523a8204-74b6-4acc-a5b2-33fb367249a1 2020-07-30 10:20:31.024 \n", "\n", " ingestiondate orbitnumber \\\n", "09ca3647-d666-45b8-afab-609dcfd5daf9 2020-07-30 13:31:57.387 26660 \n", "523a8204-74b6-4acc-a5b2-33fb367249a1 2020-07-30 13:31:02.101 26660 \n", "\n", " ... size \\\n", "09ca3647-d666-45b8-afab-609dcfd5daf9 ... 808.40 MB \n", "523a8204-74b6-4acc-a5b2-33fb367249a1 ... 1.08 GB \n", "\n", " s2datatakeid \\\n", "09ca3647-d666-45b8-afab-609dcfd5daf9 GS2A_20200730T102031_026660_N02.14 \n", "523a8204-74b6-4acc-a5b2-33fb367249a1 GS2A_20200730T102031_026660_N02.14 \n", "\n", " producttype platformidentifier \\\n", "09ca3647-d666-45b8-afab-609dcfd5daf9 S2MSI2A 2015-028A \n", "523a8204-74b6-4acc-a5b2-33fb367249a1 S2MSI2A 2015-028A \n", "\n", " orbitdirection \\\n", "09ca3647-d666-45b8-afab-609dcfd5daf9 DESCENDING \n", "523a8204-74b6-4acc-a5b2-33fb367249a1 DESCENDING \n", "\n", " platformserialidentifier \\\n", "09ca3647-d666-45b8-afab-609dcfd5daf9 Sentinel-2A \n", "523a8204-74b6-4acc-a5b2-33fb367249a1 Sentinel-2A \n", "\n", " processinglevel \\\n", "09ca3647-d666-45b8-afab-609dcfd5daf9 Level-2A \n", "523a8204-74b6-4acc-a5b2-33fb367249a1 Level-2A \n", "\n", " identifier \\\n", "09ca3647-d666-45b8-afab-609dcfd5daf9 S2A_MSIL2A_20200730T102031_N0214_R065_T33UVU_2... \n", "523a8204-74b6-4acc-a5b2-33fb367249a1 S2A_MSIL2A_20200730T102031_N0214_R065_T33UUU_2... \n", "\n", " uuid \\\n", "09ca3647-d666-45b8-afab-609dcfd5daf9 09ca3647-d666-45b8-afab-609dcfd5daf9 \n", "523a8204-74b6-4acc-a5b2-33fb367249a1 523a8204-74b6-4acc-a5b2-33fb367249a1 \n", "\n", " geometry \n", "09ca3647-d666-45b8-afab-609dcfd5daf9 MULTIPOLYGON (((13.53443 52.25345, 14.36238 52... \n", "523a8204-74b6-4acc-a5b2-33fb367249a1 MULTIPOLYGON (((12.07160 52.22621, 13.67854 52... \n", "\n", "[2 rows x 36 columns]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gdf.loc[:idx]" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "subset = scihub_product_ids(gdf.loc[:idx])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We continue by creating the folder structure and initializing the download." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "from pathlib import Path\n", "\n", "dst_path = Path('input/raster/true_color_pipeline')" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "! mkdir -p {dst_path}" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "downloads = api.download_all(subset, dst_path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Combine the Downloaded Products" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "from collections import Counter\n", "import matplotlib.pyplot as pplt\n", "import rasterio as r\n", "from rasterio import plot as rplot\n", "from rasterio.warp import calculate_default_transform, reproject, Resampling\n", "from sentinel_helpers import RasterReaderList, scihub_band_paths\n", "\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "downloaded_paths = [d['path'] for d in downloads[0].values()]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "b11b97e846254be9820507207b110a79", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(HTML(value='Reprojecting raster files…'), FloatProgress(value=0.0, max=6.0), HTML(value='')))" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "bands = ['B02', 'B03', 'B04']\n", "reprojected_rasters = []\n", "\n", "with RasterReaderList(band for product in downloaded_paths for band in scihub_band_paths(product, bands, '10m')) as to_merge:\n", " for src in tqdm(to_merge, desc='Reprojecting raster files…'):\n", " # create a temporary file to write the output to\n", " tmp_path = Path('/tmp/reprojected/') / target_crs / Path(src.name.replace('zip+file://', '').replace('.zip!', ''))\n", " ! mkdir -p {tmp_path.parent}\n", " \n", " # this is mostly taken from https://rasterio.readthedocs.io/en/latest/topics/reproject.html\n", " transform, width, height = calculate_default_transform(\n", " src.crs, target_crs, src.width, src.height, *src.bounds)\n", " \n", " kwargs = src.meta.copy()\n", " kwargs.update({\n", " 'crs': target_crs,\n", " 'transform': transform,\n", " 'width': width,\n", " 'height': height\n", " })\n", " \n", " with r.open(tmp_path, 'w', **kwargs) as dst:\n", " for i in range(1, src.count + 1):\n", " reproject(\n", " source=r.band(src, i),\n", " destination=r.band(dst, i),\n", " src_transform=src.transform,\n", " src_crs=src.crs,\n", " dst_transform=transform,\n", " dst_crs=target_crs,\n", " resampling=Resampling.nearest)\n", " reprojected_rasters.append(tmp_path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## TODO\n", "\n", "- Merge each band individually\n", "- Combine all of the merged products as custom TCI" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from rasterio.merge import merge\n", "from collections import defaultdict" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# we build an index that allows us to access subsets of the raster path list\n", "# above by their band number because we need to merge them separately\n", "grouped_by_band = defaultdict(list)\n", "merged = {}" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pathlib" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for raster in reprojected_rasters:\n", " file_name = raster.split('/')[-1] if type(raster) == str else raster.name\n", " band = file_name.split('_')[-2]\n", " grouped_by_band[band].append(raster)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for band, paths in tqdm(grouped_by_band.items(), desc='Merging bands to cover the entire area of interest'):\n", " with RasterReaderList(paths) as raster_readers:\n", " mosaic, mosaic_transform = merge(raster_readers)\n", " merged[band] = mosaic" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "height, width = merged['B03'][0].shape\n", "kwargs = {\n", " 'count': 3,\n", " 'crs': target_crs,\n", " 'transform': transform,\n", " 'width': width,\n", " 'height': height,\n", " 'transform': mosaic_transform,\n", " 'driver': 'GTiff',\n", " 'dtype': np.uint8\n", "}" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import re\n", "\n", "out_name = re.sub(r'[^\\w]', '-', region_of_interest).lower()\n", "out_name = 'tci-' + re.sub(r'-+', '-', out_name) + '.tif'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from sentinel_helpers import scihub_normalize_range\n", "from rasterio.io import MemoryFile\n", "import rasterio.mask as rmask" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from shapely.geometry import box" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%%time\n", "kwargs = {\n", " 'count': 3,\n", " 'crs': target_crs,\n", " 'transform': transform,\n", " 'width': width,\n", " 'height': height,\n", " 'transform': mosaic_transform,\n", " 'driver': 'GTiff',\n", " 'dtype': np.uint8\n", "}\n", "\n", "with MemoryFile() as memfile, memfile.open(**kwargs) as tmp:\n", " # combine \n", " tmp.write((scihub_normalize_range(merged['B04'][0]) * 255).astype(np.uint8), 1)\n", " tmp.write((scihub_normalize_range(merged['B03'][0]) * 255).astype(np.uint8), 2)\n", " tmp.write((scihub_normalize_range(merged['B02'][0]) * 255).astype(np.uint8), 3)\n", " \n", " mask_shape = footprint.to_crs(target_crs).iloc[0].geometry\n", " if not discard_exterior_pixels:\n", " mask_shape = box(*mask_shape.bounds)\n", " \n", " masked, masked_transform = rmask.mask(tmp, shapes=[mask_shape], crop=True)\n", " \n", " # show the result\n", " pplt.figure(figsize=(20,20))\n", " rplot.show(masked, transform=masked_transform)\n", " \n", " # save the output\n", " kwargs.update({\n", " 'transform': masked_transform\n", " })\n", " with r.open(out_name, 'w', **kwargs) as dst:\n", " dst.write(tmp)\n", " print(f'Wrote resulting raster file to {out_name}!')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.8.6" } }, "nbformat": 4, "nbformat_minor": 4 }