logo

Please note that this repository is used for development and review, so quality assessments should be considered work in progress until they are merged into the main branch

1.5.1. Satellite Soil Moisture Data for Drought Detection in Europe#

Production date: 16-June-2024

Produced by: Amaya Camila Trigoso Barrientos (VUB)

🌍 Use case: Drought detection and monitoring on a regional level#

❓ Quality assessment question(s)#

  • Can satellite soil moisture data be used to detect the historically reported drought of 2023 in Europe?

Accurate soil moisture data is critical for monitoring droughts. The Copernicus Climate Change Service (C3S) provides the Combined Surface Soil Moisture (C3S-SM-COMBINED) product, which integrates active and passive microwave satellite observations to estimate surface (top few centimeters) soil moisture at a high temporal resolution (ICDR updated on a 10-day cycle). This study evaluates the usability of this dataset for tracking drought evolution across Europe in the warm season of 2023. The analysis focuses on dekadal anomalies of surface soil moisture (SSMA) from April to July 2023, highlighting regional differences, data coverage, and consistency with reported drought conditions.

📢 Quality assessment statement#

These are the key outcomes of this assessment

  • The C3S surface soil moisture product is a valuable Essential Climate Variable (ECV) for tracking agricultural drought, especially when used alongside complementary indicators like root zone soil moisture, precipitation anomalies, and vegetation indices.

  • The COMBINED product successfully captures the intense drought in the Iberian Peninsula during spring 2023, consistent with observed heatwaves and low rainfall.

  • Coverage in Scandinavia and the Nordic region is still limited in spring due to snow, highlighting a known limitation of satellite-based soil moisture retrieval under frozen or snow-covered conditions.

📋 Methodology#

The analysis and results are organized in the following steps, which are detailed in the sections below:

1. Request and download data

  • Download the combined passive and active satellite soil moisture data from 1991 to 2023. Select the volumetric_surface_soil_moisture variable and choose the 10-day average as the time aggregation option.

2. Calculate Surface Soil Moisture Anomaly

  • Extract soil moisture data in Europe.

  • Calculate the dekad mean and standard deviation for the long-term period 1991 to 2020.

  • Extract 2023 data into a separate set.

  • Calculate the SSMA for 2023 in relation to the long-term period data.

3. SSMA visualization

  • Map the SSMA in Europe for Spring-Mid Summer 2023.

  • Plot the mean SSMA over time for specific regions.

  • Analyze the results.

📈 Analysis and results#

1. Request and download data#

Import packages#

Hide code cell source
import xarray as xr
import numpy as np
import fsspec
import os
import geopandas
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D 
import matplotlib.colors as mcolors
import matplotlib.gridspec as gridspec
import shapely.geometry
from shapely.geometry import Point
from shapely.geometry import MultiPolygon
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from c3s_eqc_automatic_quality_control import download
from matplotlib import animation, pyplot as plt
from matplotlib.patches import Rectangle
from matplotlib import path
import matplotlib.dates as mdates
import rioxarray as rxr
import requests
import zipfile
os.environ["CDSAPI_RC"] = os.path.expanduser("~/trigoso_camila/.cdsapirc")
plt.style.use("seaborn-v0_8-notebook")

Set variables#

Hide code cell source
shapefile_url = "https://figshare.com/ndownloader/files/23392280"

Set the data request#

Hide code cell source
collection_id = "satellite-soil-moisture"
request = {
    "variable": ["volumetric_surface_soil_moisture"],
    "type_of_sensor": ["combined_passive_and_active"],
    "time_aggregation": ["10_day_average"],
    "year": [
        "1991", "1992", "1993",
        "1994", "1995", "1996",
        "1997", "1998", "1999",
        "2000", "2001", "2002",
        "2003", "2004", "2005",
        "2006", "2007", "2008",
        "2009", "2010", "2011",
        "2012", "2013", "2014",
        "2015", "2016", "2017",
        "2018", "2019", "2020",
        "2021", "2022", "2023"
    ],
    "month": [
        "01", "02", "03",
        "04", "05", "06",
        "07", "08", "09",
        "10", "11", "12"
    ],
    "day": ["01", "11", "21"],
    "type_of_record": ["cdr"],
    "version": ["v202312"]
}

Download data#

Hide code cell source
# Dataset
ds = download.download_and_transform(
    collection_id,
    request,
    chunks={"year": 1},
    transform_chunks=False,
)


# Shapefile
with fsspec.open(f"simplecache::{shapefile_url}") as file:
    world_shape = geopandas.read_file(file)
Hide code cell output
  0%|          | 0/33 [00:00<?, ?it/s]2025-05-30 13:58:16,664 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 13:58:16,859 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 13:58:17,533 INFO Request ID is 967eb086-6518-4236-90a7-8d566f97c596
2025-05-30 13:58:17,577 INFO status has been updated to accepted
2025-05-30 13:58:52,919 INFO status has been updated to running
2025-05-30 13:59:10,025 INFO status has been updated to successful

86ae92af8d0f26fa9731dcfbdac52901.zip:   0%|          | 0.00/23.6M [00:00<?, ?B/s]
86ae92af8d0f26fa9731dcfbdac52901.zip:  17%|█▋        | 4.00M/23.6M [00:00<00:00, 39.8MB/s]
86ae92af8d0f26fa9731dcfbdac52901.zip:  59%|█████▉    | 14.0M/23.6M [00:00<00:00, 74.1MB/s]
                                                                                          
  0%|          | 0/36 [00:00<?, ?it/s]
  3%|▎         | 1/33 [00:55<29:40, 55.63s/it]2025-05-30 13:59:12,509 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 13:59:12,529 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 13:59:12,878 INFO Request ID is 1d5a35a7-8be6-4175-ab7a-8c6276ec5db7
