2017-07-31 124 views
1

我有兩個柵格,我想將其中一個的空間範圍。然後將其保存爲新的光柵。我使用下面的代碼。但是,我無法將2013年的圖像以新的空間範圍保存爲新的柵格。任何指導非常感謝。更改R中的柵格空間範圍

raster_2013 <- raster("avgt2013.tif") 
extent(raster_2013) 
class  : Extent 
xmin  : 112.91 
xmax  : 153.64 
ymin  : -43.75 
ymax  : -9 
> res(raster_2013) 
[1] 0.01 0.01 
> 
> raster_2015 <- raster("avgt2015.tif") 
> extent(raster_2015) 
class  : Extent 
xmin  : 112 
xmax  : 154 
ymin  : -44 
ymax  : -9 
> res(raster_2015) 
[1] 0.01 0.01 
> 
> e <- extent(112, 154, -44, -9) 
> 
> ex = extent(raster_2015) 
> r2 = crop(raster_2013, ex) 
> 
> 
> new_2013 <- alignExtent(e, raster_2013, snap='near') 
> str(new_2013) 
Formal class 'Extent' [package "raster"] with 4 slots 
    [email protected] xmin: num 112 
    [email protected] xmax: num 154 
    [email protected] ymin: num -44 
    [email protected] ymax: num -9 
> 
> rc <- crop(raster_2013, e, snap='near') 
> extent(rc) 
class  : Extent 
xmin  : 112.91 
xmax  : 153.64 
ymin  : -43.75 
ymax  : -9 
+0

爲什麼不使用'resample'函數。您可以使用'writeRaster'功能將文件保存到磁盤。 –

+0

'resample'可以完成這項工作,但如果兩個柵格在這裏對齊,將會比簡單的'crop(extend())'鏈花費更多的時間和資源。 'resample'應該被認爲是一種蠻力方法,僅用於緊急情況;-) – ztl

回答

0

首先請make a simple reproducible example to ask a question

library(raster) 

set.seed(11) 
raster_2013 = raster(ext=extent(112.91, 153.64, -43.75, -9), res=c(0.01, 0.01)) 
raster_2013[] = rnorm(ncell(raster_2013)) 
raster_2015 = raster(ext=extent(112, 154, -44, -9), res=c(0.01, 0.01)) 
raster_2015[] = rnorm(ncell(raster_2015)) 

然後,您的代碼有幾個問題。 在你的情況下,alignExtent是沒用的,因爲兩個光柵具有相同的分辨率,並且它們的範圍與該分辨率相對應。

如果您的目標是將raster_2015的範圍提供給raster_2013,則需要認識到extent(raster_2015)相對於xmin更短(更小),但在其他地方更大或相等。所以crop單獨ping只會影響raster_2013的xmin。首先,您需要extend,二來crop以具有完全相同的程度:

new_2013 <- crop(extend(raster_2013, raster_2015), raster_2015) 
all.equal(extent(raster_2015), extent(new_2013)) 
#[1] TRUE 

正如@地理SP提到,你也可以resample raster_2013,但你通常會使用這個如果RWO柵格是而不是對齊(並且要知道,在這種情況下,由於插值會導致修改後的數據)。這裏,因爲它們是,它會產生相同的結果爲crop(extend()),但它會慢得多,更多的資源消耗:

system.time(new_2013 <- crop(extend(raster_2013, raster_2015), raster_2015)) 
# user system elapsed 
# 0.676 0.036 0.712 
system.time(new_2013_res <- resample(raster_2013, raster_2015)) 
# user system elapsed 
# 10.324 0.536 10.869 
all.equal(new_2013, new_2013_res) 
# [1] TRUE 

最後,爲了挽救它,好...您可以使用writeRaster ,因爲閱讀文檔會導致你;-)

writeRaster(new_2013, "raster_2013_extent2015.grd")