## ----include = FALSE---------------------------------------------------------- knitr::opts_chunk$set(warning = FALSE, message = FALSE) ## ----------------------------------------------------------------------------- rlang::check_installed("targets") ## ----load-package------------------------------------------------------------- library(chopin) library(sf) library(spatstat.random) sf::sf_use_s2(FALSE) set.seed(202404) ## ----nc-gen-points------------------------------------------------------------ ncpoly <- system.file("shape/nc.shp", package = "sf") ncsf <- sf::read_sf(ncpoly) ncsf <- sf::st_transform(ncsf, "EPSG:5070") plot(sf::st_geometry(ncsf)) ncpoints <- sf::st_sample( x = ncsf, type = "Thomas", mu = 20, scale = 1e4, kappa = 1.25e-9 ) ncpoints <- sf::st_as_sf(ncpoints) ncpoints <- sf::st_set_crs(ncpoints, "EPSG:5070") ncpoints$pid <- sprintf("PID-%05d", seq(1, nrow(ncpoints))) plot(sf::st_geometry(ncpoints)) ## ----------------------------------------------------------------------------- ncgrid_sf <- par_pad_grid( input = ncpoints, mode = "grid", nx = 6L, ny = 3L, padding = 1e4L, return_wkt = FALSE ) ncgrid_sf$original ncgrid_sf$padded ## ----------------------------------------------------------------------------- ncgrid_wkt <- par_pad_grid( input = ncpoints, mode = "grid", nx = 6L, ny = 3L, padding = 1e4L, return_wkt = TRUE ) ncgrid_wkt$original ncgrid_wkt$padded ## ----------------------------------------------------------------------------- calc_something <- function(x, y, unit_grid, pad_grid, ...) { # 0. restore unit_grid and pad_grid to sf objects if they are in WKT format # 1-1. make x subset using intersect logic between x and unit_grid # 1-2. read y subset using intersect logic between y and pad_grid # 2. make buffer of x # 3. do actual calculation (use ... wisely to pass additional arguments) # 4. return the result } ## ----------------------------------------------------------------------------- calc_something <- function(x, y, unit_grid, pad_grid, ...) { # 1-1. make x subset using intersect logic between x and unit_grid x <- x[unit_grid, ] # 1-2. read y subset using intersect logic between y and pad_grid yext <- terra::ext(sf::st_bbox(pad_grid)) yras <- terra::rast(y, win = yext) # 2. make buffer of x xbuffer <- sf::st_buffer(x, units::set_units(10, "km")) # 3. do actual calculation (use ... wisely to pass additional arguments) xycalc <- exactextractr::exact_extract( yras, xbuffer, force_df = TRUE, fun = "mean", append_cols = "pid", # assume that pid is a unique identifier progress = FALSE ) # 4. return the result return(xycalc) } ## ----------------------------------------------------------------------------- ncgrid_sflist <- par_split_list(ncgrid_sf) ## ----------------------------------------------------------------------------- calc_something <- function(x, y, unit_grid, pad_grid, ...) { # 0. restore unit_grid and pad_grid to sf objects if they are in WKT format unit_grid <- sf::st_as_sf(wkt = unit_grid) pad_grid <- sf::st_as_sf(wkt = pad_grid) # 1-1. make x subset using intersect logic between x and unit_grid x <- x[unit_grid, ] # 1-2. read y subset using intersect logic between y and pad_grid yext <- terra::ext(sf::st_bbox(pad_grid)) yras <- terra::rast(y, win = yext) # 2. make buffer of x xbuffer <- sf::st_buffer(x, units::set_units(10, "km")) # 3. do actual calculation (use ... wisely to pass additional arguments) xycalc <- exactextractr::exact_extract( yras, xbuffer, fun = "mean", force_df = TRUE, append_cols = "pid", # assume that pid is a unique identifier progress = FALSE ) # 4. return the result return(xycalc) } ## ----------------------------------------------------------------------------- ncgrid_wktlist <- par_split_list(ncgrid_wkt)