#' Telecharge les donnees brutes GADM, SRTM, Altitude, Worldclim, CMIP5, Countries, IFN, SER, SERAR
#'
#' @description La fonction permet de telecharger les donnees brutes IFN.
#'
#' @return La fonction renvoie un SpatialPointDataFrame contenant les placettes IFN arbres avec l'ensemble des
#' attributs descriptifs des placettes IFN.
#'
#' @author Pascal Obstetar
#'
#' @details 'alt' ; les donnees sont aggregees a partir des donnees SRTM 90 m de resolution entre les latitudes
#' -60 et 60. 'GADM' est la base de donnees des limites administratives des pays. 'worldclim' est la base de
#' donnees climatiques interpoles. 'SRTM' est la base de donnees CGIAR-SRTM (90 m resolution). 'countries'
#' sont les polygones des pays a haute resolution.
#'
#' Si \code{name} est 'alt' ou 'GADM' vous devez specifier l'argument 'country='. Countries sont donnes par leur
#' code ISO a 3 lettres. Utiliser getData('ISO3') pour visualiser les codes. Dans le cas de GADM vous devez specifier
#' le niveau de subdivision du pays (0=pays, 1=premier niveau de subdivision). Dans le cas de alt vous pouvez specifier
#' l'argument 'mask' a FALSE. Si il est a la valeur TRUE les pays voisins sont instancies a NA. Par exemple :
#'
#' \code{getData('GADM', country='FRA', level=1)}
#'
#' \code{getData('alt', country='FRA', mask=TRUE)}
#'
#' Si \code{name} est 'SRTM' vous devez specifier les arguments 'lon' et 'lat' (longitude et latitude).
#' Ce sont les coordonnees entieres de la zone SRTM que vous desirez.
#'
#' \code{getData('SRTM', lon=5, lat=45)}
#'
#' Si \code{name='worldclim'} vous devez specifier les arguments \code{var}, et une resolution \code{res}.
#' Les variables valides sont 'tmin', 'tmax', 'prec' et 'bio'. Les resolutions valides sont 0.5, 2.5, 5,
#' et 10 (en degres minutes). Dans le cas \code{res=0.5}, vous devez specifier l'argument \code{lon}
#' et \code{lat} ; pour les basses resolutions les variables globales sont telechargees.
#' Dans tous les cas, 12 (mois) fichiers sont charges pour chaque variable excepte pour la variable 'bio'
#' qui contient 19 fichiers.
#'
#' \code{getData('worldclim', var='tmin', res=0.5, lon=5, lat=45)}
#'
#' \code{getData('worldclim', var='bio', res=10)}
#'
#' Pour obtenir les previsions futures climatiques (CMIP5), vous devez specifier les arguments \code{var}
#' et \code{res}. Seules les resolutions 2.5, 5, et 10 sont utilisees.
#' En option, vous devez renseigner \code{model}, \code{rcp} et \code{year}.
#' Par exemple :
#'
#' \code{getData('CMIP5', var='tmin', res=10, rcp=85, model='AC', year=70)}
#'
#' function (var, model, rcp, year, res, lon, lat, path, download = TRUE)
#'
#' 'model' est une des valeurs entre 'AC', 'BC', 'CC', 'CE', 'CN', 'GF', 'GD', 'GS', 'HD', 'HG', 'HE',
#' 'IN', 'IP', 'MI', 'MR', 'MC', 'MP', 'MG', ou 'NO'.
#'
#' 'rcp' est une des valeurs entre 26, 45, 60, ou 85.
#'
#' 'year' est une des valeurs entre 50 ou 70
#'
#' Toutes les combinaisons ne sont pas correctes. Voir www.worldclim.org pour plus de details.
#'
#' @references Pour l'IFN, SER et SERAR voir : \url{http://www.ign.fr/} -
#' Pour les donnees GADM : \url{http://www.gadm.org/} -
#' Pour les donnees SRTM : \url{http://srtm.csi.cgiar.org/SELECTION/inputCoord.asp} -
#' Pour les donnees worldclim : \url{http://worldclim.org/version2} -
#' Pour les donnees CMIP5 : \url{https://esgf-node.llnl.gov/search/cmip5/}
#'
#' @param name = name
#' @param download = download
#' @param path = path
#' @param ... = another arguments
#'
#' @export getData
#'
#' @examples
#' \dontrun{
#' ## Exemple 1
#' # Chargement de toutes les donnees brutes IFN dans le repertoire IFN
#' # cree a la racine du repertoire de sauvegarde
#' # toto renvoie TRUE si la sauvegarde se deroule correctement
#' toto <- getData(name='IFN', download = T, annee=2006)
#' }
#'
getData <- function(name = "GADM", download = TRUE, path = "", ...) {
path <- .getDataPath(path)
if (name == "GADM") {
.GADM(..., download = download, path = path, version = 3.6)
} else if (name == "SRTM") {
.SRTM(..., download = download, path = path)
} else if (name == "alt") {
.raster(..., name = name, download = download, path = path)
} else if (name == "worldclim") {
.worldclim(..., download = download, path = path)
} else if (name == "CMIP5") {
.cmip5(..., download = download, path = path)
} else if (name == "ISO3") {
ccodes()[, c(2, 1)]
} else if (name == "IFNCODE") {
ifncodes()
} else if (name == "SER") {
.SER(..., download = download, path = path)
} else if (name == "SERAR") {
.SERAR(..., download = download, path = path)
} else if (name == "RFN") {
.RFN(..., download = download, path = path)
} else if (name == "IFN") {
.IFN(..., download = download, path = path)
} else {
stop(name, " not recognized as a valid name.")
}
}
#' .nchar
#'
#' @param x
#'
#' @return
#'
.nchar <- function(x) {
x[is.na(x)] <- ""
sapply(strsplit(x, NULL), length)
}
#' .download
#'
#' @param aurl = aurl
#' @param filename = filename
#'
#' @return = file
#'
.download <- function(aurl, filename) {
fn <- paste(tempfile(), ".download", sep = "")
res <- utils::download.file(url = aurl, destfile = fn, method = "auto", quiet = FALSE, mode = "wb", cacheOK = TRUE)
if (res == 0) {
w <- getOption("warn")
on.exit(options(warn = w))
options(warn = -1)
if (!file.rename(fn, filename)) {
file.copy(fn, filename)
file.remove(fn)
}
} else {
stop("could not download the file")
}
}
#' .ISO
#'
#' @return = ISO
#'
#' @examples
#' \dontrun{
#' getData('ISO3')
#' }
#'
.ISO <- function() {
ccodes()
}
ccodes <- function() {
path <- system.file(package = "gftools")
readRDS(file.path(path, "extdata/countries.rds"))
}
#' .IFNCODE
#'
#' @return La liste des codes utilises a l'IFN
#'
#' @examples
#' \dontrun{
#' getData('IFNCODE')
#' }
#'
.IFNCODE <- function() {
ifncodes()
}
ifncodes <- function() {
path <- system.file(package = "gftools")
readRDS(file.path(path, "extdata/ifncodes.rds"))
}
#' .getCountry
#'
#' @param country
#'
.getCountry <- function(country = "") {
country <- toupper(raster::trim(country[1]))
cs <- ccodes()
cs <- sapply(cs, toupper)
cs <- data.frame(cs, stringsAsFactors = FALSE)
nc <- .nchar(country)
if (nc == 3) {
if (country %in% cs$ISO3) {
return(country)
} else {
stop("unknown country ISO3")
}
} else if (nc == 2) {
if (country %in% cs$ISO2) {
i <- which(country == cs$ISO2)
return(cs$ISO3[i])
} else {
stop("unknown country ISO2")
}
} else if (country %in% cs[, 1]) {
i <- which(country == cs[, 1])
return(cs$ISO3[i])
} else if (country %in% cs[, 4]) {
i <- which(country == cs[, 4])
return(cs$ISO3[i])
} else if (country %in% cs[, 5]) {
i <- which(country == cs[, 5])
return(cs$ISO3[i])
} else {
stop("provide a valid name name or 3 letter ISO country code; you can get a list with \"getData('ISO3')\"")
}
}
#' .getDataPath
#'
#' @param path = path
#'
#' @export
#'
.getDataPath <- function(path) {
path <- raster::trim(path)
if (path == "") {
path <- getwd()
} else {
if (substr(path, .nchar(path) - 1, .nchar(path)) == "//") {
p <- substr(path, 1, .nchar(path) - 2)
} else if (substr(path, .nchar(path), .nchar(path)) == "/" | substr(path, .nchar(path), .nchar(path)) == "\\") {
p <- substr(path, 1, .nchar(path) - 1)
} else {
p <- path
}
if (!file.exists(p) & !file.exists(path)) {
stop("path does not exist: ", path)
}
}
if (substr(path, .nchar(path), .nchar(path)) != "/" & substr(path, .nchar(path), .nchar(path)) != "\\") {
path <- paste(path, "/", sep = "")
}
return(path)
}
#' .GADM
#'
#' @param country = country
#' @param level = level
#' @param download = download
#' @param path = path
#' @param version = version
#'
#' @return = files
#'
#' @examples
#' \dontrun{
#' fr <- gftools::getData('GADM', country='FRA', level=0)
#' plot(res["GID_0"])
#' }
#'
.GADM <- function(country, level, download, path, version) {
country <- .getCountry(country)
if (missing(level)) {
stop("provide a \"level=\" argument; levels can be 0, 1, 2 for most countries, and higher for some")
}
filename <- paste0(path, "gadm36_", country, "_", level, "_sf.rds")
if (!file.exists(filename)) {
if (download) {
baseurl <- paste0("https://biogeo.ucdavis.edu/data/gadm", version)
theurl <- paste0(baseurl, "/Rsf/gadm36_", country, "_", level, "_sf.rds")
.download(theurl, filename)
} else {
message("File not available locally. Use 'download = TRUE'")
}
}
if (file.exists(filename)) {
readRDS(filename)
return(data)
} else {
return(NULL)
}
}
#' .cmip5
#'
#' @param var = var
#' @param model = model
#' @param rcp = rcp
#' @param year = year
#' @param res = res
#' @param lon = lon
#' @param lat = lat
#' @param path = path
#' @param download = download
#'
.cmip5 <- function(var, model, rcp, year, res, lon, lat, path, download = TRUE) {
if (!res %in% c(0.5, 2.5, 5, 10)) {
stop("resolution should be one of: 2.5, 5, 10")
}
if (res == 2.5) {
res <- "2_5m"
} else if (res == 0.5) {
res <- "30s"
} else {
res <- paste(res, "m", sep = "")
}
var <- tolower(var[1])
vars <- c("tmin", "tmax", "prec", "bio")
stopifnot(var %in% vars)
var <- c("tn", "tx", "pr", "bi")[match(var, vars)]
model <- toupper(model)
models <- c("AC", "BC", "CC", "CE", "CN", "GF", "GD", "GS", "HD", "HG", "HE", "IN", "IP", "MI", "MR", "MC", "MP", "MG", "NO")
stopifnot(model %in% models)
rcps <- c(26, 45, 60, 85)
stopifnot(rcp %in% rcps)
stopifnot(year %in% c(50, 70))
m <- matrix(c(
0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1,
1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
), ncol = 4)
i <- m[which(model == models), which(rcp == rcps)]
if (!i) {
warning("this combination of rcp and model is not available")
return(invisible(NULL))
}
path <- paste(path, "/cmip5/", res, "/", sep = "")
dir.create(path, recursive = TRUE, showWarnings = FALSE)
zip <- tolower(paste(model, rcp, var, year, ".zip", sep = ""))
theurl <- paste("http://biogeo.ucdavis.edu/data/climate/cmip5/", res, "/", zip, sep = "")
zipfile <- paste(path, zip, sep = "")
if (var == "bi") {
n <- 19
} else {
n <- 12
}
tifs <- paste(raster::extension(zip, ""), 1:n, ".tif", sep = "")
files <- paste(path, tifs, sep = "")
fc <- sum(file.exists(files))
if (fc < n) {
if (!file.exists(zipfile)) {
if (download) {
.download(theurl, zipfile)
} else {
stop("File not available locally. Use 'download = TRUE'")
}
}
utils::unzip(zipfile, exdir = dirname(zipfile))
}
raster::stack(paste(path, tifs, sep = ""))
}
#' .worldclim
#'
#' @param var = var
#' @param res = res
#' @param lon = lon
#' @param lat = lat
#' @param path = path
#' @param download = dowload
#'
#' @return = shapefile
#'
#' @examples
#' \dontrun{
#' wc <- getData('worldclim', var='tmin', res=0.5, lon=5, lat=45)
#' plot(wc)
#' bb <- getData('worldclim', var='bio', res=10)
#' plot(bb)
#' }
#'
.worldclim <- function(var, res, lon, lat, path, download = TRUE) {
if (!res %in% c(0.5, 2.5, 5, 10)) {
stop("resolution should be one of: 0.5, 2.5, 5, 10")
}
if (res == 2.5) {
res <- "2-5"
}
stopifnot(var %in% c("tmean", "tmin", "tmax", "prec", "bio", "alt"))
path <- paste(path, "wc", res, "/", sep = "")
dir.create(path, showWarnings = FALSE)
if (res == 0.5) {
lon <- min(180, max(-180, lon))
lat <- min(90, max(-60, lat))
rs <- raster::raster(nrows = 5, ncols = 12, xmn = -180, xmx = 180, ymn = -60, ymx = 90)
row <- raster::rowFromY(rs, lat) - 1
col <- raster::colFromX(rs, lon) - 1
rc <- paste(row, col, sep = "")
zip <- paste(var, "_", rc, ".zip", sep = "")
zipfile <- paste(path, zip, sep = "")
if (var == "alt") {
bilfiles <- paste(var, "_", rc, ".bil", sep = "")
hdrfiles <- paste(var, "_", rc, ".hdr", sep = "")
} else if (var != "bio") {
bilfiles <- paste(var, 1:12, "_", rc, ".bil", sep = "")
hdrfiles <- paste(var, 1:12, "_", rc, ".hdr", sep = "")
} else {
bilfiles <- paste(var, 1:19, "_", rc, ".bil", sep = "")
hdrfiles <- paste(var, 1:19, "_", rc, ".hdr", sep = "")
}
theurl <- paste("http://biogeo.ucdavis.edu/data/climate/worldclim/1_4/tiles/cur/", zip, sep = "")
} else {
zip <- paste(var, "_", res, "m_bil.zip", sep = "")
zipfile <- paste(path, zip, sep = "")
if (var == "alt") {
bilfiles <- paste(var, ".bil", sep = "")
hdrfiles <- paste(var, ".hdr", sep = "")
} else if (var != "bio") {
bilfiles <- paste(var, 1:12, ".bil", sep = "")
hdrfiles <- paste(var, 1:12, ".hdr", sep = "")
} else {
bilfiles <- paste(var, 1:19, ".bil", sep = "")
hdrfiles <- paste(var, 1:19, ".hdr", sep = "")
}
theurl <- paste("http://biogeo.ucdavis.edu/data/climate/worldclim/1_4/grid/cur/", zip, sep = "")
}
files <- c(paste(path, bilfiles, sep = ""), paste(path, hdrfiles, sep = ""))
fc <- sum(file.exists(files))
if (fc < length(files)) {
if (!file.exists(zipfile)) {
if (download) {
.download(theurl, zipfile)
if (!file.exists(zipfile)) {
message("\n Could not download file -- perhaps it does not exist")
}
} else {
stop("File not available locally. Use 'download = TRUE'")
}
}
utils::unzip(zipfile, exdir = dirname(zipfile))
for (h in paste(path, hdrfiles, sep = "")) {
x <- readLines(h)
x <- c(x[1:14], "PIXELTYPE SIGNEDINT", x[15:length(x)])
writeLines(x, h)
}
}
if (var == "alt") {
st <- raster::raster(paste(path, bilfiles, sep = ""))
} else {
st <- raster::stack(paste(path, bilfiles, sep = ""))
}
raster::projection(st) <- "+proj=longlat +datum=WGS84"
return(st)
}
#' .raster
#'
#' @param country = country
#' @param name = name
#' @param mask = mask
#' @param path = path
#' @param download = download
#' @param keepzip = keepzip
#'
.raster <- function(country, name, mask = TRUE, path, download, keepzip = FALSE, ...) {
country <- .getCountry(country)
path <- .getDataPath(path)
if (mask) {
mskname <- "_msk_"
mskpath <- "msk_"
} else {
mskname <- "_"
mskpath <- ""
}
filename <- paste(path, country, mskname, name, ".grd", sep = "")
if (!file.exists(filename)) {
zipfilename <- filename
raster::extension(zipfilename) <- ".zip"
if (!file.exists(zipfilename)) {
if (download) {
theurl <- paste("http://biogeo.ucdavis.edu/data/diva/", mskpath, name, "/", country, mskname, name, ".zip", sep = "")
.download(theurl, zipfilename)
if (!file.exists(zipfilename)) {
message("\nCould not download file -- perhaps it does not exist")
}
} else {
stop("File not available locally. Use 'download = TRUE'")
}
}
ff <- utils::unzip(zipfilename, exdir = dirname(zipfilename))
if (!keepzip) {
file.remove(zipfilename)
}
}
if (file.exists(filename)) {
rs <- raster::raster(filename)
} else {
f <- ff[substr(ff, .nchar(ff) - 3, .nchar(ff)) == ".grd"]
if (length(f) == 0) {
warning("something went wrong")
return(NULL)
} else if (length(f) == 1) {
rs <- raster(f)
} else {
rs <- sapply(f, raster::raster)
message("returning a list of RasterLayer objects")
return(rs)
}
}
raster::projection(rs) <- "+proj=longlat +datum=WGS84"
return(rs)
}
#' .SRTM
#'
#' @param lon = lon
#' @param lat = lat
#' @param download = download
#' @param path = path
#'
#' @return = shapefile
#'
#' @examples
#' \dontrun{
#' srtm <- gftools::getData('SRTM', lon=5, lat=45)
#' plot(srtm)
#' }
#'
.SRTM <- function(lon, lat, download, path) {
stopifnot(lon >= -180 & lon <= 180)
stopifnot(lat >= -60 & lat <= 60)
rs <- raster::raster(nrows = 24, ncols = 72, xmn = -180, xmx = 180, ymn = -60, ymx = 60)
rowTile <- raster::rowFromY(rs, lat)
colTile <- raster::colFromX(rs, lon)
if (rowTile < 10) {
rowTile <- paste("0", rowTile, sep = "")
}
if (colTile < 10) {
colTile <- paste("0", colTile, sep = "")
}
f <- paste("srtm_", colTile, "_", rowTile, sep = "")
zipfilename <- paste(path, "/", f, ".zip", sep = "")
tiffilename <- paste(path, "/", f, ".tif", sep = "")
if (!file.exists(tiffilename)) {
if (!file.exists(zipfilename)) {
if (download) {
theurl <- paste("ftp://srtm.csi.cgiar.org/SRTM_V41/SRTM_Data_GeoTiff/", f, ".zip", sep = "")
test <- try(.download(theurl, zipfilename), silent = TRUE)
if (class(test) == "try-error") {
theurl <- paste("http://srtm.csi.cgiar.org/SRT-ZIP/SRTM_V41/SRTM_Data_GeoTiff/", f, ".ZIP", sep = "")
test <- try(.download(theurl, zipfilename), silent = TRUE)
if (class(test) == "try-error") {
theurl <- paste("http://srtm.csi.cgiar.org/SRT-ZIP/SRTM_V41/SRTM_Mask_GeoTiff/", f, ".ZIP", sep = "")
.download(theurl, zipfilename)
}
}
} else {
stop("file not available locally, use download=TRUE")
}
}
if (file.exists(zipfilename)) {
utils::unzip(zipfilename, exdir = dirname(zipfilename))
file.remove(zipfilename)
}
}
if (file.exists(tiffilename)) {
rs <- raster::raster(tiffilename)
raster::projection(rs) <- "+proj=longlat +datum=WGS84"
return(rs)
}
}
#' .IFN
#'
#' @param download = download
#' @param path = path
#' @param annee = annee
#'
#' @return = zipfile
#'
#' @examples
#' \dontrun{
#' ifn <- getData(name='IFN', annee = 2005)
#' }
#'
.IFN <- function(download, path, annee = 2005) {
mois <- c("-8", "-8", "-8", "-9", "-7", "-6", "-5", "-4", "-3", "-2", "-4", "")
f <- paste0(annee, mois[annee - 2004])
zipfilename <- paste0(path, "/IFN/", f, ".zip")
if (!file.exists(zipfilename)) {
dir.create(paste0(path, "/IFN"), recursive = TRUE, showWarnings = FALSE)
if (download) {
theurl <- paste("http://inventaire-forestier.ign.fr/IMG/zip/", f, ".zip", sep = "")
.download(theurl, zipfilename)
} else {
message("file not available locally, use download=TRUE")
}
}
message(paste(zipfilename, "is downloaded!"))
}
#' .SER
#'
#' @param download = download
#' @param path = path
#'
#' @return = shapefile
#'
#' @examples
#' \dontrun{
#' ser <- gftools::getData(name='SER')
#' plot(ser)
#' }
#'
.SER <- function(download, path) {
zipfilename <- paste0(path, "/SER/ser_l93.zip")
if (!file.exists(zipfilename)) {
dir.create(paste0(path, "/SER"), recursive = TRUE, showWarnings = FALSE)
if (download) {
theurl <- "http://inventaire-forestier.ign.fr/IMG/zip/ser_l93-2.zip"
.download(theurl, zipfilename)
} else {
stop("file not available locally, use download=TRUE")
}
}
if (file.exists(zipfilename)) {
utils::unzip(zipfilename, exdir = dirname(zipfilename))
file.remove(zipfilename)
sh <- st_read(paste0(path, "/SER/ser_l93_new.shp"), quiet = TRUE)
sh <- st_transform(sh, crs = 2154)
return(sh)
}
}
#' .SERAR
#'
#' @param download = download
#' @param path = path
#'
#' @return = shapefile
#'
#' @examples
#' \dontrun{
#' serar <- gftools::getData(name='SERAR')
#' plot(serar)
#' }
#'
.SERAR <- function(download, path) {
zipfilename <- paste0(path, "/SERAR/ser_ar_l93.zip")
if (!file.exists(zipfilename)) {
dir.create(paste0(path, "/SERAR"), recursive = TRUE, showWarnings = FALSE)
if (download) {
theurl <- "http://inventaire-forestier.ign.fr/IMG/zip/ser_ar_l93.zip"
.download(theurl, zipfilename)
} else {
stop("file not available locally, use download=TRUE")
}
}
if (file.exists(zipfilename)) {
utils::unzip(zipfilename, exdir = dirname(zipfilename))
file.remove(zipfilename)
sh <- st_read(paste0(path, "/SERAR/ser_ar_l93.shp"), quiet = TRUE)
sh <- st_transform(sh, crs = 2154)
return(sh)
}
}
#' .RFN
#'
#' @param download = download
#' @param path = path
#'
#' @return = RFN data
#'
#' @examples
#' \dontrun{
#' rfn <- gftools::getData(name='RFN')
#' plot(rfn)
#' }
#'
.RFN <- function(download, path) {
zipfilename <- paste0(path, "/RFN/rn250_l93_shp-2.zip")
if (!file.exists(zipfilename)) {
dir.create(paste0(path, "/RFN"), recursive = TRUE, showWarnings = FALSE)
if (download) {
theurl <- "http://inventaire-forestier.ign.fr/IMG/zip/rn250_l93_shp-2.zip"
.download(theurl, zipfilename)
} else {
stop("file not available locally, use download=TRUE")
}
}
if (file.exists(zipfilename)) {
utils::unzip(zipfilename, exdir = dirname(zipfilename))
file.remove(zipfilename)
sh <- st_read(paste0(path, "/RFN/rnifn250_l93.shp"), quiet = TRUE)
sh <- st_transform(sh, crs = 2154)
return(sh)
}
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.