Сделать растровый стек с разным экстентом
У меня проблемы с созданием растрового стека, который немного отличается. Ответ (1-й), приведенный здесь, полезен, но не помог в моем случае. Например, я хочу создать растровый стек, используя растр bio2 для Австралии и этого австралийского растра. Второй растр предназначен только для Австралии, а первый - глобальный. Поэтому я обрезал глобальный растр bio2 до той же степени, что и австралийский растр, используя crop()
функция, но результирующий растровый экстент (т.е. 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
Я также пытался использовать quick=TRUE
в пределах stack()
функция. Но в этом случае значения ячеек в awc
потерян. Примечание: размер awc
Растр 4Гб.
# 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
Ваши предложения будут высоко оценены. Моя конечная цель состоит в том, чтобы обрезать несколько биоклим растров в той же степени, что и австралийский растр 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
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)
будет успешным.