2013-10-08 11 views
5

Vorrei ricampionare un raster da una risoluzione elevata a una bassa risoluzione (con diversa estensione) in una cella della griglia definita. C'è un modo di usare un file raster esistente come input per lo snapping?Come ricampionare uno snap raster su una griglia esistente?

Nel pacchetto raster, aggregate e resample sembrano essere sufficienti ma non riesco a trovare come farlo.

+0

Avete bisogno di interpolare su una griglia diversa, o cosa? Tutti i file 'raster', per quanto ne so, definiscono i dati su una griglia rettangolare uniforme, quindi" utilizzando un file raster esistente "significherebbe solo" aggregazione o interpolazione da griglia MxN a LxK ". –

+0

La domanda mancava di chiarezza e non aveva alcun esempio. –

risposta

1

Si può l eseguire un comando esterno con system e chiamare un comando gdal_translate o gdal_warp. Ciò richiede ovviamente l'installazione di utility GDAL

+0

Grazie per l'idea ma l'utilizzo di gdal_translate non consente il controllo del metodo di interpolazione. Ho trovato la soluzione usando gdalwarp – Wraf

6

Per questo è possibile utilizzare projectRaster se si dispone di un raster in una proiezione e una risoluzione e si richiede l'output in una risoluzione e una proiezione particolare diversa.

L'argomento from è il tuo raster ad alta risoluzione e l'argomento to è il tuo raster a bassa risoluzione. Assicurati di aver scelto il metodo corretto per l'aggregazione (ad esempio bilinear per i dati continui e ngb (vicino più prossimo) per i dati categorici.

require(raster) 

# Projection info 
proj1 <- CRS("+proj=laea +lon_0=20 +lat_0=5 +ellps=sphere +unit=km +to_meter=1e3") 
proj2 <- CRS("+proj=longlat +datum=WGS84 +ellps=WGS84") 
# High res raster 
r1km <- raster(nrows = 1515 , ncols = 2300 , xmn = -4000 , xmx = -1700 , ymn = -15 , ymx = 1500 , crs = proj1) 

# Low res raster 
r5km <- raster(nrows = 303 , ncols = 460 , xmn = -20 , xmx = -5 , ymn = 4 , ymx = 15 , crs = proj2) 

# Set some values in high res raster 
pts <- rasterToPoints(r1km) 
values(r1km) <- 0.01*pts[,1] + sin(0.02*pi*pts[,2]) 

# Reproject using the attributes of the low res raster for output 
out <- projectRaster(from = r1km , to = r5km , method = "bilinear") 

# Plot - extent of second raster doesn't fully cover first so some data is missing 
par(mfrow = c(1,2)) 
plot(r1km) 
plot(out) 

enter image description here

Se i dati di ingresso e di uscita sono gli stessi tranne che nella risoluzione si può usare aggregata ...

# If same extent and resolution require use aggregate 
r1 <- raster(system.file("external/rlogo.grd", package="raster")) 
r5 <- aggregate(r1 , fact = 5 , method = "bilinear") 
par(mfrow = c(1,2)) 
plot(r1) 
plot(r5) 

enter image description here

+1

Grazie, ma poiché i miei due file sono nella stessa proiezione, il progetto non funziona. Riguardo all'aggregato, non posso specificare un file direttamente per poterlo fare alla griglia, perché non voglio usare un argomento "fatto" ma un file? – Wraf

+0

@Wraf dovresti davvero fornire un esempio riproducibile che mostri ciò che hai fatto in quel momento. Non penso di spendere ulteriori sforzi per indovinare le tue esigenze. Leggi [** come fare un ottimo esempio riproducibile **] (http://stackoverflow.com/q/5963269/1478381) e aggiorna la tua domanda di conseguenza! –

+0

Grazie. In effetti, non è facile trovare una risposta quando non viene fornito un esempio riproducibile. Ma il set di dati usato è piuttosto grande e fare un esempio del genere non è così facile. – Wraf

1

Questa soluzione funziona:

system(paste("gdalwarp" 
,paste(dir_path,"fileHR.tif",sep="") 
,paste(dir_path,"fileLR.tif",sep=""),sep=" ")) 

dove dir_path è la directory in cui si file vengono memorizzati, fileHR.tif è il file ad alta risoluzione, fileLR.tif è il file a bassa resoltion .

Problemi correlati