我有一个大的(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")
}发布于 2018-02-01 17:15:59
我认为这是使用GDAL,特别是gdal_rasterize函数的一个例子。
如果您正在执行大量空间操作,您可能已经在计算机上安装了GDAL,并且可以使用system()命令从R内运行GDAL命令。我没有做任何测试,但这比在R中使用raster包要快得多。
例如,下面的代码从河流形状文件中创建一个光栅。此代码将创建一个输出文件,该输出文件的值为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()函数传递到命令行的文本字符串。
https://stackoverflow.com/questions/48566382
复制相似问题