在R中从大型栅格创建多边形

3

我有一个只包含1和NA的大型栅格文件(5GB)。我希望将其转换为仅包含1的面积的多边形,并将相邻单元格溶解成一个多边形。

我已经使用以下方式将文件导入到R中:

r = raster::raster(my_filename)
r
class      : RasterLayer 
dimensions : 17452, 45000, 785340000  (nrow, ncol, ncell)
resolution : 0.008, 0.008  (x, y)
extent     : -180, 180, -55.9875, 83.6285  (xmin, xmax, ymin, ymax)
crs        : NA 
source     : C://...binary_X01_januarysnow.asc 
names      : binary_X01_januarysnow 

我已经尝试了几种方法来创建多边形:

  • 使用dissolve == TRUE选项从栅格中创建rasterToPolygons(R崩溃)
  • 使用isoband包的isoband(R崩溃)

当我在仅涵盖西班牙地区的raster子集上尝试这两种方法时,它们都按预期工作,因此我认为问题只出现在数据的大小而不是我的代码上。

  • 然后我尝试使用read_stars读取我的raster,并使用stars :: st_as_sf(st,as_points = FALSE,merge = TRUE,connect8 = TRUE)。这返回了一个空的多边形,可能是因为该文件被读取为stars代理对象,但我不确定,在网上找不到任何信息。 然后我强制将raster读取为stars而不是stars代理,使用read_stars(my_filename,proxy = FALSE)并尝试像上面那样使用st_as_sf命令,但收到“错误:无法分配2.9 Gb大小的向量”消息。

我知道在最坏的情况下,我可能只需减少栅格分辨率和大小,就能创建所需的多边形(但分辨率不够精确),但我想知道是否有其他建议我可以尝试?1和NA都位于大的连续区域中,因此如果有帮助,仅在边缘具有高分辨率即可。

PS:这是我在StackOverflow上的第一个问题,如果我的问题描述不清楚,我很抱歉。我不知道如何提供大型数据集的可重现示例。


1
如果我理解正确的话,您的光栅大小为70,000 x 70,000像素。对于西班牙这样的地区,这意味着您每10米就有1个像素。您真的需要这种详细级别吗?即使在每个维度上将其减小10倍,也不会对高分辨率监视器上的最终绘制对象产生任何影响。此外,如果存在多个多边形,您不能将光栅拆分为围绕每个多边形的区域吗? - Allan Cameron
我已经编辑了问题,以显示有关光栅的更多信息。该地图是全球性的,我只是在西班牙地区尝试了rasterToPolygons和isoband,以查看我的方法是否有效。我正在为同事做这件事,他们选择使用这个分辨率,如果没有其他办法,我们将不得不减少它。我还考虑将全球地图分成几个区域,并在每个区域内单独制作多边形。这很麻烦,但可能是一个选项。 - Berbara Boulos
1个回答

5
你需要的是来自terra包的as.polygons()函数,它是raster包的继承者。相比rasterterra更好地处理大型数据集。

4
非常感谢您的建议!我现在已经开始使用 Terra 进行所有空间处理工作,我非常喜欢它。 - Berbara Boulos

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