更改 R 中的栅格空间范围
Posted
技术标签:
【中文标题】更改 R 中的栅格空间范围【英文标题】:Changing the raster spatial extent in R 【发布时间】:2017-07-31 02:19:16 【问题描述】:我有两个栅格,我想将一个的空间范围扩展到另一个。然后将其另存为新栅格。我使用了以下代码。但是,我无法将具有新空间范围的 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
【问题讨论】:
你为什么不使用resample
函数。您可以使用writeRaster
函数将文件保存到磁盘。
resample
可以完成这项工作,但由于两个栅格在此处对齐,因此比简单的 crop(extend())
链更耗费时间和资源。 resample
应被视为仅在紧急情况下使用的蛮力方法;-)
【参考方案1】:
首先,请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
正如@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")
【讨论】:
以上是关于更改 R 中的栅格空间范围的主要内容,如果未能解决你的问题,请参考以下文章