Приведите растры в такой же степени, заполнив NA - в R
У меня есть несколько обрезанных растров с различной геометрией / контурами. В частности, пространственные карты урожайности за несколько лет одного и того же поля, но степень варьируется - измерения не всегда были общими для всего поля, а в некоторые годы только его частью. Я хочу вычислить среднее значение этих карт и объединить их в один растр среднего значения. Это, однако, означает, что не для каждого пикселя в, скажем, 5 слоях / растрах есть значение. Я мог бы принять эти пропущенные значения как NA, поэтому окончательное среднее значение будет рассчитываться только, скажем, 3 растров для частей поля, где карты не перекрываются.
Я подумал о расширении растра с помощью "extend {raster}", заполнив неперекрывающиеся части значениями NA:
y <- extend(y, shape, value=NA)
#Shape - это прямоугольная форма, которая охватывает все растры карты урожая
Это прекрасно работает для всех растров. Но они все еще не имеют такой же степени. Даже если я отрегулирую степень setExtent()
или же extent() <- extent()
до размера прямоугольного шейп-файла или даже до одного из других расширенных растров, я все еще получаю:
Ошибка в CompareRaster(x): другой номер или столбцы
... когда я хочу сложить их и использовать calc(y, fun=mean,...)
, Исходные растровые экстенты слишком различны для повторной выборки. Но они имеют одинаковое разрешение и CRS.
У кого-нибудь есть идеи, как это решить?
2 ответа
Если вы хотите выполнить операцию, такую как calc(y, fun=mean,...)
вы можете получить минимальную общую протяженность растров и обрезать их все до того, как сложите их вместе и примените операцию.
Предположим, у вас есть три растра:
# Generate 3 dummy rasters with different extents
r1 <- raster( crs="+proj=utm +zone=31")
extent(r1) <- extent(0, 100, 0, 500)
res(r1) <- c(5, 5)
values(r1) <- sample(10, ncell(r1), replace=TRUE)
r2 <- raster( crs="+proj=utm +zone=31")
extent(r2) <- extent(10, 120, -10, 400)
res(r2) <- c(5, 5)
values(r2) <- runif(ncell(r2), 1, 10)
r3 <- raster( crs="+proj=utm +zone=31")
extent(r3) <- extent(50, 150, 30, 200)
res(r3) <- c(5, 5)
values(r3) <- runif(ncell(r3), 1, 10)
Первый способ сделать это:
# Summing your rasters will only work where they are not NA
r123 = r1+r2+r3 # r123 has the minimal common extent
r1 = crop(r1, r123) # crop to that minimal extent
r2 = crop(r2, r123)
r3 = crop(r3, r123)
s123 = stack(r1, r2, r3)
s123.mean = calc(s123, fun=mean)
Другой:
# Manually compute the minimal extent
xmin <- max(bbox(r1)[1,1], bbox(r2)[1,1], bbox(r3)[1,1])
xmax <- min(bbox(r1)[1,2], bbox(r2)[1,2], bbox(r3)[1,2])
ymin <- max(bbox(r1)[2,1], bbox(r2)[2,1], bbox(r3)[2,1])
ymax <- min(bbox(r1)[2,2], bbox(r2)[2,2], bbox(r3)[2,2])
newextent=c(xmin, xmax, ymin, ymax)
r1 = crop(r1, newextent)
r2 = crop(r2, newextent)
r3 = crop(r3, newextent)
s123 = stack(r1, r2, r3)
s123.mean = calc(s123, fun=mean)
Я не слишком уверен в том, что именно вы хотите, но если вы действительно хотите, чтобы все ваши растры были полными (нет crop
операция), вы также можете вычислить максимальный экстент (так же, как второй метод выше, просто инвертировать min
а также max
) а также extend
все вы растры к этому прежде, чем сложить их (то же самое, вы просто получите большие растры, заполненные NA... не уверен, что это действительно желательно):
xmin <- min(bbox(r1)[1,1], bbox(r2)[1,1], bbox(r3)[1,1])
xmax <- max(bbox(r1)[1,2], bbox(r2)[1,2], bbox(r3)[1,2])
ymin <- min(bbox(r1)[2,1], bbox(r2)[2,1], bbox(r3)[2,1])
ymax <- max(bbox(r1)[2,2], bbox(r2)[2,2], bbox(r3)[2,2])
newextent=c(xmin, xmax, ymin, ymax)
r1 = extend(r1, newextent)
r2 = extend(r2, newextent)
r3 = extend(r3, newextent)
s123 = stack(r1, r2, r3)
s123.mean = calc(s123, fun=mean)
Это помогает?
НОТА
Вы можете не захотеть играть с setExtent()
или же extent() <- extent()
, так как вы можете закончить с неправильными географическими координатами ваших растров (то есть, будет изменен экстент, но не содержимое, так что вы на самом деле будете переводить ваши растры, скорее всего, не нацеливаясь на это, так как полученное в результате наложение между ними будет физически бессмысленным),
У меня была такая же проблема, чтобы сатаковать некоторые растры, они содержат данные биоклима. Оказалось, что я обрезал правильно, но скачать их в разных разрешениях. Посмотрите на количество столбцов у каждого растра. Это можно сделать, просто набрав в R имя растра (файла). Они могут быть одинакового размера. Надеюсь, что смогу как-нибудь помочь.