make_study_bounds <- function(range_shapefile, expand_degrees = 5) { seal_range <- terra::vect(range_shapefile) bbox <- terra::ext(seal_range) |> terra::extend(expand_degrees) list( seal_range = seal_range, lon_range = c(bbox$xmin, bbox$xmax), lat_range = c(bbox$ymin, bbox$ymax) ) } download_biooracle_slice <- function(dynamic_layers, scenario_value, decade_start, lon_range, lat_range, download_root = "./data/bio-oracle-2") { scenario_layers <- dynamic_layers |> dplyr::filter(scenario == scenario_value) time_point <- paste0(decade_start, "-01-01T00:00:00Z") slice_constraints <- list( time = c(time_point, time_point), longitude = lon_range, latitude = lat_range ) download_dir <- file.path(download_root, scenario_value, decade_start) dir.create(download_dir, recursive = TRUE, showWarnings = FALSE) sapply( scenario_layers$dataset_id, function(id) biooracler::download_layers( id, constraints = slice_constraints, directory = download_dir ), simplify = TRUE ) } download_biooracle_slice_subset <- function(dynamic_layers, scenario_value, decade_start, layers_to_download, lon_range, lat_range, download_root = "./data/bio-oracle-2") { scenario_layers <- dynamic_layers |> dplyr::filter( scenario == scenario_value & var %in% layers_to_download$var & depth %in% layers_to_download$depth ) time_point <- paste0(decade_start, "-01-01T00:00:00Z") slice_constraints <- list( time = c(time_point, time_point), longitude = lon_range, latitude = lat_range ) download_dir <- file.path(download_root, scenario_value, decade_start) dir.create(download_dir, recursive = TRUE, showWarnings = FALSE) sapply( scenario_layers$dataset_id, function(id) biooracler::download_layers( id, constraints = slice_constraints, directory = download_dir ), simplify = TRUE ) } set_brick_names_with_depth <- function(r) { r_depths <- names(r) |> stringr::str_extract("depth[:alpha:]+") r_longnames <- terra::longnames(r) names(r) <- paste(r_longnames, r_depths) r } assert_required_files <- function(paths) { missing_paths <- paths[!file.exists(paths)] if (length(missing_paths) > 0) { stop( paste0( "Missing required file(s): ", paste(missing_paths, collapse = ", "), ". Run learning pipeline first." ), call. = FALSE ) } }