Skip to content

Commit 02d7160

Browse files
committedMay 29, 2024
add dem_cube regularization support
1 parent 552c550 commit 02d7160

10 files changed

+151
-8
lines changed
 

‎NAMESPACE

+2
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ S3method(.raster_xres,terra)
126126
S3method(.raster_ymax,terra)
127127
S3method(.raster_ymin,terra)
128128
S3method(.raster_yres,terra)
129+
S3method(.reg_s2tile_convert,dem_cube)
129130
S3method(.reg_s2tile_convert,grd_cube)
130131
S3method(.reg_s2tile_convert,rtc_cube)
131132
S3method(.slice_dfr,numeric)
@@ -377,6 +378,7 @@ S3method(sits_reclassify,default)
377378
S3method(sits_reduce,raster_cube)
378379
S3method(sits_reduce,sits)
379380
S3method(sits_regularize,default)
381+
S3method(sits_regularize,dem_cube)
380382
S3method(sits_regularize,derived_cube)
381383
S3method(sits_regularize,raster_cube)
382384
S3method(sits_regularize,sar_cube)

‎R/api_cube.R

+14-1
Original file line numberDiff line numberDiff line change
@@ -350,12 +350,25 @@ NULL
350350
},
351351
.default = FALSE
352352
)
353+
354+
dem_cube <- .try({
355+
.conf("sources", source, "collections", collection, "dem_cube")
356+
},
357+
.default = FALSE
358+
)
359+
353360
if (sar_cube) {
354361
if (grepl("rtc", col_class, fixed = TRUE))
355362
unique(c(col_class, "rtc_cube", "sar_cube", s3_class, class(cube)))
356363
else
357364
unique(c(col_class, "grd_cube", "sar_cube", s3_class, class(cube)))
358-
} else {
365+
}
366+
367+
else if (dem_cube) {
368+
unique(c(col_class, "dem_cube", s3_class, class(cube)))
369+
}
370+
371+
else {
359372
unique(c(col_class, s3_class, class(cube)))
360373
}
361374
}

‎R/api_plot_raster.R

+2-2
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@
310310
# verifies if stars package is installed
311311
.check_require_packages("stars")
312312
# verifies if tmap package is installed
313-
.check_require_packages("plot")
313+
.check_require_packages("tmap")
314314

315315
# deal with color palette
316316
.check_palette(palette)
@@ -394,7 +394,7 @@
394394
# verifies if stars package is installed
395395
.check_require_packages("stars")
396396
# verifies if tmap package is installed
397-
.check_require_packages("plot")
397+
.check_require_packages("tmap")
398398
# precondition - check color palette
399399
.check_palette(palette)
400400
# revert the palette

‎R/api_regularize.R

+48
Original file line numberDiff line numberDiff line change
@@ -236,3 +236,51 @@
236236
cube_class <- c(cube_class[[1]], "sar_cube", cube_class[-1])
237237
.cube_set_class(cube, cube_class)
238238
}
239+
#' @noRd
240+
#' @export
241+
#'
242+
.reg_s2tile_convert.dem_cube<- function(cube, roi = NULL, tiles = NULL) {
243+
# generate Sentinel-2 tiles and intersects it with doi
244+
tiles_mgrs <- .s2tile_open(roi, tiles)
245+
246+
# create a new cube according to Sentinel-2 MGRS
247+
cube_class <- .cube_s3class(cube)
248+
249+
cube <- tiles_mgrs |>
250+
dplyr::rowwise() |>
251+
dplyr::group_map(~{
252+
# prepare a sf object representing the bbox of each image in
253+
# file_info
254+
cube_crs <- dplyr::filter(cube, .data[["crs"]] == .x[["crs"]])
255+
if (nrow(cube_crs) == 0) {
256+
cube_crs <- cube
257+
}
258+
fi_bbox <- .bbox_as_sf(.bbox(
259+
x = .fi(cube_crs),
260+
default_crs = .crs(cube_crs),
261+
by_feature = TRUE
262+
))
263+
file_info <- .fi(cube_crs)[.intersects({{fi_bbox}}, .x), ]
264+
.cube_create(
265+
source = .tile_source(cube_crs),
266+
collection = .tile_collection(cube_crs),
267+
satellite = .tile_satellite(cube_crs),
268+
sensor = .tile_sensor(cube_crs),
269+
tile = .x[["tile_id"]],
270+
xmin = .xmin(.x),
271+
xmax = .xmax(.x),
272+
ymin = .ymin(.x),
273+
ymax = .ymax(.x),
274+
crs = paste0("EPSG:", .x[["epsg"]]),
275+
file_info = file_info
276+
)
277+
}) |>
278+
dplyr::bind_rows()
279+
280+
# Filter non-empty file info
281+
cube <- .cube_filter_nonempty(cube)
282+
283+
# Finalize customizing cube class
284+
cube_class <- c(cube_class[[1]], "dem_cube", cube_class[-1])
285+
.cube_set_class(cube, cube_class)
286+
}

‎R/api_source.R

