The method for GIS objects (terra Spat*
& sf classes) will
crop, reproject, and mask, in that order.
This is a wrapper for cropTo()
, fixErrorsIn()
,
projectTo()
, maskTo()
and writeTo()
,
with a required amount of data manipulation between these calls so that the crs match.
postProcess(x, ...)
# S3 method for list
postProcess(x, ...)
# S3 method for default
postProcess(x, ...)
A GIS object of postProcessing,
e.g., Spat* or sf*. This can be provided as a
rlang::quosure
or a normal R object.
Additional arguments passed to methods. For spatialClasses
,
these are: cropTo()
, fixErrorsIn()
,
projectTo()
, maskTo()
,
determineFilename()
, and writeTo()
.
Each of these may also pass ...
into other functions, like
writeTo()
.
This might include potentially important arguments like datatype
,
format
. Also passed to terra::project
,
with likely important arguments such as method = "bilinear"
.
See details.
A GIS file (e.g., RasterLayer
, SpatRaster
etc.) that has been
appropriately cropped, reprojected, masked, depending on the inputs.
If the rasterToMatch
or studyArea
are passed, then
the following sequence will occur:
Fix errors fixErrorsIn()
. Currently only errors fixed are for
SpatialPolygons
using buffer(..., width = 0)
.
Crop using cropTo()
Project using projectTo()
Mask using maskTo()
Determine file name determineFilename()
Write that file name to disk, optionally writeTo()
NOTE: checksumming does not occur during the post-processing stage, as
there are no file downloads. To achieve fast results, wrap
prepInputs
with Cache
rasterToMatch
and/or studyArea
argumentsFor backwards compatibility, postProcess
will continue to allow passing
rasterToMatch
and/or studyArea
arguments. Depending on which of these
are passed, different things will happen to the targetFile
located at filename1
.
See Use cases section in postProcessTo()
for post processing behaviour with
the new from
and to
arguments.
targetFile
is a raster (Raster*
, or SpatRaster
) object:rasterToMatch | studyArea | Both | |
extent | Yes | Yes | rasterToMatch |
resolution | Yes | No | rasterToMatch |
projection | Yes | No* | rasterToMatch * |
alignment | Yes | No | rasterToMatch |
mask | No** | Yes | studyArea ** |
*Can be overridden with useSAcrs
.
**Will mask with NA
s from rasterToMatch
if maskWithRTM
.
prepInputs
if (requireNamespace("terra", quietly = TRUE) && requireNamespace("sf", quietly = TRUE)) {
library(reproducible)
od <- setwd(tempdir2())
# download a (spatial) file from remote url (which often is an archive) load into R
# need 3 files for this example; 1 from remote, 2 local
dPath <- file.path(tempdir2())
remoteTifUrl <- "https://github.com/rspatial/terra/raw/master/inst/ex/elev.tif"
localFileLuxSm <- system.file("ex/luxSmall.shp", package = "reproducible")
localFileLux <- system.file("ex/lux.shp", package = "terra")
# 1 step for each layer
# 1st step -- get study area
studyArea <- prepInputs(localFileLuxSm, fun = "terra::vect") # default is sf::st_read
# 2nd step: make the input data layer like the studyArea map
# Test only relevant if connected to internet -- so using try just in case
elevForStudy <- try(prepInputs(url = remoteTifUrl, to = studyArea, res = 250,
destinationPath = dPath))
# Alternate way, one step at a time. Must know each of these steps, and perform for each layer
# \donttest{
dir.create(dPath, recursive = TRUE, showWarnings = FALSE)
file.copy(localFileLuxSm, file.path(dPath, basename(localFileLuxSm)))
studyArea2 <- terra::vect(localFileLuxSm)
if (!all(terra::is.valid(studyArea2))) studyArea2 <- terra::makeValid(studyArea2)
tf <- tempfile(fileext = ".tif")
download.file(url = remoteTifUrl, destfile = tf, mode = "wb")
Checksums(dPath, write = TRUE, files = tf)
elevOrig <- terra::rast(tf)
elevForStudy2 <- terra::project(elevOrig, terra::crs(studyArea2), res = 250) |>
terra::crop(studyArea2) |>
terra::mask(studyArea2)
isTRUE(all.equal(studyArea, studyArea2)) # Yes!
# }
# sf class
studyAreaSmall <- prepInputs(localFileLuxSm)
studyAreas <- list()
studyAreas[["orig"]] <- prepInputs(localFileLux)
studyAreas[["reprojected"]] <- projectTo(studyAreas[["orig"]], studyAreaSmall)
studyAreas[["cropped"]] <- suppressWarnings(cropTo(studyAreas[["orig"]], studyAreaSmall))
studyAreas[["masked"]] <- suppressWarnings(maskTo(studyAreas[["orig"]], studyAreaSmall))
# SpatVector-- note: doesn't matter what class the "to" object is, only the "from"
studyAreas <- list()
studyAreas[["orig"]] <- prepInputs(localFileLux, fun = "terra::vect")
studyAreas[["reprojected"]] <- projectTo(studyAreas[["orig"]], studyAreaSmall)
studyAreas[["cropped"]] <- suppressWarnings(cropTo(studyAreas[["orig"]], studyAreaSmall))
studyAreas[["masked"]] <- suppressWarnings(maskTo(studyAreas[["orig"]], studyAreaSmall))
if (interactive()) {
par(mfrow = c(2,2));
out <- lapply(studyAreas, function(x) terra::plot(x))
}
setwd(od)
}
#> Running preProcess
#> Preparing: /home/runner/work/_temp/Library/reproducible/ex/luxSmall.shp
#> Checking local files...
#> Finished checking local files.
#> alsoExtract is unspecified; assuming that all files must be extracted
#> targetFile located at /home/runner/work/_temp/Library/reproducible/ex/luxSmall.shp
#> Loading object into R
#> Running preProcess
#> targetFile was not supplied; guessed and will try /tmp/RtmpUa4z79/reproducible/fbXVVMxB/elev.tif. If this is incorrect, please supply targetFile
#> Preparing: elev.tif
#> Checking local files...
#> Finished checking local files.
#> ...downloading...
#> Downloading https://github.com/rspatial/terra/raw/master/inst/ex/elev.tif ...
#>
|
| | 0%
|
|===================================================================== | 99%
|
|======================================================================| 100%
#> Hardlinked version of file(s) created at:
#> /tmp/RtmpUa4z79/reproducible/fbXVVMxB/elev.tif
#> which point(s) to
#> /tmp/RtmpUa4z79/reproducible/ynF3kn/elev.tif
#> ... no copy/copies made.
#>
#> Checking local files...
#> Finished checking local files.
#> alsoExtract is unspecified; assuming that all files must be extracted
#> Appending checksums to CHECKSUMS.txt. If you see this messagePrepInputs repeatedly,
#> you can specify targetFile (and optionally alsoExtract) so it knows
#> what to look for.
#> Checking local files...
#> Finished checking local files.
#> targetFile located at /tmp/RtmpUa4z79/reproducible/fbXVVMxB/elev.tif
#> Loading object into R
#> cropping...
#> ...done in 0.05 secs
#> projecting...
#>
#> projectTo is a Vector dataset, which does not define all metadata required.
#> in the projection of `projectTo`, using the origin and extent
#> from `ext(from)` (in the projection from `projectTo`).
#> If this is not correct, create a template gridded object and pass that to projectTo...
#>
#> done in 0.164 secs
#> masking...
#> ...done in 0.0745 secs
#> cropping...
#> ...done in 0.0282 secs
#> postProcessTo done in 0.36 secs
#> Checking local files...
#> Finished checking local files.
#> Running preProcess
#> Preparing: /home/runner/work/_temp/Library/reproducible/ex/luxSmall.shp
#> Checking local files...
#> Finished checking local files.
#> alsoExtract is unspecified; assuming that all files must be extracted
#> alsoExtract is unspecified; assuming that all files must be extracted
#> Using sf::st_read on shapefile because sf package is available; to force old behaviour with 'raster::shapefile' use fun = 'raster::shapefile' or options('reproducible.shapefileRead' = 'raster::shapefile')
#> targetFile located at /home/runner/work/_temp/Library/reproducible/ex/luxSmall.shp
#> Loading object into R
#> Reading layer `luxSmall' from data source
#> `/home/runner/work/_temp/Library/reproducible/ex/luxSmall.shp'
#> using driver `ESRI Shapefile'
#> Simple feature collection with 4 features and 6 fields
#> Geometry type: POLYGON
#> Dimension: XY
#> Bounding box: xmin: 4522355 ymin: 11299040 xmax: 4575913 ymax: 11339850
#> Projected CRS: +proj=lcc +lat_0=0 +lon_0=-95 +lat_1=49 +lat_2=77 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs
#> Running preProcess
#> Preparing: /home/runner/work/_temp/Library/terra/ex/lux.shp
#> Checking local files...
#> Finished checking local files.
#> alsoExtract is unspecified; assuming that all files must be extracted
#> alsoExtract is unspecified; assuming that all files must be extracted
#> Using sf::st_read on shapefile because sf package is available; to force old behaviour with 'raster::shapefile' use fun = 'raster::shapefile' or options('reproducible.shapefileRead' = 'raster::shapefile')
#> targetFile located at /home/runner/work/_temp/Library/terra/ex/lux.shp
#> Loading object into R
#> ...(Object to retrieve (fb78f12d1d237284.rds))
#> loaded cached result from previous sf::st_read call
#> projecting...
#> done in 0.0265 secs
#> cropping...
#> ...done in 0.032 secs
#> masking...
#> ...done in 0.0643 secs
#> Running preProcess
#> Preparing: /home/runner/work/_temp/Library/terra/ex/lux.shp
#> Checking local files...
#> Finished checking local files.
#> alsoExtract is unspecified; assuming that all files must be extracted
#> alsoExtract is unspecified; assuming that all files must be extracted
#> targetFile located at /home/runner/work/_temp/Library/terra/ex/lux.shp
#> Loading object into R
#> projecting...
#> done in 0.0414 secs
#> cropping...
#> ...done in 0.0186 secs
#> masking...
#> ...done in 0.0179 secs