如何将包含多个数值列和几乎不规则坐标的数据框转换为 RasterStack 或 RasterBrick?

3

我一直在使用 R 中的数据框,其中包含坐标列(其值几乎是不规则间隔的,因为我不得不将它们从http://www.arcgis.com/home/item.html?id=5771199a57cc4c29ad9791022acd7f74中的分钟-秒格式转换为十进制)和与每个坐标相关联的值列,如下所示:

Latitude Longitude Elevation MAT MWMT MCMT   TD  MAP MSP AHM  SHM DD_0  DD5 DD_18 DD18 NFFD
54.99285 -129.9792        -2 6.8 14.4 -1.7 16.1 2473 696 6.8 20.6  283 1384  4100   30  246
54.99285 -129.9708        10 6.7 14.4 -1.8 16.1 2456 691 6.8 20.8  287 1383  4109   30  245
54.99285 -129.9625         5 6.8 14.4 -1.8 16.2 2431 686 6.9 21.0  286 1392  4097   31  246

# ... and so on.

我想构建一个与每列对应的层的 RasterBrick。最初,我认为,由于我的数据框命名为'clim_df':

clim_brick <- rasterFromXYZ(clim_df, crs = NA)

我希望您能够将每个列转换为砖块内的栅格层,但在此之后出现了以下错误(在将纬度和经度列名称更改为“y”和“x”之后):

Error in rasterFromXYZ(clim_df) : x cell sizes are not regular

https://www.rdocumentation.org/packages/raster/versions/2.6-7/topics/rasterFromXYZ看来,这个函数需要坐标间距相等才能正常工作。

有没有什么方法可以解决这个问题?任何帮助将不胜感激。

P.S. 我以前用过Stack Overflow来解决问题,但从未直接提问。如果我格式不正确或者没有提供足够的信息,请让我知道。谢谢!

1个回答

3
您可以尝试将digits参数设置为较低的数字:
# Create a sample raster:
r <- raster(nrow = 10, ncol = 10, xmn = 0, xmx = 10, ymn = 0, ymx = 10, crs = NA)
r[] <- runif(100)
xyz <- rasterToPoints(r)

# Add a small amount of error to the coordinates:
xyz[, 1:2] <- xyz[, 1:2] + as.matrix(expand.grid(xerror = runif(10, -1e-4, 1e-4), yerror = runif(10, -1e-4, 1e-4)))

# Try to convert back to raster:
rasterFromXYZ(xyz)
# Error in rasterFromXYZ(xyz) : x cell sizes are not regular

# Try again with a lower value of `digits`:
rasterFromXYZ(xyz, digits = 3)
# class       : RasterLayer 
# dimensions  : 10, 10, 100  (nrow, ncol, ncell)
# resolution  : 0.9998915, 0.9998748  (x, y)
# extent      : -2.843587e-05, 9.998886, 0.001149737, 9.999898  (xmin, xmax, ymin, ymax)
# coord. ref. : NA 
# data source : in memory
# names       : layer 
# values      : 0.007020388, 0.9953495  (min, max)

谢谢!您提供的解决方案对我的情况非常有效 - 但是,我还有一个小问题要问您:将坐标的数字截断为2位数后,我的对象的整体尺寸是否会发生变化?这些坐标位于90米分辨率网格中。栅格对象的分辨率是否仍然相同? - T. Zaborniak
不,您的对象的维度应该保持不变。digits参数仅用于测试网格是否规则。生成的光栅并不基于舍入后的坐标。但是,输出的光栅将是一个规则网格,因此单元格坐标值将与数据框中给定的坐标值略有不同。 - Cameron Bieganek

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