+9
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,18 @@ NULL
6565
},
6666
.default = FALSE
6767
)
68+
# is this a collection of DEM data ?
69+
dem_cube <- .try({
70+
.conf("sources", source, "collections", collection, "dem_cube")
71+
},
72+
.default = FALSE
73+
)
6874
# if this is a SAR collection, add "sar_cube" to the class
6975
if (sar_cube)
7076
class(source) <- c("sar_cube", class(source))
77+
# if this is a DEM collection, add "dem_cube" to the class
78+
if (dem_cube)
79+
class(source) <- c("dem_cube", class(source))
7180
# add a class combining source and collection
7281
class_source_col <- paste(classes[[1]], tolower(collection), sep = "_")
7382
class(source) <- unique(c(class_source_col, class(source)))

‎R/api_source_mpc.R

+16-5
Original file line numberDiff line numberDiff line change
@@ -245,11 +245,22 @@
245245
`.source_tile_get_bbox.mpc_cube_cop-dem-glo-30` <- function(source,
246246
file_info, ...,
247247
collection = NULL) {
248-
`.source_tile_get_bbox.mpc_cube_sentinel-1-grd`(
249-
source = source,
250-
file_info = file_info, ...,
251-
collection = collection
252-
)
248+
.check_set_caller(".source_tile_get_bbox_mpc_dem_30")
249+
250+
# pre-condition
251+
.check_num(nrow(file_info), min = 1)
252+
253+
# get bbox based on file_info
254+
xmin <- min(file_info[["xmin"]])
255+
ymin <- min(file_info[["ymin"]])
256+
xmax <- max(file_info[["xmax"]])
257+
ymax <- max(file_info[["ymax"]])
258+
259+
# post-condition
260+
.check_that(xmin < xmax && ymin < ymax)
261+
# create a bbox
262+
bbox <- c(xmin = xmin, ymin = ymin, xmax = xmax, ymax = ymax)
263+
return(bbox)
253264
}
254265
#' @keywords internal
255266
#' @noRd

‎R/sits_regularize.R

+46
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,52 @@ sits_regularize.sar_cube <- function(cube, ...,
205205
)
206206
return(cube)
207207
}
208+
209+
#' @rdname sits_regularize
210+
#' @export
211+
sits_regularize.dem_cube <- function(cube, ...,
212+
res,
213+
output_dir,
214+
roi = NULL,
215+
tiles = NULL,
216+
multicores = 2L,
217+
progress = TRUE) {
218+
# Preconditions
219+
.check_raster_cube_files(cube)
220+
.check_num_parameter(res, exclusive_min = 0)
221+
output_dir <- .file_normalize(output_dir)
222+
.check_output_dir(output_dir)
223+
.check_num_parameter(multicores, min = 1, max = 2048)
224+
.check_progress(progress)
225+
# Check for ROI and tiles
226+
.check_roi_tiles(roi, tiles)
227+
# Display warning message in case STAC cube
228+
# Prepare parallel processing
229+
.parallel_start(workers = multicores)
230+
on.exit(.parallel_stop(), add = TRUE)
231+
# Convert input sentinel1 cube to sentinel2 grid
232+
cube <- .reg_s2tile_convert(cube = cube, roi = roi, tiles = tiles)
233+
.check_that(nrow(cube) > 0,
234+
msg = .conf("messages", "sits_regularize_roi")
235+
)
236+
# Filter tiles
237+
if (is.character(tiles)) {
238+
cube <- .cube_filter_tiles(cube, tiles)
239+
}
240+
# DEMs don't have the temporal dimension, so the period is fixed in 1 day.
241+
period <- "P1D"
242+
# Call regularize in parallel
243+
cube <- .reg_cube(
244+
cube = cube,
245+
res = res,
246+
roi = roi,
247+
period = period,
248+
output_dir = output_dir,
249+
progress = progress
250+
)
251+
return(cube)
252+
}
253+
208254
#' @rdname sits_regularize
209255
#' @export
210256
sits_regularize.derived_cube <- function(cube, ...) {

‎inst/extdata/config_messages.yml

+1
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@
278278
.source_url: "invalid URL for requested source provider"
279279
.source_tile_get_bbox: "unable to retrieve images given a bounding box"
280280
.source_tile_get_bbox_cdse_s1_rtc: "unable to retrieve file information for S1 RTC cubes"
281+
.source_tile_get_bbox_mpc_dem_30: "unable to retrieve file information for COP DEM GLO 30m"
281282
.source_tile_get_bbox_mpc_s1_grd: "unable to retrieve file information for S1 GRD cubes"
282283
.stac_format_platform: "platform name should be unique (e.g. Landsat-8 or Sentinel-1A)"
283284
.stac_select_bands: "some bands for this product are not pre-configured in sits\n please include them in you user configuration file."

‎inst/extdata/sources/config_source_mpc.yml

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ sources:
2525
satellite : "COP-DEM-GLO"
2626
sensor : "30"
2727
collection_name : "cop-dem-glo-30"
28+
dem_cube : true
2829
open_data : true
2930
open_data_token : false
3031
metadata_search : "feature"

‎man/sits_regularize.Rd

+12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)
Please sign in to comment.