Skip to content

Commit 5a62a51

Browse files
committed
Merge branch 'dev' of https://github.com/e-sensing/sits into feat/appy_prop
2 parents c75d411 + cc5d089 commit 5a62a51

26 files changed

+561
-251
lines changed

NAMESPACE

+4-4
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ S3method(.raster_xres,terra)
123123
S3method(.raster_ymax,terra)
124124
S3method(.raster_ymin,terra)
125125
S3method(.raster_yres,terra)
126+
S3method(.reg_s2tile_convert,grd_cube)
127+
S3method(.reg_s2tile_convert,rtc_cube)
126128
S3method(.slice_dfr,numeric)
127129
S3method(.source_collection_access_test,"mpc_cube_sentinel-1-grd")
128130
S3method(.source_collection_access_test,mpc_cube)
@@ -312,10 +314,9 @@ S3method(sits_cluster_dendro,sits)
312314
S3method(sits_combine_predictions,average)
313315
S3method(sits_combine_predictions,default)
314316
S3method(sits_combine_predictions,uncertainty)
315-
S3method(sits_cube,"mpc_cube_sentinel-1-grd")
316-
S3method(sits_cube,"mpc_cube_sentinel-1-rtc")
317317
S3method(sits_cube,default)
318318
S3method(sits_cube,local_cube)
319+
S3method(sits_cube,sar_cube)
319320
S3method(sits_cube,stac_cube)
320321
S3method(sits_get_data,csv)
321322
S3method(sits_get_data,data.frame)
@@ -349,11 +350,10 @@ S3method(sits_reclassify,class_cube)
349350
S3method(sits_reclassify,default)
350351
S3method(sits_reduce,raster_cube)
351352
S3method(sits_reduce,sits)
352-
S3method(sits_regularize,"mpc_cube_sentinel-1-grd")
353-
S3method(sits_regularize,"mpc_cube_sentinel-1-rtc")
354353
S3method(sits_regularize,default)
355354
S3method(sits_regularize,derived_cube)
356355
S3method(sits_regularize,raster_cube)
356+
S3method(sits_regularize,sar_cube)
357357
S3method(sits_select,default)
358358
S3method(sits_select,patterns)
359359
S3method(sits_select,raster_cube)

R/api_bbox.R

+1-1
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ NULL
205205
geom_elem
206206
})
207207
# Return geom
208-
geom
208+
sf::st_make_valid(geom)
209209
}
210210
#' @title Compute the intersection of two bbox
211211
#' @noRd

R/api_check.R

+1
Original file line numberDiff line numberDiff line change
@@ -1851,6 +1851,7 @@
18511851
return(classes_tile)
18521852
})
18531853
classes_num <- unique(unlist(classes_list))
1854+
classes_num <- classes_num[!is.na(classes_num)]
18541855
labels_num <- names(sits_labels(cube))
18551856
# do the labels and raster numbers match?
18561857
.check_that(

R/api_cube.R

+19-8
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ NULL
154154
# Include class names
155155
freq <- dplyr::mutate(freq,
156156
area = area,
157-
class = labels_cube[.as_chr(freq$value)]
157+
class = labels_cube[as.character(freq$value)]
158158
)
159159
return(freq)
160160
})
@@ -314,10 +314,6 @@ NULL
314314
return(cube)
315315
}
316316
#' @export
317-
`.cube_adjust_crs.mpc_cube_sentinel-1-rtc` <- function(cube) {
318-
`.cube_adjust_crs.mpc_cube_sentinel-1-grd`(cube)
319-
}
320-
#' @export
321317
.cube_adjust_crs.default <- function(cube) {
322318
return(cube)
323319
}
@@ -334,13 +330,28 @@ NULL
334330
}
335331
#' @export
336332
.cube_s3class.raster_cube <- function(cube) {
337-
s3_class <- .source_s3class(source = .cube_source(cube = cube))
333+
334+
source <- .cube_source(cube = cube)
335+
collection <- .tile_collection(cube)
336+
s3_class <- .source_s3class(source = source)
338337
col_class <- paste(
339338
s3_class[[1]],
340-
tolower(.tile_collection(cube)),
339+
tolower(collection),
341340
sep = "_"
342341
)
343-
unique(c(col_class, s3_class, class(cube)))
342+
sar_cube <- .try({
343+
.conf("sources", source, "collections", collection, "sar_cube")
344+
},
345+
.default = FALSE
346+
)
347+
if (sar_cube) {
348+
if (grepl("rtc", col_class))
349+
unique(c(col_class, "rtc_cube", "sar_cube", s3_class, class(cube)))
350+
else
351+
unique(c(col_class, "grd_cube", "sar_cube", s3_class, class(cube)))
352+
}
353+
else
354+
unique(c(col_class, s3_class, class(cube)))
344355
}
345356
#' @export
346357
.cube_s3class.default <- function(cube) {

R/api_raster.R

+1-1
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@
235235
dim = "XY",
236236
remove = TRUE
237237
) |>
238-
sf::st_transform(crs = 4326) |>
238+
sf::st_transform(crs = "EPSG:4326") |>
239239
sf::st_coordinates()
240240