2025-05-30 13:59:12,966 INFO status has been updated to accepted
2025-05-30 14:00:03,061 INFO status has been updated to running
2025-05-30 14:00:28,770 INFO status has been updated to successful

9cb84068c0190fade02b3b9d5387ecfc.zip:   0%|          | 0.00/26.0M [00:00<?, ?B/s]
9cb84068c0190fade02b3b9d5387ecfc.zip:  15%|█▌        | 4.00M/26.0M [00:00<00:00, 41.1MB/s]
9cb84068c0190fade02b3b9d5387ecfc.zip:  50%|████▉     | 13.0M/26.0M [00:00<00:00, 68.9MB/s]
9cb84068c0190fade02b3b9d5387ecfc.zip:  85%|████████▍ | 22.0M/26.0M [00:00<00:00, 79.4MB/s]
                                                                                          
  0%|          | 0/36 [00:00<?, ?it/s]
  6%|▌         | 2/33 [02:13<35:37, 68.95s/it]2025-05-30 14:00:31,102 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:00:31,157 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:00:31,376 INFO Request ID is d5a95d60-2043-4138-ad8d-250005f98a07
2025-05-30 14:00:31,415 INFO status has been updated to accepted
2025-05-30 14:00:45,337 INFO status has been updated to running
2025-05-30 14:01:21,898 INFO status has been updated to successful

8a4cb70ed14343bbd1573f68a252ed83.zip:   0%|          | 0.00/26.1M [00:00<?, ?B/s]
8a4cb70ed14343bbd1573f68a252ed83.zip:  19%|█▉        | 5.00M/26.1M [00:00<00:00, 50.2MB/s]
8a4cb70ed14343bbd1573f68a252ed83.zip:  57%|█████▋    | 15.0M/26.1M [00:00<00:00, 77.4MB/s]
8a4cb70ed14343bbd1573f68a252ed83.zip:  92%|█████████▏| 24.0M/26.1M [00:00<00:00, 84.8MB/s]
                                                                                          
  0%|          | 0/36 [00:00<?, ?it/s]
  9%|▉         | 3/33 [03:07<31:01, 62.06s/it]2025-05-30 14:01:24,585 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:01:24,606 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:01:25,751 INFO Request ID is bac30811-b400-49ce-91c2-40031921beab
2025-05-30 14:01:25,791 INFO status has been updated to accepted
2025-05-30 14:01:48,542 INFO status has been updated to running
2025-05-30 14:02:17,300 INFO status has been updated to successful

275a343c8f692cce5fed684ac383849f.zip:   0%|          | 0.00/26.2M [00:00<?, ?B/s]
275a343c8f692cce5fed684ac383849f.zip:   8%|▊         | 2.00M/26.2M [00:00<00:01, 19.2MB/s]
275a343c8f692cce5fed684ac383849f.zip:  38%|███▊      | 10.0M/26.2M [00:00<00:00, 53.3MB/s]
275a343c8f692cce5fed684ac383849f.zip:  76%|███████▋  | 20.0M/26.2M [00:00<00:00, 72.5MB/s]
                                                                                          
  0%|          | 0/36 [00:00<?, ?it/s]
 12%|█▏        | 4/33 [04:02<28:33, 59.10s/it]2025-05-30 14:02:19,150 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:02:19,248 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:02:19,528 INFO Request ID is d5cf5bf0-78ef-4366-b9cd-de981f790ddb
2025-05-30 14:02:19,546 INFO status has been updated to accepted
2025-05-30 14:02:27,786 INFO status has been updated to running
2025-05-30 14:03:09,218 INFO status has been updated to successful

82aacc5742394dc259c508ad10c1aa79.zip:   0%|          | 0.00/26.6M [00:00<?, ?B/s]
82aacc5742394dc259c508ad10c1aa79.zip:  11%|█▏        | 3.00M/26.6M [00:00<00:00, 30.9MB/s]
82aacc5742394dc259c508ad10c1aa79.zip:  45%|████▌     | 12.0M/26.6M [00:00<00:00, 66.5MB/s]
82aacc5742394dc259c508ad10c1aa79.zip:  83%|████████▎ | 22.0M/26.6M [00:00<00:00, 83.5MB/s]
                                                                                          
  0%|          | 0/36 [00:00<?, ?it/s]
 15%|█▌        | 5/33 [04:54<26:20, 56.45s/it]2025-05-30 14:03:10,712 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:03:10,755 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:03:11,229 INFO Request ID is 1e44b1ed-e618-4f73-87c1-8d9cb3982e1b
2025-05-30 14:03:11,269 INFO status has been updated to accepted
2025-05-30 14:03:44,123 INFO status has been updated to running
2025-05-30 14:04:01,238 INFO status has been updated to successful

ba2522f33da81a879f84e729c093854b.zip:   0%|          | 0.00/26.2M [00:00<?, ?B/s]
ba2522f33da81a879f84e729c093854b.zip:  23%|██▎       | 6.00M/26.2M [00:00<00:00, 57.7MB/s]
ba2522f33da81a879f84e729c093854b.zip:  53%|█████▎    | 14.0M/26.2M [00:00<00:00, 71.5MB/s]
ba2522f33da81a879f84e729c093854b.zip:  92%|█████████▏| 24.0M/26.2M [00:00<00:00, 83.1MB/s]
                                                                                          
  0%|          | 0/36 [00:00<?, ?it/s]
 18%|█▊        | 6/33 [05:46<24:47, 55.08s/it]2025-05-30 14:04:03,245 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:04:03,328 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:04:03,630 INFO Request ID is 7939fad6-0848-4c05-946a-4eec7689339a
2025-05-30 14:04:03,669 INFO status has been updated to accepted
2025-05-30 14:04:25,019 INFO status has been updated to running
2025-05-30 14:04:53,667 INFO status has been updated to successful

