1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- MODISGrid <-
- function(Dir = ".", DirName = "MODIS_GRID", SubDir = TRUE, NoDataValues)
- {
- ## DEFINE
- NUM_METADATA_COLS <- 10
- if(Dir == '.') cat('Files downloaded will be written to ', file.path(getwd(), DirName), '.\n', sep = '')
- if(Dir != '.') cat('Files downloaded will be written to ', file.path(Dir, DirName), '.\n', sep = '')
- ## Create directory for storing new grid files.
- if(!file.exists(file.path(Dir, DirName))) dir.create(path = file.path(Dir, DirName))
- ## Find all MODIS data files in Dir.
- file.list <- list.files(path = Dir, pattern = ".asc$")
- file.list <- file.list[grepl("___", file.list)]
- if(length(file.list) == 0) stop("Could not find any MODIS data files in directory specified.")
- ## Check NoDataValues is a list of named vectors.
- if(!is.list(NoDataValues)) stop("NoDataValues should be a list of named vectors. See help doc.")
- ## Check the number of products in NoDataValues list equals the number found in file.list.
- prod.set <- unique(do.call(c, as.vector(lapply(
- file.path(Dir, file.list), function(x) read.csv(x, header = FALSE, as.is = TRUE)[ ,7]
- ))))
- if(any(nchar(prod.set) == 0)) stop("A subset was incompletely downloaded. Check MODISSubsets output and retry the subset.")
- if(!all(prod.set %in% names(NoDataValues))) stop("Mismatch between NoDataValues and data products found in files.")
- ## Check that NoDataValues value is specified for every data band found in file.list.
- band.set <- unique(as.vector(sapply(
- lapply(file.path(Dir, file.list), function(x) read.csv(x, header = FALSE, as.is = TRUE)[ ,6]),
- function(x) unique(substr(x, (gregexpr(".", x, fixed = TRUE)[[1]][5] + 1), nchar(x)))
- )))
- if(!all(band.set %in% names(do.call(c, unname(NoDataValues))))){
- stop("Mismatch between NoDataValues and data bands found in files.")
- }
- for(i in 1:length(file.list))
- {
- cat("Creating new GIS ASCII files from MODIS data file", i, "out of", length(file.list), "\n")
- data.file <- read.csv(file.path(Dir, file.list[i]), header = FALSE, as.is = TRUE)
- names(data.file) <- c("nrow", "ncol", "xll", "yll", "pixelsize", "row.id", "product.code", "MODIS.acq.date",
- "where", "MODIS.proc.date", 1:(ncol(data.file) - NUM_METADATA_COLS))
- ## Create directory for this data file if SubDir = TRUE.
- sub.dir <- substr(file.list[i], 1, regexpr(".asc$", file.list[i])-1)
- if(SubDir & !file.exists(file.path(Dir, DirName, sub.dir))) dir.create(path = file.path(Dir, DirName, sub.dir))
- for(n in 1:nrow(data.file))
- {
- data.band <- substr(data.file$row.id[n],
- gregexpr(".", data.file$row.id[n], fixed = TRUE)[[1]][5] + 1,
- nchar(data.file$row.id[n]))
- data.date <- data.file$MODIS.acq.date[n]
- path <- ifelse(SubDir,
- file.path(Dir, DirName, sub.dir,
- paste0("GRID_", sub.dir, "_", data.band, "_", data.date)),
- file.path(Dir, DirName,
- paste0("GRID_", sub.dir, "_", data.band, "_", data.date)))
- write(c(sprintf("ncols\t\t %i", data.file$ncol[n]),
- sprintf("nrows\t\t %i", data.file$nrow[n]),
- sprintf("xllcorner\t %.2f", data.file$xll[n]),
- sprintf("yllcorner\t %.2f", data.file$yll[n]),
- sprintf("cellsize\t %s", as.character(data.file$pixelsize[n])),
- sprintf("NODATA_value\t %s", as.character(NoDataValues[[data.file$product.code[n]]][data.band]))),
- file = file.path(paste0(path,".asc")))
- WritePRJ(Path = file.path(paste0(path,".prj")))
- grid.data <- matrix(data.file[n,(NUM_METADATA_COLS+1):ncol(data.file)],
- nrow = data.file$nrow[n], ncol = data.file$ncol[n], byrow = TRUE)
- write.table(grid.data, file = file.path(paste0(path,".asc")), append = TRUE, col.names = FALSE, row.names = FALSE)
- }
- }
- }
|