2014-01-07 3 views
0

Недавно я начал работать с R, поэтому этот вопрос, вероятно, является простым решением. У меня есть спутниковые снимки .tif из разных сцен. Я могу создать тестовый растровый кирпич, но процесс нужно автоматизировать из-за огромного количества файлов. Поэтому я пытался создать функцию для чтения списка файлов .tif и для вывода списка растров. Вы можете найти здесь ниже код, который я использую:R применить растровую функцию к списку символов

# Description: Prepare a raster brick with ordered acquisitions 
# from all the scenes of the study area 

library(raster) 
library(rgdal) 
library(sp) 
library(rtiff) 

rm(list = ls()) 

setwd=getwd() 

# If you want to download the .tif files of the 2 scenes from dropbox: 
dl_from_dropbox <- function(x, key) { 
    require(RCurl) 
    bin <- getBinaryURL(paste0("https://dl.dropboxusercontent.com/s/", key, "/", x), 
         ssl.verifypeer = FALSE) 
    con <- file(x, open = "wb") 
    writeBin(bin, con) 
    close(con) 
    message(noquote(paste(x, "read into", getwd())))       
} 

dl_from_dropbox("lndsr.LT52210611985245CUB00-vi.NDVI.tif", "qb1bap9rghwivwy") 
dl_from_dropbox("lndsr.LT52210611985309CUB00-vi.NDVI.tif", "sbhcffotirwnnc6") 
dl_from_dropbox("lndsr.LT52210611987283CUB00-vi.NDVI.tif", "2zrkoo00ngigfzm") 

dl_from_dropbox("lndsr.LT42240631992198XXX02-vi.NDVI.tif", "gx0ctxn2mca3u5v") 
dl_from_dropbox("lndsr.LT42240631992214XXX02-vi.NDVI.tif", "pqnjw2dpz9beeo5") 
dl_from_dropbox("lndsr.LT52240631986157CUB02-vi.NDVI.tif", "rrka10yaktv8la8") 


# 1- Create a list of .tif files with names ordered chronologically (for time series analysis later on) 
pathdir= # change 
# List all the images from any scene in that folder and 
# make a dataframe with a column for the date 
a <- list.files(path=pathdir,pattern="lndsr.LT", all.files=FALSE,full.names=FALSE) 
a1 <- as.data.frame(a, row.names=NULL, optional=FALSE, stringsAsFactors=FALSE) # class(a1$a) # character 
# Create date column with julean date and order it in ascending order 
a1$date <- substr(a1$a, 16, 22) # class(a1$date) = character 
a1 <- a1[order(a1$date),] 
# Keep only the column with the name of the scene 
a1 <- subset(a1, select=1) # class(a1$a): character 
# retrieve an ordered list from the dataframe 
ord_dates <- as.list(as.data.frame(t(a1$a))) # length(ord_dates): 4 (correct) 
# class(odd_dates) # list 

# 2- Create rasters from elements of a list 
for (i in 1:(length(ord_dates))){ 
    # Point to each individual .tif file 
    tif_file <- ord_dates[i] # Problem: accesses only the first item of ord_dates 
    # Make a raster out of it 
    r <- raster(tif_file) # we cant use here a list as an input. Gives error: 
     # Error in .local(x, ...) : list has no "x" 
    # Give it a standardised name (r1,r2,r3, etc) 
    name <- paste("r", 1:length(ord_dates),sep = "") 
    # Write the raster to file 
    writeRaster (r , filename = name,format = "GTiff", overwrite =T) 
} 

Я также пытался использовать lapply() без особого успеха.

r = lapply(ord_dates, raster) 

Можете ли вы дать мне совет о том, какую концепцию следует соблюдать? Я предполагаю, что я должен использовать матрицы, но я действительно не понимаю, какие их преимущества здесь или на каком этапе они требуются.

Любая помощь действительно оценена! Заранее спасибо

ответ

0

Предполагая ord_dates список имен файлов (которые имеют полный путь или находятся в вашем getwd()), вы можете применить (любую) функцию к этому списку с помощью lapply. К сожалению, я не тестировал это.

convertAllToRaster <- function(tif_file) { 
    r <- raster(tif_file) 
    # Give it a standardised name (r1,r2,r3, etc) 
    name <- paste("r", 1:length(ord_dates),sep = "") 
    # Write the raster to file 
    writeRaster (r , filename = name,format = "GTiff", overwrite =T) 
    message("Eeee, maybe it was written successfully.") 
} 

lapply(ord_dates, FUN = convertAllToRaster) 
+0

Благодарим за помощь Роман! Я попытался, и при использовании lapply() возникла знакомая ошибка. Он возвращает: Ошибка в (function (classes, fdef, mtable): не удается найти унаследованный метод для функции 'растер' для подписи '' factor ''. Я не понимаю, где создается фактор подписи, потому что Я думал, что исправил его раньше, убедившись, что списки имеют классный характер, а не фактор. – user3127517

+0

Элементы вашего списка, вероятно, являются факторами. В любом случае вставьте 'browser()' перед линией (или на начало функции), которую вы хотите изучить, а затем запустите свой код. Вы должны изучить среду функции, выполнить код вручную и отследить ошибку таким образом. –

0

После решения проблем с факторами и с именем это код, который работал для меня. Я добавил цикл for внутри функции, которую вы предложили, Роман. Большое спасибо за вашу любезную помощь!

convertAllToRaster <- function(ord_dates) { 
    for (i in 1:(length(ord_dates))){ 
    tif_file <- ord_dates[i] 
    r <- raster(tif_file) 
    # Keep the original name 
    name <- paste(tif_file, ".grd", sep ="") 
    # Write the raster to file 
    writeRaster (r , filename = name,format = "raster", overwrite =T) # in .grd format 
    } 
} 

lapply(ord_dates, FUN = convertAllToRaster) 
Смежные вопросы