e8e7e4a6c2e2963373d9a87c7fada1f9.zip:   0%|          | 0.00/26.6M [00:00<?, ?B/s]
e8e7e4a6c2e2963373d9a87c7fada1f9.zip:  15%|█▌        | 4.00M/26.6M [00:00<00:00, 37.8MB/s]
e8e7e4a6c2e2963373d9a87c7fada1f9.zip:  53%|█████▎    | 14.0M/26.6M [00:00<00:00, 74.7MB/s]
e8e7e4a6c2e2963373d9a87c7fada1f9.zip:  90%|█████████ | 24.0M/26.6M [00:00<00:00, 87.4MB/s]
                                                                                          
  0%|          | 0/36 [00:00<?, ?it/s]
 21%|██        | 7/33 [06:38<23:28, 54.19s/it]2025-05-30 14:04:55,489 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:04:55,515 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:04:55,802 INFO Request ID is 8303497f-ab10-46ba-ac0b-dc30693c56a1
2025-05-30 14:04:55,824 INFO status has been updated to accepted
2025-05-30 14:05:16,871 INFO status has been updated to running
2025-05-30 14:05:45,474 INFO status has been updated to successful

e9af2272cdaf443ae4ff9416f2469085.zip:   0%|          | 0.00/26.9M [00:00<?, ?B/s]
e9af2272cdaf443ae4ff9416f2469085.zip:   4%|▎         | 1.00M/26.9M [00:01<00:26, 1.04MB/s]
e9af2272cdaf443ae4ff9416f2469085.zip:  15%|█▍        | 4.00M/26.9M [00:01<00:05, 4.73MB/s]
e9af2272cdaf443ae4ff9416f2469085.zip:  37%|███▋      | 10.0M/26.9M [00:01<00:01, 12.7MB/s]
e9af2272cdaf443ae4ff9416f2469085.zip:  60%|█████▉    | 16.0M/26.9M [00:01<00:00, 19.8MB/s]
e9af2272cdaf443ae4ff9416f2469085.zip:  74%|███████▍  | 20.0M/26.9M [00:03<00:01, 4.91MB/s]
e9af2272cdaf443ae4ff9416f2469085.zip:  86%|████████▌ | 23.0M/26.9M [00:03<00:00, 5.57MB/s]
e9af2272cdaf443ae4ff9416f2469085.zip:  93%|█████████▎| 25.0M/26.9M [00:04<00:00, 6.18MB/s]
e9af2272cdaf443ae4ff9416f2469085.zip: 100%|██████████| 26.9M/26.9M [00:04<00:00, 7.03MB/s]
                                                                                          
  0%|          | 0/36 [00:00<?, ?it/s]
 24%|██▍       | 8/33 [07:34<22:50, 54.81s/it]2025-05-30 14:05:51,631 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:05:51,671 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:05:52,944 INFO Request ID is 271d15d1-27cb-4526-884f-0c294f4e6432
2025-05-30 14:05:53,322 INFO status has been updated to accepted
2025-05-30 14:06:15,136 INFO status has been updated to running
2025-05-30 14:07:09,950 INFO status has been updated to successful

f879ae8c8090bd5eff88e44e7d9aaece.zip:   0%|          | 0.00/26.9M [00:00<?, ?B/s]
f879ae8c8090bd5eff88e44e7d9aaece.zip:  19%|█▊        | 5.00M/26.9M [00:00<00:00, 46.8MB/s]
f879ae8c8090bd5eff88e44e7d9aaece.zip:  60%|█████▉    | 16.0M/26.9M [00:00<00:00, 81.6MB/s]
f879ae8c8090bd5eff88e44e7d9aaece.zip: 100%|██████████| 26.9M/26.9M [00:00<00:00, 92.5MB/s]
                                                                                          
  0%|          | 0/36 [00:00<?, ?it/s]
 27%|██▋       | 9/33 [08:54<25:04, 62.68s/it]2025-05-30 14:07:11,626 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:07:11,647 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:07:12,016 INFO Request ID is 1780221e-bfac-445f-ba16-ed802f2a0312
2025-05-30 14:07:12,059 INFO status has been updated to accepted
2025-05-30 14:08:02,071 INFO status has been updated to running
2025-05-30 14:09:06,583 INFO status has been updated to successful

97bd3e3007ba398739443bdb19520a84.zip:   0%|          | 0.00/26.8M [00:00<?, ?B/s]
97bd3e3007ba398739443bdb19520a84.zip:  11%|█         | 3.00M/26.8M [00:00<00:00, 28.7MB/s]
97bd3e3007ba398739443bdb19520a84.zip:  48%|████▊     | 13.0M/26.8M [00:00<00:00, 68.4MB/s]
97bd3e3007ba398739443bdb19520a84.zip:  89%|████████▉ | 24.0M/26.8M [00:00<00:00, 84.8MB/s]
                                                                                          
  0%|          | 0/36 [00:00<?, ?it/s]
 82%|████████▏ | 27/33 [10:56<00:03,  1.88it/s]2025-05-30 14:09:13,271 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:09:13,299 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:09:15,277 INFO Request ID is c4ce04d3-93c2-4a86-a6b8-9f619f7c0731
2025-05-30 14:09:15,314 INFO status has been updated to accepted
2025-05-30 14:10:05,592 INFO status has been updated to running
2025-05-30 14:10:31,269 INFO status has been updated to successful

