我有一个大的(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")
}
答案 0 :(得分:0)
我认为这是使用GDAL的情况,特别是gdal_rasterize
函数。
如果您正在执行大量空间操作,则可能已在计算机上安装了GDAL,并且可以使用system()
命令从R中运行GDAL命令。我没有做任何测试或其他任何测试,但这比使用R中的raster
包要快得多。
例如,下面的代码从河流的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
参数,该参数指定要在输出栅格中刻录的输入向量中的属性名称。关于possible arguments here的完整详情。
注意:sprintf()
函数仅用于格式化使用system()
函数传递给命令行的文本字符串