vignettes/Computing-Spectral-Indexes.Rmd
Computing-Spectral-Indexes.Rmd
prismaread
allows automatically computing spectral indices starting from either an original PRISMA hdf image, or from an hyperspectral cube already processed with pr_convert()
.
Spectral indices to be computed can be selected from a list of predefined ones. To do so, either specify a vector of desired indices as the indexes
argument of pr_convert()
to compute them directly from the hdf prisma data:
l2d_he5_path <- file.path(
system.file("testdata", package = "prismaread"),
"PRS_L2D_STD_20200524103704_20200524103708_0001.he5"
)
# Download and unzip using piggyback if necessary
if (!file.exists(l2d_he5_path)) {
message("Downloading test data - this may need a long time...")
if (!requireNamespace("piggyback", quietly = TRUE)) {
install.packages("piggyback")
}
l2d_zip_path <- file.path(
system.file("testdata", package = "prismaread"),
"PRS_L2D_STD_20200524103704_20200524103708_0001.zip"
)
piggyback::pb_download(
"PRS_L2D_STD_20200524103704_20200524103708_0001.zip",
repo = "irea-cnr-mi/prismaread",
dest = dirname(l2d_zip_path)
)
piggyback::pb_track(glob = "inst/testdata/*.zip, inst/testdata/*.he5")
unzip(l2d_zip_path, exdir = dirname(l2d_he5_path))
unlink(l2d_zip_path)
}
idx_out_dir <- file.path(tempdir(), "prismaread/indices")
dir.create(dirname(idx_out_dir))
pr_convert(
in_file = l2d_he5_path,
out_format = "ENVI",
out_folder = idx_out_dir,
indexes = c("GI", "MSAVI")
)
Alternatively, use function pr_compute_indexes()
to compute them starting from an hyperspectral cube already processed (note that this is a bit slower and you need to be sure that bands required to compute the index are available in the file you are using as input).
in_tif_path <- system.file(
"testdata/prismaread_test_HCO_FULL.tif",
package = "prismaread"
)
idx2_out_dir <- file.path(tempdir(), "prismaread/indices2")
dir.create(idx2_out_dir, recursive = TRUE)
idx2_out_path <- tempfile(fileext = ".tif", tmpdir = idx2_out_dir)
pr_compute_indexes(
in_file = in_tif_path,
out_file = idx2_out_path,
indexes = c("GI", "MSAVI")
)
Output file names are created by adding a suffix corresponding to the indices names to the base output filename. In addition, an ancillary file containing the formulas used to compute each index is saved (extension = .formulas
) for reference. The file shows the formulas used, giving reference to the true wavelengths of the PRISMA bands used in the computation.
list.files(idx2_out_dir, full.names = TRUE)
#> [1] "/tmp/Rtmpo7jOQM/prismaread/indices2/file2e77421948fc_GI.tif"
#> [2] "/tmp/Rtmpo7jOQM/prismaread/indices2/file2e77421948fc_MSAVI.tif"
idx2_out_MSAVI <- raster::raster(gsub(".tif", "_MSAVI.tif", idx2_out_path))
# Remove NA areas for better visualisation
idx2_out_MSAVI[idx2_out_MSAVI == -0.5 ] <- NA
mapview::mapview(idx2_out_MSAVI)
The list of available indices, shown below, was derived from the list of spectral indices available in package hsdar
, as well as from the list reported HERE.
NOTE: although a check was done on indices formulas, we do not guarantee that all of them are correct. Please check the formulas in the table to be sure.
IMPORTANT NOTE: computation of spectral indices can be done alongside extraction of spectral cubes/ancillary info. For example, commands below export the VNIR cube, LATLON and ANGLES datasets along with images relative to “GI” and “MTCI” indices.
idx3_out_dir <- file.path(tempdir(), "prismaread/indices3")
pr_compute_indexes(
in_file = l2d_he5_path,
out_folder = idx3_out_dir,
VNIR = TRUE,
LATLON = TRUE,
ANGLES = TRUE,
out_format = "ENVI",
indices = c("GI", "MTCI")
)
Additional spectral indices can be added to the aforementioned list using function pr_addindex()
, as in the following example:
pr_addindex(
Name = "myindex",
Formula = "R600 / R700",
Description = "My custom Index",
Reference = "Me (2020)"
)
Custom spectral indices can also be computed on the fly by specifying the cust_indexes
argument, as a named list, such as in:
idx4_out_dir <- file.path(tempdir(), "prismaread/indices4")
pr_convert(
l2d_he5_path,
out_format = "ENVI",
out_folder = idx4_out_dir,
indices = c("GI", "MTCI"),
cust_indices = list(myindex1 = "R500 / R600",
myindex2 = "(R800 - R680) / (R800 + R680)")
)