ce48a37d9b3c52e10c40b3e5a2244f17.zip:   0%|          | 0.00/26.7M [00:00<?, ?B/s]
ce48a37d9b3c52e10c40b3e5a2244f17.zip:   4%|▎         | 1.00M/26.7M [00:00<00:03, 7.44MB/s]
ce48a37d9b3c52e10c40b3e5a2244f17.zip:  37%|███▋      | 10.0M/26.7M [00:00<00:00, 49.9MB/s]
ce48a37d9b3c52e10c40b3e5a2244f17.zip:  71%|███████   | 19.0M/26.7M [00:00<00:00, 68.2MB/s]
                                                                                          
  0%|          | 0/36 [00:00<?, ?it/s]
 85%|████████▍ | 28/33 [12:16<02:00, 24.18s/it]2025-05-30 14:10:33,116 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:10:33,139 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:10:33,719 INFO Request ID is ad9d438a-233c-4386-82c2-6bb25dbecbc8
2025-05-30 14:10:33,762 INFO status has been updated to accepted
2025-05-30 14:10:47,253 INFO status has been updated to running
2025-05-30 14:11:23,483 INFO status has been updated to successful

e3a5f999dfccd90b3177d7e8173dce8d.zip:   0%|          | 0.00/26.8M [00:00<?, ?B/s]
e3a5f999dfccd90b3177d7e8173dce8d.zip:  11%|█         | 3.00M/26.8M [00:00<00:00, 28.6MB/s]
e3a5f999dfccd90b3177d7e8173dce8d.zip:  49%|████▊     | 13.0M/26.8M [00:00<00:00, 67.8MB/s]
e3a5f999dfccd90b3177d7e8173dce8d.zip:  86%|████████▌ | 23.0M/26.8M [00:00<00:00, 81.0MB/s]
                                                                                          
  0%|          | 0/36 [00:00<?, ?it/s]
 88%|████████▊ | 29/33 [13:08<02:10, 32.55s/it]2025-05-30 14:11:25,279 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:11:25,317 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:11:25,665 INFO Request ID is 6f05d4af-2fea-4d0c-9b46-64dab810a89e
2025-05-30 14:11:25,693 INFO status has been updated to accepted
2025-05-30 14:11:58,617 INFO status has been updated to running
2025-05-30 14:12:41,606 INFO status has been updated to successful

cd97b177a9fadf232130d4ab7601b3ca.zip:   0%|          | 0.00/27.2M [00:00<?, ?B/s]
cd97b177a9fadf232130d4ab7601b3ca.zip:   4%|▎         | 1.00M/27.2M [00:00<00:03, 6.87MB/s]
cd97b177a9fadf232130d4ab7601b3ca.zip:  37%|███▋      | 10.0M/27.2M [00:00<00:00, 47.3MB/s]
cd97b177a9fadf232130d4ab7601b3ca.zip:  70%|██████▉   | 19.0M/27.2M [00:00<00:00, 65.3MB/s]
                                                                                          
  0%|          | 0/36 [00:00<?, ?it/s]
 91%|█████████ | 30/33 [14:27<02:18, 46.31s/it]2025-05-30 14:12:43,884 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:12:44,167 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:12:44,687 INFO Request ID is c98b0f91-4e2b-4676-9b8f-c495ac93ef46
2025-05-30 14:12:44,796 INFO status has been updated to accepted
2025-05-30 14:13:05,823 INFO status has been updated to running
2025-05-30 14:13:34,558 INFO status has been updated to successful

c886ef2b5cd4410517c8364fcfc842c0.zip:   0%|          | 0.00/27.4M [00:00<?, ?B/s]
c886ef2b5cd4410517c8364fcfc842c0.zip:  15%|█▍        | 4.00M/27.4M [00:00<00:00, 39.0MB/s]
c886ef2b5cd4410517c8364fcfc842c0.zip:  40%|████      | 11.0M/27.4M [00:00<00:00, 57.2MB/s]
c886ef2b5cd4410517c8364fcfc842c0.zip:  77%|███████▋  | 21.0M/27.4M [00:00<00:00, 77.6MB/s]
                                                                                          
  0%|          | 0/36 [00:00<?, ?it/s]
 94%|█████████▍| 31/33 [15:19<01:36, 48.09s/it]2025-05-30 14:13:36,101 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:13:36,126 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:13:37,050 INFO Request ID is 207a7e8c-d035-4ecb-acf4-81bcdb15d9c6
2025-05-30 14:13:37,073 INFO status has been updated to accepted
2025-05-30 14:13:45,866 INFO status has been updated to running
2025-05-30 14:14:10,083 INFO status has been updated to successful

b0e8b3b8145f8c1948e136442230a4e8.zip:   0%|          | 0.00/27.8M [00:00<?, ?B/s]
b0e8b3b8145f8c1948e136442230a4e8.zip:  14%|█▍        | 4.00M/27.8M [00:00<00:00, 32.7MB/s]
b0e8b3b8145f8c1948e136442230a4e8.zip:  36%|███▌      | 10.0M/27.8M [00:00<00:00, 46.3MB/s]
b0e8b3b8145f8c1948e136442230a4e8.zip:  54%|█████▍    | 15.0M/27.8M [00:00<00:00, 44.8MB/s]
b0e8b3b8145f8c1948e136442230a4e8.zip:  72%|███████▏  | 20.0M/27.8M [00:00<00:00, 42.3MB/s]
b0e8b3b8145f8c1948e136442230a4e8.zip:  90%|█████████ | 25.0M/27.8M [00:00<00:00, 43.1MB/s]
                                                                                          
  0%|          | 0/36 [00:00<?, ?it/s]
