2013-04-08 15 views
8

Ho cercato di trovare un modo efficiente in termini di tempo per unire più immagini raster in R. Queste sono scene adiacenti ASTER della regione meridionale del Kilimangiaro, e il mio obiettivo è metterle insieme per ottenerne una immagine grandeUnione di più raster in R

Questo è quello che ho ottenuto finora (oggetto 'ast14dmo' che rappresenta un elenco di oggetti raster):

# Loop through single ASTER scenes 
for (i in seq(ast14dmo.sd)) { 
    if (i == 1) { 
    # Merge current with subsequent scene 
    ast14dmo.sd.mrg <- merge(ast14dmo.sd[[i]], ast14dmo.sd[[i+1]], tolerance = 1) 
    } else if (i > 1 && i < length(ast14dmo.sd)) { 
    tmp.mrg <- merge(ast14dmo.sd[[i]], ast14dmo.sd[[i+1]], tolerance = 1) 
    ast14dmo.sd.mrg <- merge(ast14dmo.sd.mrg, tmp.mrg, tolerance = 1) 
    } else { 
    # Save merged image 
    writeRaster(ast14dmo.sd.mrg, paste(path.mrg, "/AST14DMO_sd_", z, "m_mrg", sep = ""), format = "GTiff", overwrite = TRUE) 
    } 
} 

Come sicuramente indovinare, il codice funziona. Tuttavia, la fusione richiede tempi abbastanza lunghi considerando che ogni singolo oggetto raster è grande circa 70 mb. Ho anche provato Reduce e do.call, ma ciò non è riuscito poiché non ho potuto passare l'argomento "tolerance" che elude le diverse origini dei file raster.

Qualcuno ha un'idea di come velocizzare le cose?

risposta

10

Oppure utilizzare do.call

ast14dmo.sd$tolerance <- 1 
ast14dmo.sd$filename <- paste(path.mrg, "/AST14DMO_sd_", z, "m_mrg.tif", sep = "") 
ast14dmo.sd$overwrite <- TRUE 
mm <- do.call(merge, ast14dmo.sd) 

o qui, per l'esempio in raster :: unire

r1 <- raster(xmx=-150, ymn=60, ncols=30, nrows=30) 
r1[] <- 1:ncell(r1) 
r2 <- raster(xmn=-100, xmx=-50, ymx=50, ymn=30) 
res(r2) <- c(xres(r1), yres(r1)) 
r2[] <- 1:ncell(r2) 

x <- list(r1, r2) 
x$filename <- 'test.tif' 
x$overwrite <- TRUE 
m <- do.call(merge, x) 
+0

Ottima soluzione, grazie! Ho appena dato una rapida occhiata al tempo di calcolo e ho scoperto che il tuo approccio tramite 'do.call' funziona quasi il doppio di' Reduce'. – fdetsch

3

È possibile utilizzare Reduce in questo modo, per esempio:

Reduce(function(...)merge(...,tolerance=1),ast14dmo.sd) 
+0

Questo ha fatto il trucco. Grazie mille! – fdetsch

3

La funzione "Unisci" del pacchetto Raster è un po 'lenta. Per i grandi progetti un'opzione più veloce è quello di lavorare con i comandi GDAL in R.

library(gdalUtils) 
library(rgdal) 

lista Corporatura di tutti i file raster si desidera partecipare (nella directory di lavoro corrente).

all_my_rasts <- c('r1.tif', 'r2.tif', 'r3.tif') 

Creare un file raster modello su cui costruire. Pensa a questa grande tela bianca per aggiungere piastrelle.

e <- extent(-131, -124, 49, 53) 
template <- raster(e) 
projection(template) <- '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs' 
writeRaster(template, file="MyBigNastyRasty.tif", format="GTiff") 

Unisci tutte le tessere raster in un unico grande raster.

mosaic_rasters(gdalfile=all_my_rasts,dst_dataset="MyBigNastyRasty.tif",of="GTiff") 
gdalinfo("MyBigNastyRasty.tif") 

Questo dovrebbe funzionare abbastanza bene per la velocità (più veloce che si fondono nel pacchetto raster), ma se si dispone di migliaia di piastrelle si potrebbe anche voler esaminare la costruzione di un VRT prima.

+0

Non esiste un modo più efficiente per impostare l'estensione senza indovinare lat/long? –

Problemi correlati