2

我有一个大的(266,000 个元素,1.7Gb)SpatialPolygonsDataFrame,我尝试将其转换为 90m 分辨率的 RasterLayer(~100,000,000 个单元格)

SpatialPolygonsDataFrame 有 12 个我感兴趣的变量,因此我打算制作 12 个 RasterLayers

目前,使用rasterize(),每次转换大约需要 2 天。因此,预计总处理时间将近一个月。

谁能建议一个更快的过程?我认为这在 ArcMap 中会快 10-40 倍,但我想在 R 中进行以保持一致,这是一个有趣的挑战!

通用代码

######################################################
### Make Rasters
######################################################
##Make template
r<-raster(res=90,extent(polys_final))

##set up loop
loop_name <- colnames(as.data.frame(polys_final))

for(i in 1:length(loop_name)){
a <-rasterize(polys_final, r, field=i)
writeRaster(a, filename=paste("/Users/PhD_Soils_raster_90m/",loop_name[i],".tif",sep=""), format="GTiff")
}
4

1 回答 1

3

我认为这是使用 GDAL 的一个案例,特别是gdal_rasterize函数。

如果您正在做很多空间工作,您可能已经在您的机器上安装了 GDAL,并且您可以使用该命令从 R 中运行 GDAL 命令system()。我没有做任何测试或任何事情,但这应该比raster在 R 中使用包快得多。

例如,下面的代码从河流的 shapefile 创建栅格。此代码创建一个输出文件,只要存在特征,输出文件的值为 1,不存在特征的地方为 0。

path_2_gdal_function <- "/Library/Frameworks/GDAL.framework/Programs/gdal_rasterize"
outRaster <- "/Users/me/Desktop/rasterized.tiff"
inVector <- "/Full/Path/To/file.shp"
theCommand <- sprintf("%s -burn 1 -a_nodata 0 -ts 1000 1000 %s  %s", path_2_gdal_function, inVector, outRaster)
system(theCommand)
  • -ts参数以像素为单位提供输出栅格的大小
  • -burn参数指定在存在要素的输出栅格中放置什么值
  • -a_nodata指示在没有找到特征的地方放置哪个值

对于您的情况,您需要添加-a attribute_name参数,该参数指定输入向量中要刻录到输出栅格中的属性名称。有关可能参数的完整详细信息,请点击此处。

注意:该sprintf()函数仅用于格式化使用该system()函数传递给命令行的文本字符串

于 2018-02-01T17:15:59.240 回答