100%|██████████| 33/33 [15:55<00:00, 28.96s/it]
/data/common/miniforge3/envs/wp5/lib/python3.11/site-packages/pyogrio/geopandas.py:275: UserWarning: More than one layer found in 'pyogrio_caa0acd978ca4858b07f80da53aa85ab.zip': 'Continents' (default), 'Africa', 'North America', 'Europe', 'Oceania', 'South America', 'Asia', 'Antarctica', 'Australia'. Specify layer parameter to avoid this warning.
  result = read_func(

2. Calculate Surface Soil Moisture Anomaly#

The Surface Soil Moisture Anomaly (referred to as SSMA hereafter) was calculated following a similar approach as the one explained by the European Drought Observatory (EDO) [1]. Surface soil moisture values for each pixel and each dekad from April to July 2023 were compared to the long-term climatological period (1991–2020, 30 years). The anomaly was computed using the following equation:

\(\text{SMA} = \frac{\text{SMI}_t - \overline{\text{SMI}}}{\delta_{\text{SMI}}}\)

where:

\(\text{SMI}_t\) = Surface soil moisture 2023 for a specific dekad for that pixel

\(\overline{\text{SMI}}\) = Mean surface soil moisture 1991-2020 for that same dekad for that pixel

\(\delta_{\text{SMI}}\) = Standard deviation surface soil moisture 1991-2020 for that same dekad for that pixel

Hide code cell source
#Select soil mouisture variable
da=ds["sm"]
# Filter the shapefile to keep only Europe
europe_shape = world_shape[world_shape['CONTINENT'] == 'Europe']
# Ensure soil_moisture has CRS information compatible with europe_shape (e.g., EPSG:4326)
da.rio.write_crs("EPSG:4326", inplace=True)
# Clip soil moisture data to the Europe shape
da_eu = da.rio.clip(europe_shape.geometry, europe_shape.crs, drop=True)
Hide code cell source
# Select data for the two time intervals.
da_long_term = da_eu.sel(time=slice("1991-01-01", "2020-12-21"))

#Group by day of th year and them calculate the mean and standard deviation.
#The available days in each month are 1, 11 and 21, 
#they correspont to the 1st, 2nd and 3rd dekad of the month.
doy_long_term = da_long_term.groupby("time.dayofyear")
mean_smi_long_term = doy_long_term.mean(dim="time")
std_smi_long_term = doy_long_term.std(dim="time")
Hide code cell source
#Select the data of the year 2023 and calculate the mean same as before.
da_2023 = da_eu.sel(time=slice("2023-01-01", "2023-12-21"))
doy_2023 = da_2023.groupby("time.dayofyear")
smi_2023 = doy_2023.mean(dim="time")
Hide code cell source
# Replace zeros in std with NaNs to avoid division by zero
std_smi_long_term_safe = std_smi_long_term.where(std_smi_long_term != 0)

# Calculate SMA safely
sma = (smi_2023 - mean_smi_long_term) / std_smi_long_term_safe

sma = sma.where(np.isfinite(sma))  # Replace inf/-inf with NaN

3. SSMA visualization#

Map of Europe SSMA#

Hide code cell source
# Define custom colormap and boundaries
colors = [
    "#b35806ff",  # <-2
    "#f1a340ff",  # -2 to -1.5
    "#fee0b6ff",  # -1.5 to -1
    "#ffffffff",  # -1 to 1
    "#d1e5f0ff",  # 1 to 1.5
    "#67a9cfff",  # 1.5 to 2
    "#2166acff"   # >= 2
]
bounds = [-100, -2, -1.5, -1, 1, 1.5, 2, 100]  # Define boundaries

# Create colormap and norm
cmap = mcolors.ListedColormap(colors)
cmap.set_bad(color='lightgray')  # Gray for no data
norm = mcolors.BoundaryNorm(bounds, ncolors=len(colors), clip=True)
Hide code cell source
boxes = [
    {
        'label': 'Iberian Peninsula', 
        'min_lat': 35, 'max_lat': 44, 
        'min_lon': -10, 'max_lon': 5, 
        'color': 'red'
    },
    {
        'label': 'Great Britain and Ireland', 
        'min_lat': 50, 'max_lat': 60, 
        'min_lon': -11, 'max_lon': 2, 
        'color': 'orange'},

    {
        'label': 'Southern Balkans and South Italy',
        'min_lat': 36, 'max_lat': 47,
        'min_lon': 7, 'max_lon': 24,
        'color': 'green'
    },
    {
        'label': 'Nordic and Baltic region',
        'min_lat': 55, 'max_lat': 71,
        'min_lon': 5, 'max_lon': 28,
        'color': 'blue'
    },

    {
        'label': 'Germany–Benelux–Poland',
        'min_lat': 48, 'max_lat': 54,
        'min_lon': 4, 'max_lon': 25,
        'color': 'purple'
    }
]
Hide code cell source
# Dekad DOYs and labels
dekad_days = [
    [91, 101, 111],    # April
    [121, 131, 141],   # May
    [152, 162, 172],   # June
    [182, 192, 202],   # July
]
month_labels = ['April', 'May', 'June', 'July']
dekad_labels = ['1st Dekad', '2nd Dekad', '3rd Dekad']

# Flatten DOYs and labels
all_doys = [doy for sublist in dekad_days for doy in sublist]
all_labels = [f"{month} - {dekad}" for month in month_labels for dekad in dekad_labels]

# === Create figure and axis ===
fig, ax = plt.subplots(figsize=(8, 6), subplot_kw={'projection': ccrs.LambertConformal(central_longitude=10, central_latitude=50)}, dpi=250)
ax.set_extent([-15, 35, 35, 72], crs=ccrs.PlateCarree())
ax.add_feature(cfeature.BORDERS, linestyle='-', edgecolor='black')
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.LAND, facecolor='lightgray')
ax.add_feature(cfeature.OCEAN, facecolor='lightgray')


# === Add colored rectangles ===
def add_rectangles(ax):

    for box in boxes:
        width = box['max_lon'] - box['min_lon']
        height = box['max_lat'] - box['min_lat']
        rect = Rectangle(
            (box['min_lon'], box['min_lat']),
            width,
            height,
            linewidth=1,
            edgecolor=box['color'],
            facecolor='none',
            transform=ccrs.PlateCarree(),
            zorder=5
        )
        ax.add_patch(rect)

add_rectangles(ax)

