There is a newer version of the record available.

Published February 7, 2025 | Version V1
Dataset Open

Surface soil moisture for Europe 2014-2024 at 1 km annual and quarterly aggregates

  • 1. OpenGeoHub foundation
  • 2. Envirometrix Ltd

Description

Copernicus Land Monitoring Services provides Surface Soil Moisture 2014-present (raster 1 km), Europe, daily – version 1. Each day covers only 5 to 10% of European land mask and shows lines of scenes (obvious artifacts). This is the long-term aggregates of daily images of soil moisture (0–100%) based on two types of aggregation:

  • Long-term quarterly (qr.1 - winter, qr.2 - spring, qr.3 - summer and qr.4 - autumn),
  • Annual quantiles P.05, P.50 and P.95,

The soil moisture rasters are based on Sentinel 1 and described in detail in: 

  • Bauer-Marschallinger, B. ; Freeman, V. ; Cao, S. ; Paulik, C. ; Schaufler, S. ; Stachl, T. ; Modanesi, S. ; Massari, C. ; Ciabatta, L. ; Brocca, L. ; Wagner, W. Toward Global Soil Moisture Monitoring With Sentinel-1: Harnessing Assets and Overcoming Obstacles. IEEE Transactions on Geoscience and Remote Sensing 2019, 1 - 20. DOI 10.1109/TGRS.2018.2858004

You can access and download the original data as .nc files from: https://globalland.vito.be/download/manifest/ssm_1km_v1_daily_netcdf/.

Aggregation has been generated using the terra package in R in combination with the matrixStats::rowQuantiles function. Tiling system and land mask for pan-EU is also available.

library(terra)
library(matrixStats)
g1 = terra::vect("/mnt/inca/EU_landmask/tilling_filter/eu_ard2_final_status.gpkg")
## 1254 tiles
tile = g1[534]
nc.lst = list.files('/mnt/landmark/SM1km/ssm_1km_v1_daily_netcdf/', pattern = glob2rx("*.nc$"), full.names=TRUE)
## 3726
## test it
#r = terra::rast(nc.lst[100:210])

agg_tile = function(r, tile, pv=c(0.05,0.5,0.95), out.year="2015.annual"){
  bb = paste(as.vector(ext(tile)), collapse = ".")
  out.tif = paste0("./eu_tmp/", out.year, "/sm1km_", pv, "_", out.year, "_", bb, ".tif")
  if(any(!file.exists(out.tif))){
    r.t = terra::crop(r, ext(tile))
    ## each tile is 100x100 pixels 365 days
    r.t = as.data.frame(r.t, xy=TRUE, na.rm=FALSE)
    sel.c = grep(glob2rx("ssm$"), colnames(r.t))
    ## remove everything outside the range
    t1s = cbind(data.frame(matrixStats::rowQuantiles(as.matrix(r.t[,sel.c]), probs = pv, na.rm=TRUE)),  data.frame(x=r.t$x,  y=r.t$y))
    #str(t1s)
    ## write to GeoTIFFs
    r.o = terra::rast(t1s[,c("x","y","X5.","X50.","X95.")], type="xyz", crs="+proj=longlat +datum=WGS84 +no_defs")
    for(k in 1:length(pv)){ 
      terra::writeRaster(r.o[[k]], filename=out.tif[k], gdal=c("COMPRESS=DEFLATE"), datatype='INT2U', NAflag=32768, overwrite=FALSE)
    }
    rm(r.t); gc()
    tmpFiles(remove=TRUE)
  }
}

## quarterly values:
lA = data.frame(filename=nc.lst)
library(lubridate)
lA$Date = ymd(sapply(lA$filename, function(i){substr(strsplit(basename(i), "_")[[1]][4], 1, 8)}))
#summary(is.na(lA$Date))
#hist(lA$Date, breaks=60)
lA$quarter = quarter(lA$Date, fiscal_start = 11)
summary(as.factor(lA$quarter))

for(qr in 1:4){
  #qr=1
  pth = paste0("A.q", qr)
  rs = terra::rast(lA$filename[lA$quarter==qr])
  #agg_tile(rs, tile, out.year=pth)
  x = parallel::mclapply(sample(1:length(g1)), function(i){try( agg_tile(rs, tile=g1[i], out.year=pth) )}, mc.cores=20)
  for(type in c(0.05,0.5,0.95)){
    x <- list.files(path=paste0("./eu_tmp/", pth), pattern=glob2rx(paste0("sm1km_", type, "_*.tif$")), full.names=TRUE)
    out.tmp <- paste0(pth, ".", type, ".sm1km_eu.txt")
    vrt.tmp <- paste0(pth, ".", type, ".sm1km_eu.vrt")
    cat(x, sep="\n", file=out.tmp)
    system(paste0('gdalbuildvrt -input_file_list ', out.tmp, ' ', vrt.tmp))
    system(paste0('gdal_translate ', vrt.tmp, ' ./cogs/soil.moisture_s1.clms.qr.', qr, '.p', type, '_m_1km_20140101_20241231_eu_epsg4326_v20250206.tif -ot "Byte" -r "near" --config GDAL_CACHEMAX 9216 -co BIGTIFF=YES -co NUM_THREADS=80 -co COMPRESS=DEFLATE -of COG -projwin -32 72 45 27'))
  }
}

