制作不同范围的栅格堆栈
Posted
技术标签:
【中文标题】制作不同范围的栅格堆栈【英文标题】:Make raster stack with different extent 【发布时间】:2018-11-23 03:11:52 【问题描述】:我在制作范围略有不同的光栅堆栈时遇到了麻烦。给出here 的答案(第一个)很有用,但对我的情况没有帮助。例如,我想为澳大利亚使用bio2 raster 和this Australian raster 创建一个栅格堆栈。第二个栅格仅适用于澳大利亚,第一个栅格是全球性的。因此,我使用crop()
函数将全球 bio2 栅格裁剪为与澳大利亚栅格相同的范围,但生成的栅格范围(即bio2.au
)略有不同(因此,我无法使用裁剪栅格和澳大利亚栅格制作栅格,awc
)。示例代码如下:
library(raster)
awc <- raster("path to Australian raster")
bio2.g <- raster("path to Bio2 global raster")
# crop bio2.g to the same extent of awc
bio2.au <- crop(bio2.g, extent(awc))
# make a raster stack
st <- stack(awc, bio2.au)
Error in compareRaster(x) : different extent
我也尝试在stack()
函数中使用quick=TRUE
。但在这种情况下,awc
中的单元格值会丢失。注意:awc
raster 的大小为 4gb。
# first make a list of rasters saved in the computer
li <- list.files("path to file", pattern = ".tif$", full.names = TRUE)
st <- stack(li, quick=TRUE)
st[[1]] # no cell values for awc
您的建议将不胜感激。我的最终目标是将多个bioclim rasters 裁剪到与Australian raster awc
相同的程度,并将它们堆叠在一起,这样光栅单元格的值就不会丢失。
编辑(@Cobin 评论后):
下面是每个栅格的属性
# global raster (bigger raster)
> r
class : RasterLayer
dimensions : 21600, 43200, 933120000 (nrow, ncol, ncell)
resolution : 0.008333333, 0.008333333 (x, y)
extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0
data source : D:\Worldclim2_Bioclim\wc2.0_bio_30s_02.tif
names : wc2.0_bio_30s_02
values : 0, 37.06667 (min, max)
# Australian raster (smaller raster)
> r1
class : RasterLayer
dimensions : 43201, 49359, 2132358159 (nrow, ncol, ncell)
resolution : 0.0008333333, 0.0008333333 (x, y)
extent : 112.8921, 154.0246, -44.00042, -7.999583 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0
data source : D:\SoilAWC5cm.EV1.tif
names : SoilAWC5cm.EV1
values : 2.997789, 27.86114 (min, max)
# new raster, after crop() function is applied
> r2 <- crop(r,extent(r1))
> r2
class : RasterLayer
dimensions : 4320, 4936, 21323520 (nrow, ncol, ncell)
resolution : 0.008333333, 0.008333333 (x, y)
extent : 112.8917, 154.025, -44, -8 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0
data source : C:\Users\Anwar\AppData\Local\Temp\Rtmpmg9fyF\raster\r_tmp_2018-11-23_164300_11308_65747.grd
names : wc2.0_bio_30s_02
values : 1.933333, 18.15833 (min, max)
# rebuild r2 to match r1
> r22 <- raster(vals=values(r2),ext=extent(r1), nrows=dim(r1)[1],ncols=dim(r1)[2])
Error in setValues(r, vals) :
length(values) is not equal to ncell(x), or to 1
【问题讨论】:
global raster (bigger raster)
分辨率与Australian raster (smaller raster)
不同。如果您想堆叠r1
和r2
,您应该重新采样栅格以确保它们具有相同的resolution
、extent
、crs
。比如函数resample(r1,r2, method='near')
谢谢@Cobin。这个技巧成功了。
【参考方案1】:
我认为两个栅格的范围是不同的,尽管栅格被crop
函数掩盖。你
应基于相同的分辨率、行和列检查awc
和bio.au
范围。因为我无法从
超链接,我举一个我自己的数据的例子。
r <- raster('/big_raster')
r1 <- raster('/small_raster')
r2 <- crop(r,extent(r1))
r1
class : RasterLayer
dimensions : 74, 157, 11618 (nrow, ncol, ncell)
resolution : 0.0833333, 0.0833333 (x, y)
extent : 89.2185, 102.3018, 30.96238, 37.12905 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0
data source : D:\D\temp\Rtest\modis8km.tif
names : modis8km
values : -32768, 32767 (min, max)
r2
class : RasterLayer
dimensions : 74, 157, 11618 (nrow, ncol, ncell)
resolution : 0.08333333, 0.08333333 (x, y)
extent : 89.25, 102.3333, 31, 37.16667 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0
data source : in memory
names : g201401a
values : -32768, 7789 (min, max)
虽然 r1 和 r1 具有相同的分辨率和尺寸,但范围有微小的偏移。它会导致堆栈错误。
stack(r1,r2)
Error in compareRaster(x) : different extent
因此,您应该重新构建 r2
以匹配 r1
:
r22 <- raster(vals=values(r2),ext=extent(r1),crs=crs(r1),
nrows=dim(r1)[1],ncols=dim(r1)[2])
现在stack(r22,r1)
会成功。
【讨论】:
谢谢。我的r1
范围是:112.8921, 154.0246, -44.00042, -7.999583
,我的r2
裁剪后的范围是:112.8917, 154.025, -44, -8
。但我收到以下错误:r22 <- raster(vals=values(r2),ext=extent(r1), nrows=dim(r1)[1], ncols=dim(r1)[2])
。 Error in setValues(r, vals) : length(values) is not equal to ncell(x), or to 1
@Cobin
主要问题是小光栅没有捕捉大光栅。裁剪后光栅有不同的行和列(宽度和高度)。你应该显示bio2.au
和awc
有问题的属性.也许cellFrom
裁剪栅格的功能更精确。 @小龙虾
谢谢。我现在在我的主要问题中添加了栅格属性。 @Cobin以上是关于制作不同范围的栅格堆栈的主要内容,如果未能解决你的问题,请参考以下文章