# === Initial frame ===
sm_init = sma.sel(dayofyear=all_doys[0]).where(sma.sel(dayofyear=all_doys[0]) != 0, np.nan)
im = sm_init.plot(
    ax=ax, transform=ccrs.PlateCarree(),
    cmap=cmap, norm=norm, add_colorbar=False  # <- disable auto colorbar
)
title = ax.set_title(f"Surface Soil Moisture Anomaly\n{all_labels[0]}", fontsize=10)

# Define bounds and ticks

ticks = bounds[1:-1]

# Add manual shared colorbar
cbar = fig.colorbar(
    im, ax=ax, orientation='horizontal',
    fraction=0.03, pad=0.06, shrink=0.9,
    ticks=ticks, extend='both'
)
cbar.ax.tick_params(labelsize=8)          # Make tick numbers smaller
cbar.set_label('SSMA', fontsize=9)   


# === Animation update function ===
def update(frame_idx):
    doy = all_doys[frame_idx]
    label = all_labels[frame_idx]
    sm_doy = sma.sel(dayofyear=doy).where(sma.sel(dayofyear=doy) != 0, np.nan)
    im.set_array(sm_doy.values.flatten())  # Update the image data
    title.set_text(f"Surface Soil Moisture Anomaly\n{label}")
    return im,

# === Create and save animation ===
ani = animation.FuncAnimation(
    fig, update, frames=len(all_doys), blit=False, interval=1000
)

ani.save("/data/wp5/trigoso_camila/SoilMoisture/fig/soil_moisture_animv2.gif", writer='pillow', dpi=250)

plt.show()
Hide code cell output
../../_images/83ca4a05e7ce9fb970ae183afa4b125b6d3baf5acfc167a4e54108de93c64dfe.png
../../_images/91445788-f349-461a-bdfe-33fcf271d6ba.gif

Fig. 1.5.1.1 Surface soil moisture anomalies in Europe for the period of Spring to Mid-Summer 2023 accoridng to the C3S-SM-COMBINED data.#

Regional SSMA plots#

The mean SSMA of the regions marked by boxes in Fig. 1.5.1.1 were plotted over time.

Hide code cell source
def plot_sma_mean_over_region(
    sma_data,
    min_lat=35,
    max_lat=45,
    min_lon=-10,
    max_lon=5,
    start_doy=91,
    end_doy=202,
    title="Average Soil Moisture Anomaly over Iberian Peninsula",
    color="blue",
    year=2023  # specify year for converting DOY to date
):
    # Subset by region
    sma_subset = sma_data.sel(
        longitude=slice(min_lon, max_lon),
        latitude=slice(max_lat, min_lat)  # decreasing lat
    )

    # Ensure DOY values are valid
    available_doys = sma_subset.dayofyear.values
    target_doys = [doy for doy in available_doys if start_doy <= doy <= end_doy]

    if not target_doys:
        print(f"No matching DOYs in range {start_doy}{end_doy}.")
        return

    # Subset by DOY
    sma_subset = sma_subset.sel(dayofyear=target_doys)

    # Mean over space
    sma_mean = sma_subset.mean(dim=["latitude", "longitude"], skipna=True)

    # Convert DOY to date
    date_index = pd.to_datetime([f"{year}-{doy}" for doy in sma_mean.dayofyear.values], format="%Y-%j")

    # Plot
    plt.figure(figsize=(10, 4), dpi=250)
    plt.plot(date_index, sma_mean, marker='o', linestyle='-', color=color)
    plt.title(f"{title}\n{date_index[0].strftime('%b %d')} to {date_index[-1].strftime('%b %d')}")
    plt.xlabel("Date")
    plt.ylabel("Mean SSMA")
    plt.grid(True)

    # Create custom ticks on 1st, 11th, 21st of each month
    tick_days = [1, 11, 21]
    tick_dates = pd.date_range(start=date_index[0], end=date_index[-1], freq='D')
    custom_ticks = [d for d in tick_dates if d.day in tick_days]
    
    # Set custom ticks and labels
    plt.xticks(custom_ticks, [d.strftime('%b %d') for d in custom_ticks], rotation=45)

    # Highlight 0 line
    plt.axhline(0, color='black', linestyle='--', linewidth=1.5, label='Normal (SSMA=0)')
    plt.legend()
    
    plt.tight_layout()
    plt.savefig(f"/data/wp5/trigoso_camila/SoilMoisture/fig/sm_region_{box['label']}.png", dpi=250, bbox_inches="tight")
    plt.show()
Hide code cell source
for box in boxes:
    plot_sma_mean_over_region(
        sma_data=sma,
        min_lat=box['min_lat'],
        max_lat=box['max_lat'],
        min_lon=box['min_lon'],
        max_lon=box['max_lon'],
        start_doy=91,
        end_doy=202,
        title=f"SSMA over {box['label']} (Spring–Mid Summer 2023)",
        color=box['color']
    )
Hide code cell output
../../_images/48134b5d70b5d00ff98f76260cc25834fd6ccc3c1a65093a24827a58259ba6ec.png ../../_images/e7891831c1ab1017c39d65c5f5da128928769596f7d45ea3318c971efd64a645.png ../../_images/da1510e756cf468dec8410b4fdf0b86149fa1c2a3c8a6a930f5008d523b2ef25.png ../../_images/2b9e1e45bfcec6f66e6b667c99bc3e0ad5e4c99042999f5d374adfba720ef01e.png ../../_images/9bcb48c5d5dc5f742a0c34fb92dafc844c5c2932172e4f4af8e89f309a2dfa01.png
../../_images/d81f09f9-b43a-42f8-a535-c124c00064a7.png

Fig. 1.5.1.2 Surface soil moisture anomalies in the Iberian Peninsula for the period of Spring to Mid-Summer 2023 accoridng to the C3S-SM-COMBINED data.#

