在R中从栅格文件中获取数据

3

我对栅格文件不熟悉,但它们似乎是打开包含所有天气数据的大型政府文件的最佳方式,因此我正在尝试弄清如何使用它们。为了参考,我正在下载位于这里的文件(只是一些常规天气数据)。当我使用R中的raster包像这样导入文件时:

> r <- raster("/path/to/file.grb")

一切工作正常。当我输入时,甚至可以获得一些元数据。
> r
class       : RasterLayer 
band        : 1  (of  37  bands)
dimensions  : 224, 464, 103936  (nrow, ncol, ncell)
resolution  : 0.125, 0.125  (x, y)
extent      : -125.0005, -67.0005, 25.0005, 53.0005  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +a=6371200 +b=6371200 +no_defs 
data source : /path/to/file.grb 
names       : NLDAS_MOS0125_H.A20140629.0100.002 

目前我所做的只是以一种非常明显的方式索引栅格。

> r[100,100]
267.1

那么,我猜想我可以“索引”它,但我不知道数字267.1代表什么。这当然不是单元格中所有的内容。应该有一堆变量,包括但不限于土壤湿度、地表径流和蒸发。

我怎样才能用R以同样的方式访问这些信息呢?


str(r)提供了关于对象的更多信息,但最终并不是我需要的数据。我怀疑我需要做一些类似访问栅格的某个属性才能获取我的数据,但谁知道呢。如果有帮助的话,我可以发布str(r)的输出结果。 - user2497586
好的,如果数据存储在那里,我理解str应该会告诉你它的位置。 - coffeinjunky
栅格拥有其对象和函数的文档,您应该阅读它。这些文件不会干净地转换为栅格(通过GDAL)使用的“GIS模型”,因此请务必检查对齐是否合理,并且您的GDAL版本是否最新。即使是基本的多属性和多维模型在Grib中也非常特定,您可能需要不同的工具。 - mdsumner
@JimM。我认为你说得很对。那么,有没有一种方法可以访问栅格中的特定变量? - user2497586
1
@AlexChumbley:当你读取栅格文件时,可以指定要读取哪个波段:r <- raster("/path/to/file.grb", band = x)。默认情况下,它将读取第一个波段。 - user666993
显示剩余3条评论
3个回答

2

我认为问题在于你使用了raster而非stack。raster函数得到的是单个层级(矩阵),而stack或brick读取所有栅格层的数组。以下示例演示如何使用[i,j,z]索引提取值。

library(raster)
setwd("D:/TMP")
download.file("ftp://hydro1.sci.gsfc.nasa.gov/data/s4pa/NLDAS/NLDAS_MOS0125_H.002/2014/180/NLDAS_MOS0125_H.A20140629.0000.002.grb",
              destfile="NLDAS_MOS0125_H.A20140629.0000.002.grb", mode="wb")
r <- stack("NLDAS_MOS0125_H.A20140629.0000.002.grb")
  names(r) <- paste0("L", seq(1:nlayers(r)))
  class(r)

  # Values for [i,j]
  i=100
  j=100
  r[i,j]

  # Values for i,j and z at layer(s) 1, 5 and 10
  z=c(1,5,10)
  r[i,j][z]

2
r <- raster("/path/to/file.grb")

values <- getValues(r)

您可以在此处了解该函数的功能:
http://www.inside-r.org/packages/cran/raster/docs/values

嗯,还有其他访问数据的方式吗?这给了我与尝试按行和列索引栅格对象(r[100,100])相同的答案。每个单元格应该有各种数据点,但实际上每个单元格看起来都像是一个数字。 - user2497586

2
# create two rasters
r1 <- raster(matrix(ncol = 10, nrow = 10, runif(100))) 
r2 <- raster(matrix(ncol = 10, nrow = 10, runif(100)))

# creates a raster stack -- the stack (or brick function) allows you to
# to use multilayer band rasters
# http://www.inside-r.org/packages/cran/raster/docs/stack
st_r <- stack(r1, r2)

# extract values -- will create a matrix with 100 rows and two columns
vl <- getValues(st_r)

如果我将一个实际文件作为我的“r1”导入,那么我应该使用什么来制作我的“r2”? - user2497586

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接