栅格计算操作中的纬度

时间:2018-06-04 11:24:01

标签: r coordinates r-raster

我正在尝试使用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操作正常。

知道我做错了吗?

2 个答案:

答案 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)

enter image description here

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

所以让我们制作一个具有正确纬度的栅格图层

calc

enter image description here

那好多了。现在我们可以将它作为一个层添加到我们的气候数据中,以便climrast = stack(list(clim, lat)) koppen = calc(climrast, function(x) x[1]*x[2]) 可以逐个单元地访问这些值。

Position: absolute