../../_images/372ed1ff-109e-422d-a6da-f9ed7c3cce43.png

Fig. 1.5.1.3 Surface soil moisture anomalies in the Southern Balkans and South Italy for the period of Spring to Mid-Summer 2023 accoridng to the C3S-SM-COMBINED data.#

On top of low rainfall, a significant spring heatwave amplified drought conditions in the western Mediterranean in April 2023 [2]. According to the European Commission (2023) [3] the Combined Drought Indicator (CDI) showed warning and alert conditions across much of the western Mediterranean by mid-May, with drought conditions worse than those observed at the same time of the year in 2022. This situation is reflected in the SSMA results for the Iberian Peninsula (see Fig. 1.5.1.2) The SSMA was notably negative, around -1.5 standard deviations, from April to mid-May. After late May, SSMA values increased, turning positive and gradually approaching normal conditions (near 0).

In contrast, crop-growing conditions improved in the Balkans, Italy, France, and Turkey during the same period [3]. The European Commission also reported flooding in parts of Italy and the western Balkans in May 2023, caused by heavy precipitation [5]. This is consistent with observations in Fig. 1.5.1.3, where the SSMA in southern Italy and the southern Balkans was strongly positive, reaching values above +1.5 standard deviations by mid-May.

../../_images/4821267f-756f-49e4-9dce-82925b64f704.png

Fig. 1.5.1.4 Surface soil moisture anomalies in Great Britain and Ireland for the period of Spring to Mid-Summer 2023 accoridng to the C3S-SM-COMBINED data.#

../../_images/b983cb7f-b5d5-4990-b618-035b3e879822.png

Fig. 1.5.1.5 Surface soil moisture anomalies in Germany–Benelux–Poland for the period of Spring to Mid-Summer 2023 accoridng to the C3S-SM-COMBINED data.#

Hide code cell source
# === Choose specific year and DOY ===
chosen_year = 2023
chosen_doy = 152  # 1st Dekad of June

# === Extract data ===
sm_single = sma.sel(dayofyear=chosen_doy).where(
    sma.sel(dayofyear=chosen_doy) != 0, np.nan
)
# === Create figure and axis ===
fig, ax = plt.subplots(
    figsize=(8, 6),
    subplot_kw={'projection': ccrs.LambertConformal(central_longitude=10, central_latitude=50)},
    dpi=250
)
ax.set_extent([-15, 35, 35, 72], crs=ccrs.PlateCarree())
ax.add_feature(cfeature.BORDERS, linestyle='-', edgecolor='black')
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.LAND, facecolor='lightgray')
ax.add_feature(cfeature.OCEAN, facecolor='lightgray')

# === Plot soil moisture ===
im = sm_single.plot(
    ax=ax, transform=ccrs.PlateCarree(),
    cmap=cmap, norm=norm, add_colorbar=False
)

# === Add title ===
month_idx = next(i for i, sublist in enumerate(dekad_days) if chosen_doy in sublist)
dekad_idx = dekad_days[month_idx].index(chosen_doy)
label = f"{month_labels[month_idx]} - {dekad_labels[dekad_idx]}"
ax.set_title(f"Surface Soil Moisture Anomaly\n{label} {chosen_year}", fontsize=10)

# === Add colorbar ===
ticks = bounds[1:-1]
cbar = fig.colorbar(
    im, ax=ax, orientation='horizontal',
    fraction=0.03, pad=0.06, shrink=0.9,
    ticks=ticks, extend='both'
)
cbar.ax.tick_params(labelsize=8)
cbar.set_label('SSMA', fontsize=9)

# === Save the figure ===
plt.savefig(f"/data/wp5/trigoso_camila/SoilMoisture/fig/ssma_{chosen_year}_{chosen_doy}.png", dpi=250)

plt.show()
Hide code cell output
../../_images/09c4cec525e3afbdd192171ed3d2ee6534b2164eb1c5d4997cc0399adb10ce65.png
../../_images/c01fcf81-aca2-4d01-a0d7-6f92db0a18d9.png

Fig. 1.5.1.6 a) SSMA in early-June 2023 accoridng to the C3S-SM-COMBINED data. b) SMI Anomaly in early-June 2023 accoridng to the EDO, generated using Copernicus Emergency Management Service information (2025) [7].#

Great Britain, Ireland, and much of central Europe exhibited a notable negative SSMA peak at the beginning of June (see Fig. 1.5.1.4 and Fig. 1.5.1.5). This pattern aligns with reports that much of central and northern Europe experienced drier-than-normal conditions in June 2023 [6].

Fig. 1.5.1.6 (b) shows the Soil Moisture Index (SMI) Anomaly for early June, generated by the EDO [7]. This index is obtained using the LISFLOOD model, which “simulates soil moisture in two surface layers (skin layer and root zone) separately for forested and other layers. These four soil moisture layers are averaged daily to derive a single mean root zone soil moisture conditions to be successively standardized into SMI” [1].

While both the LISFLOOD model and the satellite-derived C3S-SM-COMBINED product reflect general drought trends, differences emerge due to what each system measures. C3S observations represent only the top centimeters of the soil (surface layer), which respond more quickly to short-term precipitation events. LISFLOOD, on the other hand, also takes into account the deeper root zone, which changes more slowly and captures longer-term drought stress.

As a result, while the C3S product shows wetter-than-usual surface soil moisture anomalies in the Iberian Peninsula by early June, LISFLOOD still indicates drier-than-normal conditions due to lingering root-zone deficits. Conversely, in central Europe (e.g., Benelux and Germany), C3S data show negative anomalies whereas LISFLOOD depicts mostly normal conditions, with only some patches of dryness.

Surface soil moisture is particularly useful for monitoring rapid changes on a regional scale. However, for agricultural drought monitoring, it is important to also consider long-term and subsurface moisture conditions, as reflected in root-zone models like LISFLOOD.

