{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Mosaic Sentinel-2 images\n", "\n", "A mosaic is a combination or merge of two or more images. With `rasterio`, you can create a single raster from multiple raster by mosaicking them together.\n", "\n", "
\n", " \"mosaic\"\n", "
" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "import glob, os\n", "import numpy as np\n", "import geopandas as gpd\n", "import rasterio\n", "import rasterio.plot\n", "from rasterio.merge import merge\n", "import matplotlib.pyplot as plt\n", "from pathlib import Path" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "**Set parameters**" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "tile_list = ['31UFS','31UFR']\n", "tile_list = ['31UFS','31UFR','31UGS','31UGR']\n", "\n", "\n", "tile_list_str = '_'.join(tile_list)\n", "\n", "nodata_val = -10000" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "**Set directory**" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/export/miro/ndeffense/LBRAT2104/STUDENTS/GROUP_99/TP/5_L2A_MOSAIC_31UFS_31UFR_31UGS_31UGR/\n" ] } ], "source": [ "computer_path = '/export/miro/ndeffense/LBRAT2104/'\n", "grp_nb = '99'\n", "\n", "# Directory for all work files\n", "work_path = f'{computer_path}STUDENTS/GROUP_{grp_nb}/TP/'\n", "\n", "\n", "masked_path = f'{work_path}3_L2A_MASKED_4tiles/'\n", "mosaic_path = f'{work_path}5_L2A_MOSAIC_{tile_list_str}/'\n", "\n", "print(mosaic_path)\n", "\n", "Path(mosaic_path).mkdir(parents=True, exist_ok=True)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "There are 51 images\n" ] } ], "source": [ "list_im_masked_one_tile = glob.glob(f'{masked_path}*{tile_list[0]}*_ROI_SCL.tif')\n", "list_im_masked_all_tile = glob.glob(f'{masked_path}*_ROI_SCL.tif')\n", "\n", "print(f'There are {len(list_im_masked_one_tile)} images')" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Date : 20200805 - Band : B11\n", "There are at least 2 images to mosaic\n", "Date : 20200805 - Band : B11\n", "There are at least 2 images to mosaic\n", "Date : 20200805 - Band : B11\n", "There are at least 2 images to mosaic\n", "['/export/miro/ndeffense/LBRAT2104/STUDENTS/GROUP_99/TP/3_L2A_MASKED_4tiles/T31UFS_20200805T104031_B11_10m_ROI_SCL.tif', '/export/miro/ndeffense/LBRAT2104/STUDENTS/GROUP_99/TP/3_L2A_MASKED_4tiles/T31UFR_20200805T104031_B11_10m_ROI_SCL.tif', '/export/miro/ndeffense/LBRAT2104/STUDENTS/GROUP_99/TP/3_L2A_MASKED_4tiles/T31UGS_20200805T104031_B11_10m_ROI_SCL.tif', '/export/miro/ndeffense/LBRAT2104/STUDENTS/GROUP_99/TP/3_L2A_MASKED_4tiles/T31UGR_20200805T104031_B11_10m_ROI_SCL.tif']\n", "/export/miro/ndeffense/LBRAT2104/STUDENTS/GROUP_99/TP/5_L2A_MOSAIC_31UFS_31UFR_31UGS_31UGR/T31UFS_20200805T104031_B11_10m_ROI_SCL_mosaic_31UFS_31UFR_31UGS_31UGR.tif\n", "Date : 20200805 - Band : B04\n", "There are at least 2 images to mosaic\n", "Date : 20200805 - Band : B04\n", "There are at least 2 images to mosaic\n", "Date : 20200805 - Band : B04\n", "There are at least 2 images to mosaic\n", "['/export/miro/ndeffense/LBRAT2104/STUDENTS/GROUP_99/TP/3_L2A_MASKED_4tiles/T31UFS_20200805T104031_B04_10m_ROI_SCL.tif', '/export/miro/ndeffense/LBRAT2104/STUDENTS/GROUP_99/TP/3_L2A_MASKED_4tiles/T31UFR_20200805T104031_B04_10m_ROI_SCL.tif', '/export/miro/ndeffense/LBRAT2104/STUDENTS/GROUP_99/TP/3_L2A_MASKED_4tiles/T31UGS_20200805T104031_B04_10m_ROI_SCL.tif', '/export/miro/ndeffense/LBRAT2104/STUDENTS/GROUP_99/TP/3_L2A_MASKED_4tiles/T31UGR_20200805T104031_B04_10m_ROI_SCL.tif']\n", "/export/miro/ndeffense/LBRAT2104/STUDENTS/GROUP_99/TP/5_L2A_MOSAIC_31UFS_31UFR_31UGS_31UGR/T31UFS_20200805T104031_B04_10m_ROI_SCL_mosaic_31UFS_31UFR_31UGS_31UGR.tif\n", "Date : 20200805 - Band : B08\n", "There are at least 2 images to mosaic\n", "Date : 20200805 - Band : B08\n", "There are at least 2 images to mosaic\n", "Date : 20200805 - Band : B08\n", "There are at least 2 images to mosaic\n", "['/export/miro/ndeffense/LBRAT2104/STUDENTS/GROUP_99/TP/3_L2A_MASKED_4tiles/T31UFS_20200805T104031_B08_10m_ROI_SCL.tif', '/export/miro/ndeffense/LBRAT2104/STUDENTS/GROUP_99/TP/3_L2A_MASKED_4tiles/T31UFR_20200805T104031_B08_10m_ROI_SCL.tif', '/export/miro/ndeffense/LBRAT2104/STUDENTS/GROUP_99/TP/3_L2A_MASKED_4tiles/T31UGS_20200805T104031_B08_10m_ROI_SCL.tif', '/export/miro/ndeffense/LBRAT2104/STUDENTS/GROUP_99/TP/3_L2A_MASKED_4tiles/T31UGR_20200805T104031_B08_10m_ROI_SCL.tif']\n", "/export/miro/ndeffense/LBRAT2104/STUDENTS/GROUP_99/TP/5_L2A_MOSAIC_31UFS_31UFR_31UGS_31UGR/T31UFS_20200805T104031_B08_10m_ROI_SCL_mosaic_31UFS_31UFR_31UGS_31UGR.tif\n" ] } ], "source": [ "for im_file_1 in list_im_masked_one_tile:\n", "\n", " im_to_mosaic_list = [im_file_1]\n", " \n", " # Get date of image\n", " date_1 = os.path.basename(im_file_1)[7:7+8]\n", "\n", " # Get tile of image\n", " tile_1 = os.path.basename(im_file_1)[0:6]\n", "\n", " # Get spectral band\n", " band_1 = os.path.basename(im_file_1)[23:26]\n", "\n", "\n", " for im_file_2 in list_im_masked_all_tile:\n", " \n", " # Get date of image\n", " date_2 = os.path.basename(im_file_2)[7:7+8]\n", "\n", " # Get tile of image\n", " tile_2 = os.path.basename(im_file_2)[0:6]\n", "\n", " # Get spectral band\n", " band_2 = os.path.basename(im_file_2)[23:26]\n", "\n", " if date_1 == date_2:\n", " if band_1 == band_2:\n", " if tile_1 != tile_2:\n", " print(f'Date : {date_1} - Band : {band_1}')\n", " print('There are at least 2 images to mosaic')\n", " \n", " im_to_mosaic_list.append(im_file_2)\n", " \n", " \n", " if len(im_to_mosaic_list) > 1:\n", "\n", " print(im_to_mosaic_list)\n", " \n", " mosaic_file = f'{mosaic_path}{os.path.basename(im_file_1)[:-4]}_mosaic_{tile_list_str}.tif'\n", "\n", " print(mosaic_file)\n", "\n", " src_files_to_mosaic = []\n", " for file in im_to_mosaic_list:\n", " src = rasterio.open(file)\n", " src_files_to_mosaic.append(src)\n", " \n", " src_files_to_mosaic[0].meta\n", "\n", " mosaic, out_trans = merge(src_files_to_mosaic)\n", "\n", " out_meta = src_files_to_mosaic[0].meta.copy()\n", " out_meta.update({\"driver\": \"GTiff\",\n", " \"height\": mosaic.shape[1],\n", " \"width\": mosaic.shape[2],\n", " \"transform\": out_trans})\n", "\n", " with rasterio.open(mosaic_file, \"w\", **out_meta) as dst:\n", " dst.write(mosaic)\n", " \n", " for src in src_files_to_mosaic:\n", " src.close()" ] } ], "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.10.8" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }