1

我有两个栅格,我想将一个的空间范围设置为另一个。然后将其另存为新栅格。我使用了以下代码。但是,我无法将具有新空间范围的 2013 年图像保存为新栅格。非常感谢任何指导。

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
  ..@ xmin: num 112
  ..@ xmax: num 154
  ..@ ymin: num -44
  ..@ 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 
4

1 回答 1

0

首先,请做一个简单的可重复的例子来提问

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只会影响xminraster_2013。您首先需要extend和其次crop才能具有完全相同的程度:

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

正如@Geo-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")
于 2017-08-01T08:49:06.123 回答