R 光栅计算操作中的纬度

R 光栅计算操作中的纬度,r,coordinates,r-raster,R,Coordinates,R Raster,我正在尝试使用来自的数据创建Koppen世界地图。为了找到合适的科本气候,我需要降水量和温度数据(对于这两个变量,我每个月都有一张光栅地图)和纬度 我试着做了以下几点: prast <- list.files(path = "prec25/", pattern = glob2rx('*.tif'), full.names = T) trast <- list.files(path = "temp25/", pattern = glob2rx('*.tif'), full.names

我正在尝试使用来自的数据创建Koppen世界地图。为了找到合适的科本气候,我需要降水量和温度数据(对于这两个变量,我每个月都有一张光栅地图)和纬度

我试着做了以下几点:

prast <- list.files(path = "prec25/", pattern = glob2rx('*.tif'), full.names = T)
trast <- list.files(path = "temp25/", pattern = glob2rx('*.tif'), full.names = T)
lrast <- c(prast, trast)
climrast <- stack(lrast)

koppen_map <- calc(climrast, filename = "koppen.tif", fun = function(x) koppen(x[13:24], x[1:12], yFromCell(climrast, x[1])))

prast在您的
calc
中,您正在将
x[1]
传递到
yFromCell
。但是
x[1]
是光栅单元格的值,而您需要将单元格编号传递给
yFromCell
。我可以用一个简单的例子来说明:

首先让我们制作一个小的虚拟光栅

library(raster)
set.seed(0)
clim = raster(matrix(sample(c(1:10,NA), 100, T), 10, 10))
现在,让我们试着用例子中的类比来得到它的纬度

lat = calc(clim, function(x) yFromCell(clim, x))
plot(lat)

正如你所看到的,这根本不对-我们得到的纬度值完全错误,因为我们传递的是单元格值而不是单元格编号

因此,让我们制作一个具有正确纬度的光栅层

lat = clim
lat[] = yFromCell(clim, 1:ncell(clim))
plot(lat)

那好多了。现在,我们可以将其作为一个图层添加到气候数据中,以便
calc
可以逐个单元访问这些值

climrast = stack(list(clim, lat))
koppen = calc(climrast, function(x) x[1]*x[2])
获取具有纬度值的光栅层的内存安全(且简单)方法,您可以执行以下操作:

x <- init(climrast, 'y')

x感谢您提供了这个非常详细的答案!这很有帮助。但是,在使用更高分辨率的光栅时,我确实遇到了一个问题:
错误:向量内存耗尽(达到限制?).local中的错误(x,值,…):值必须是向量或矩阵
我无法访问calc函数中的单元号吗?
library(raster)
prast <- getData('worldclim', var='prec', res=10)
tmin <- getData('worldclim', var='tmin', res=10)
tmax <- getData('worldclim', var='tmin', res=10)
trast <- (tmin + tmax) / 2

lat <- init(trast, 'y')

lrast <- stack(prast, trast, lat)
climrast <- crop(lrast, extent(25,30,-5,0))

# example function
koppen <- function(temp, prec, lat) {
    (sum(temp * prec) + lat) / 1000
}

koppen_map <- calc(climrast, filename = "koppen.tif", fun = function(x) koppen(x[13:24], x[1:12], x[25]), overwrite=TRUE)