## per year ----
for(year in 2015:2023){
  l.lst = nc.lst[grep(year, basename(nc.lst))]
  r = terra::rast(l.lst)
  ## test it:
  pth = paste0(year, ".annual")
  x = parallel::mclapply(sample(1:length(g1)), function(i){try( agg_tile(r, tile=g1[i], out.year=pth) )}, mc.cores=40)
  ## Mosaics:
  for(type in c(0.05,0.5,0.95)){
    x <- list.files(path=paste0("./eu_tmp/", pth), pattern=glob2rx(paste0("sm1km_", type, "_*.tif$")), full.names=TRUE)
    out.tmp <- paste0(pth, ".", type, ".sm1km_eu.txt")
    vrt.tmp <- paste0(pth, ".", type, ".sm1km_eu.vrt")
    cat(x, sep="\n", file=out.tmp)
    system(paste0('gdalbuildvrt -input_file_list ', out.tmp, ' ', vrt.tmp))
    system(paste0('gdal_translate ', vrt.tmp, ' ./cogs/soil.moisture_s1.clms.annual.', type, '_m_1km_', year, '0101_', year, '1231_eu_epsg4326_v20250206.tif -ot "Byte" -r "near" --config GDAL_CACHEMAX 9216 -co BIGTIFF=YES -co NUM_THREADS=80 -co COMPRESS=DEFLATE -of COG -projwin -32 72 45 27'))
  }
}

Files

00_soil.moisture_quarterly_long.term.png

Files (322.8 MB)

Name Size Download all
md5:0aecb34b11a9084a38777ea42589f090
2.1 MB Preview Download
md5:08518ef5ee112f5f14545c06feefb0b5
9.1 MB Preview Download
md5:98811411398152fda743afc35d3b63ab
8.0 MB Preview Download
md5:b3404ba7aacd158476274775b6e4f93a
7.4 MB Preview Download
md5:729fb9f96f594cef9acc4efa1b1faaf7
7.7 MB Preview Download
md5:8d4c14feaa26276c58ba15e51783d1a9
8.2 MB Preview Download
md5:2831446d9b62ecf6c63a7b0ab500e1d9
8.2 MB Preview Download
md5:2f7bf6a911a31dabb6a7e05d8cb675a9
8.2 MB Preview Download
md5:6f62d2d5713a7b9be37ec408957c86b9
7.8 MB Preview Download
md5:a82ad678e87d60aee16ca9a311c5267d
8.0 MB Preview Download
md5:b43d2897f0d82b464bc2a0a0cb029f6d
8.9 MB Preview Download
md5:fef8ec926b6f665a25d862d23e8c3bc5
8.8 MB Preview Download
md5:cebbea2c6957a7fb7a4174aec6504601
8.6 MB Preview Download
md5:0a05330403729d822468cc9e738b42ff
8.8 MB Preview Download
md5:b231cc216966c8c3c6ef2438ffb8c8dc
9.0 MB Preview Download
md5:c9188c5e2e3171594c405ad64c561bf4
9.0 MB Preview Download
md5:a75d8069de664a5bd86733444324abdc
9.2 MB Preview Download
md5:2bde93fe04c60e2e58d162433af3b8c7
9.3 MB Preview Download
md5:5c7b7d9ffbcfdd46efac88ba42f60943
9.4 MB Preview Download
md5:e339ba59df58c8864625b9ecf1ccde55
5.6 MB Preview Download
md5:795eac5b1b332c2bc4c98f8a9eb7cf33
8.0 MB Preview Download
md5:ededbded71530777adb88d63bf22b508
7.9 MB Preview Download
md5:718bc089e08eee8c282d4ae2f0a4720e
7.7 MB Preview Download
md5:f3d396404a5330b3f9a6d48d30cc636d
8.1 MB Preview Download
md5:1f27f9e9382c0e3e5466c9546f09c363
7.7 MB Preview Download
md5:f6a6cc874a41a0842fc84bddea13c7f6
8.0 MB Preview Download
md5:7cf1c7d908d7b4442e3846a5aaeaffcd
8.4 MB Preview Download
md5:7495deaa5a08166354eb1c3f9eda3bb2
8.3 MB Preview Download
md5:5803e837b0bb2e6aec5e678e5b305bdb
6.7 MB Preview Download
md5:c77faa7ca599048179fc9d3a7f78f043
8.6 MB Preview Download
md5:4c0c47b570f3da06a6486bd5d1b97a6e
7.5 MB Preview Download
md5:078efb66c671e34bece0847c6cbd560c
6.7 MB Preview Download
md5:949db9efdf542439bb87c73945851efd
8.9 MB Preview Download
md5:7c33b45c01f675a5c932dc354a5267b1
7.9 MB Preview Download
md5:df09904db363e9c8996e869eded2662c
9.0 MB Preview Download
md5:9db382d04df141009464ab631b3341ca
9.1 MB Preview Download
md5:0b472ef9100e2b88c80bb865e43c0025
7.8 MB Preview Download
md5:65d66e718fb663eac0e71397226bb82a
8.6 MB Preview Download
md5:d54bb4ff48d99ee69ecbbb52919dd4ad
8.7 MB Preview Download
md5:4322dec726ed97743b0d816a51ca9b22
7.8 MB Preview Download

Additional details

Related works

Cites
Dataset: 10.5281/zenodo.8171860 (DOI)

Funding

European Commission
AI4SoilHealth - AI4SoilHealth: Accelerating collection and use of soil health information using AI technology to support the Soil Deal for Europe and EU Soil Observatory 101086179

Dates

Created
2025-02-06

Software

Programming language
R