../../_images/372978d8-d7d9-4c4f-bfea-443e5f496eba.png

Fig. 1.5.1.7 Surface soil moisture anomalies in the Nordic and Baltic region for the period of Spring to Mid-Summer 2023 accoridng to the C3S-SM-COMBINED data.#

Hide code cell source
# === Choose specific year and DOY ===
chosen_year = 2023
chosen_doy = 91  # 1st Dekad of April

# === Extract data ===
sm_single = sma.sel(dayofyear=chosen_doy).where(
    sma.sel(dayofyear=chosen_doy) != 0, np.nan
)
# === Create figure and axis ===
fig, ax = plt.subplots(
    figsize=(8, 6),
    subplot_kw={'projection': ccrs.LambertConformal(central_longitude=10, central_latitude=50)},
    dpi=250
)
ax.set_extent([5, 32, 54, 71], crs=ccrs.PlateCarree())
ax.add_feature(cfeature.BORDERS, linestyle='-', edgecolor='black')
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.LAND, facecolor='lightgray')
ax.add_feature(cfeature.OCEAN, facecolor='lightgray')

# === Plot soil moisture ===
im = sm_single.plot(
    ax=ax, transform=ccrs.PlateCarree(),
    cmap=cmap, norm=norm, add_colorbar=False
)

# === Add title ===
month_idx = next(i for i, sublist in enumerate(dekad_days) if chosen_doy in sublist)
dekad_idx = dekad_days[month_idx].index(chosen_doy)
label = f"{month_labels[month_idx]} - {dekad_labels[dekad_idx]}"
ax.set_title(f"Surface Soil Moisture Anomaly\n{label} {chosen_year}", fontsize=10)

# === Add colorbar ===
ticks = bounds[1:-1]
cbar = fig.colorbar(
    im, ax=ax, orientation='horizontal',
    fraction=0.03, pad=0.06, shrink=0.9,
    ticks=ticks, extend='both'
)
cbar.ax.tick_params(labelsize=8)
cbar.set_label('SSMA', fontsize=9)

# === Save the figure ===
plt.savefig(f"/data/wp5/trigoso_camila/SoilMoisture/fig/ssma_{chosen_year}_{chosen_doy}.png", dpi=250)

plt.show()
Hide code cell output
../../_images/6ac248d4a6568f38c968cbfe65d173a628fa405bce66f03198bf0d37a9b13d3b.png
../../_images/6c918ede-6757-4788-bd75-066f6a02e9db.png

Fig. 1.5.1.8 Surface soil moisture anomalies in the Nordic and Baltic region for the period in the first dekad of April 2023 accoridng to the C3S-SM-COMBINED data.#

Fig. 1.5.1.7 shows that the Scandinavian Peninsula, as well as the Nordic and Baltic countries, were unusually dry during mid-spring and early summer 2023. However, the data for these regions in April is notably incomplete (see Fig. 1.5.1.8). During this period, valid soil moisture data are available only for the southernmost parts of the Scandinavian Peninsula. This lack of data can be attributed to the presence of snow cover and frozen soil still during spring. According to PUGS, the C3S Surface Soil Moisture v202312 product cannot retrieve meaningful data when the ground is snow-covered or frozen. Under such conditions, the dielectric properties of water change significantly, making satellite-based retrieval unreliable.

The results shown in this section are consistent with those presented in the European State of the Climate 2023 by Copernicus [4]. However, while that report presents monthly data using the C3S v202212 PASSIVE dataset, this analysis is based on a dekadal (10-day) data and uses the COMBINED v202312 product.

ℹ️ If you want to know more#

  • Markonis, Y., Kumar, R., Hanel, M., Rakovec, O., Máca, P., & AghaKouchak, A. (2021). The rise of compound warm-season droughts in Europe. Science Advances, 7(6), eabb9668.

  • Ministerio para la Transición Ecológica y el Reto Demográfico (2023). El 14,6% del territorio está en emergencia por escasez de agua y el 27,4%, en alerta. Nota de prensa.

  • Laguardia, G. & Niemeyer, S. (2008). On the comparison between the LISFLOOD modelled and the ERS/SCAT derived soil moisture estimates. Hydrol. Earth Syst. Sci., 12, 1339–1351.

Key resources#

Code libraries used:

Dataset documentation: SM v202212: Product User Guide and Specification (PUGS)

SM v202312: Algorithm Theoretical Basis Document (ATBD)

SM v202312: Product Quality Assurance Document (PQAD)

References#

[1] European Commission (2019). EDO INDICATOR FACTSHEET Soil Moisture Anomaly (SMA). European Drought Observatory.

[2] Lemus-Canovas, M., Insua-Costa, D., Trigo, R. & Miralles, D. (2024). Record-shattering 2023 Spring heatwave in western Mediterranean amplified by long-term drought. npj Clim Atmos Sci 7, 25.

[3] European Commission (2023a). Severe drought: western Mediterranean faces low river flows and crop yields earlier than ever. European Drought Observatory. The Joint Research Centre: EU Science Hub.

[4] European Commission (2023b). Europe in 2023 Soil Moisture.

[5] European Commission (2023c). Precipitation, relative humidity and soil moisture for May 2023.

[6] Toreti, A., Bavera, D., Acosta Navarro, J., Arias-Muñoz, C., Barbosa, P., De Jager, A., Di Ciollo, C., Fioravanti, G., Grimaldi, S., Hrast Essenfelder, A., Maetens, W., Magni, D., Masante, D., Mazzeschi, M., Mccormick, N. & Salamon, P. (2023). Drought in Europe June 2023. Publications Office of the European Union, Luxembourg, 2023, doi:10.2760/575433, JRC134492.

[7] Copernicus Emergency Management Service (2025). European Drought Observatory map.