241241
colnames(result_tb) <- c("longitude", "latitude")

R/api_regularize.R

+80-19
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
fi <- .fi_filter_interval(
3838
fi = .fi(tile),
3939
start_date = timeline[[1]],
40-
end_date = timeline[[length(timeline)]]
40+
end_date = timeline[[length(timeline)]] - 1
4141
)
4242
groups <- cut(
4343
x = .fi_timeline(fi),
@@ -70,11 +70,7 @@
7070
#' @return a data cube with assets of the same period (file ID)
7171
.reg_merge_asset <- function(asset, res, roi, output_dir) {
7272
# Get band conf missing value
73-
band_conf <- .conf_eo_band(
74-
source = "MPC",
75-
collection = "SENTINEL-1-GRD",
76-
band = asset[["asset"]]
77-
)
73+
band_conf <- .tile_band_conf(asset, band = asset[["asset"]])
7874
# Prepare output file name
7975
out_file <- .file_eo_name(
8076
tile = asset,
@@ -97,13 +93,20 @@
9793
}
9894

9995
# Create template based on tile metadata
100-
block <- list(ncols = floor((.xmax(asset) - .xmin(asset)) / res),
101-
nrows = floor((.ymax(asset) - .ymin(asset)) / res))
102-
bbox <- list(xmin = .xmin(asset),
103-
xmax = .xmin(asset) + .ncols(block) * res,
104-
ymin = .ymax(asset) - .nrows(block) * res,
105-
ymax = .ymax(asset),
106-
crs = .crs(asset))
96+
if (!.has(roi)) {
97+
roi <- .bbox_as_sf(.tile_bbox(asset))
98+
}
99+
roi_bbox <- .bbox(sf::st_intersection(
100+
x = .roi_as_sf(roi, as_crs = .crs(asset)),
101+
y = .bbox_as_sf(.bbox(asset))
102+
))
103+
block <- list(ncols = floor((.xmax(roi_bbox) - .xmin(roi_bbox)) / res),
104+
nrows = floor((.ymax(roi_bbox) - .ymin(roi_bbox)) / res))
105+
bbox <- list(xmin = .xmin(roi_bbox),
106+
xmax = .xmin(roi_bbox) + .ncols(block) * res,
107+
ymin = .ymax(roi_bbox) - .nrows(block) * res,
108+
ymax = .ymax(roi_bbox),
109+
crs = .crs(roi_bbox))
107110
out_file <- .gdal_template_block(
108111
block = block,
109112
bbox = bbox,
@@ -128,13 +131,25 @@
128131
update_bbox = TRUE
129132
)
130133
}
131-
132-
.reg_s2tile_convert <- function(cube, roi) {
133-
# TODO: check cube
134+
#' @title Convert a SAR cube to MGRS tiling system
135+
#' @name .reg_s2tile_convert
136+
#' @noRd
137+
#' @description Produces the metadata description for a data cube
138+
#' to be produced by converting SAR data to MGRS tiling system
139+
#' @param cube SAR data cube
140+
#' @param roi Region of interest
141+
#' @param tiles List of MGRS tiles
142+
#' @return a data cube of MGRS tiles
143+
.reg_s2tile_convert <- function(cube, roi = NULL, tiles = NULL){
144+
UseMethod(".reg_s2tile_convert", cube)
145+
}
146+
#' @noRd
147+
#' @export
148+
#'
149+
.reg_s2tile_convert.grd_cube <- function(cube, roi = NULL, tiles = NULL) {
134150

135151
# generate Sentinel-2 tiles and intersects it with doi
136-
tiles <- .s2tile_open(roi)
137-
tiles <- tiles[.intersects(tiles, .roi_as_sf(roi)), ]
152+
tiles_mgrs <- .s2tile_open(roi, tiles)
138153

139154
# prepare a sf object representing the bbox of each image in file_info
140155
fi_bbox <- .bbox_as_sf(.bbox(
@@ -145,7 +160,7 @@
145160

146161
# create a new cube according to Sentinel-2 MGRS
147162
cube_class <- .cube_s3class(cube)
148-
cube <- tiles |>
163+
cube <- tiles_mgrs |>
149164
dplyr::rowwise() |>
150165
dplyr::group_map(~{
151166
file_info <- .fi(cube)[.intersects({{fi_bbox}}, .x), ]
@@ -172,4 +187,50 @@
172187
cube_class <- c(cube_class[1], "sar_cube", cube_class[-1])
173188
.cube_set_class(cube, cube_class)
174189
}
190+
#' @noRd
191+
#' @export
192+
#'
193+
.reg_s2tile_convert.rtc_cube <- function(cube, roi = NULL, tiles = NULL) {
194+
195+
# generate Sentinel-2 tiles and intersects it with doi
196+
tiles_mgrs <- .s2tile_open(roi, tiles)
197+
198+
# create a new cube according to Sentinel-2 MGRS
199+
cube_class <- .cube_s3class(cube)
200+
201+
cube <- tiles_mgrs |>
202+
dplyr::rowwise() |>
203+
dplyr::group_map(~{
204+
# prepare a sf object representing the bbox of each image in file_info
205+
cube_crs <- dplyr::filter(cube, .data[["crs"]] == .x$crs)
206+
fi_bbox <- .bbox_as_sf(.bbox(
207+
x = .fi(cube_crs),
208+
default_crs = .crs(cube_crs),
209+
by_feature = TRUE
210+
))
211+
browser()
212+
file_info <- .fi(cube_crs)[.intersects({{fi_bbox}}, .x), ]
213+
.cube_create(
214+
source = .tile_source(cube_crs),
215+
collection = .tile_collection(cube_crs),
216+
satellite = .tile_satellite(cube_crs),
217+
sensor = .tile_sensor(cube_crs),
218+
tile = .x[["tile_id"]],
219+
xmin = .xmin(.x),
220+
xmax = .xmax(.x),
221+
ymin = .ymin(.x),
222+
ymax = .ymax(.x),
223+
crs = paste0("EPSG:", .x[["epsg"]]),
224+
file_info = file_info
225+
)
226+
}) |>
227+
dplyr::bind_rows()
228+
229+
# Filter non-empty file info
230+
cube <- .cube_filter_nonempty(cube)
231+
232+
# Finalize customizing cube class
233+
cube_class <- c(cube_class[1], "sar_cube", cube_class[-1])
234+
.cube_set_class(cube, cube_class)
235+
}
175236

R/api_roi.R

+4
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,10 @@ NULL
9393
#' @returns \code{.roi_as_sf()}: \code{sf}.
9494
#' @noRd
9595
.roi_as_sf <- function(roi, default_crs = NULL, as_crs = NULL) {
96+
# is the roi defined by a shapefile
97+
if (is.character(roi) && file.exists(roi) && (tools::file_ext(roi) == "shp"))
98+
roi <- sf::st_read(roi)
99+
# convert R objects to sf object
96100
roi <- .roi_switch(
97101
roi = roi,
98102
sf = roi,

0 commit comments

Comments
 (0)