我正在尝试使用http://worldclim.org中的数据创建Koppen世界地图。为了找到合适的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])))
climrast
是一个带有24个不同层的RasterStack(12层有温度数据,12层有降水数据)。 koppen
函数需要一个带有12个温度值(即x[13:24]
)和12个温度值(x[1:12]
)的向量。
yFromCell(climrast, x[1])
应该给我纬度,但calc
操作失败,因为在某些情况下yFromCell(climrast, x[1])
会返回NA
。
如果我用{10}之类的任意数字替换yFromCell(climrast, x[1])
,则calc操作正常。
知道我做错了吗?
答案 0 :(得分:1)
使用纬度值获取RasterLayer的内存安全(且简单)方法,您可以这样做:
x <- init(climrast, 'y')
使用worldclim数据的工作示例:
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)
答案 1 :(得分:0)
在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])
可以逐个单元地访问这些值。
Position: absolute