=== versions === python 3.12.0 | odc-stac 0.5.3 | xarray 2026.9.0 | numpy 2.5.4 | pillow 13.0.0 | imageio-ffmpeg 0.8.0 (ffmpeg 9.0.2-essentials_build-www.gyan.dev) === Step 1: Sentinel-2 L2A scenes over Hinkley Point, April-September 2016-2026 === 2016: 22 scenes with tile cloud < 80% 2017: 28 scenes with tile cloud < 80% 2018: 39 scenes with tile cloud < 80% 2019: 49 scenes with tile cloud < 80% 2020: 56 scenes with tile cloud < 80% 2021: 50 scenes with tile cloud < 80% 2022: 42 scenes with tile cloud < 80% 2023: 37 scenes with tile cloud < 80% 2024: 32 scenes with tile cloud < 80% 2025: 69 scenes with tile cloud < 80% 2026: 68 scenes with tile cloud < 80% 492 candidate scenes in total === Step 2: clear fraction inside the area, from each scene's SCL band === read SCL for 492 scenes on a 300 x 225 grid in 4 s candidates kept median_clear year 2016 22 4 17% 2017 28 9 41% 2018 39 16 77% 2019 49 17 73% 2020 56 28 77% 2021 50 30 70% 2022 42 28 72% 2023 37 22 60% 2024 32 16 41% 2025 69 40 56% 2026 68 31 82% kept 241 of 492 scenes; correlation of tile cloud with area clear fraction: -0.58 === Step 3: load the kept scenes at 10 m and mask cloud and shadow === loaded 241 scenes x 5 bands on a 600 x 450 grid in 23 s baselines: 02.12 (75), 03.00 (29), 04.00 (8), 05.09 (5), 05.10 (47), 05.11 (46), 05.12 (28), 05.13 (3) SCL masks 13.8% of kept pixels; with a 30 m buffer 16.7% === Step 4: one median composite per summer === 2016: 4 scenes; clear observations per pixel min 0, median 3; never clear 0.36% (filled from unmasked scenes) 2017: 9 scenes; clear observations per pixel min 0, median 7; never clear 0.07% (filled from unmasked scenes) 2018: 16 scenes; clear observations per pixel min 0, median 13; never clear 0.06% (filled from unmasked scenes) 2019: 17 scenes; clear observations per pixel min 0, median 14; never clear 0.31% (filled from unmasked scenes) 2020: 28 scenes; clear observations per pixel min 0, median 22; never clear 0.20% (filled from unmasked scenes) 2021: 30 scenes; clear observations per pixel min 0, median 25; never clear 0.09% (filled from unmasked scenes) 2022: 28 scenes; clear observations per pixel min 14, median 24; never clear 0.00% (filled from unmasked scenes) 2023: 22 scenes; clear observations per pixel min 6, median 19; never clear 0.00% (filled from unmasked scenes) 2024: 16 scenes; clear observations per pixel min 3, median 13; never clear 0.00% (filled from unmasked scenes) 2025: 40 scenes; clear observations per pixel min 18, median 34; never clear 0.00% (filled from unmasked scenes) 2026: 31 scenes; clear observations per pixel min 16, median 27; never clear 0.00% (filled from unmasked scenes) === Step 5: a consistent stretch === global stretch (reflectance) R/G/B low 0.029 / 0.048 / 0.024, high 0.248 / 0.222 / 0.198, gamma 1.4 per-frame red limits move between years: high 0.212-0.263, low 0.023-0.033 (the global stretch fixes them at 0.248 and 0.029) a red reflectance of 0.1 is drawn at 0.42-0.52 of full brightness with per-frame stretches, and at 0.45 in every frame with one stretch === Step 6: label the frames and export GIF, WebP and MP4 === 11 frames of 800 x 640 px GIF 2.44 MB (11 frames at 600 x 480 px, 256 colours per frame) WebP 0.44 MB (lossy, quality 80) MP4 0.75 MB (194 frames at 12 fps, 16.2 s, H.264 CRF 26) poster PNG 0.66 MB === Step 7: how much of the site changes from year to year === year changed_since_2016_ha unvegetated_ha site_mean_ndvi 2016 0 116 0.25 2017 92 158 0.16 2018 98 145 0.17 2019 98 141 0.19 2020 106 138 0.21 2021 105 136 0.22 2022 113 137 0.20 2023 123 141 0.21 2024 120 138 0.23 2025 118 136 0.21 2026 116 135 0.24 site box 195 ha; changed since 2016: 116 ha by 2026 (59%); unvegetated share 60%-81% in every year finished in 1.0 min