【发布时间】:2016-01-21 14:32:01
【问题描述】:
我有大型栅格 (>20 GB),并希望将每个栅格转换为特殊格式的 csv 文件,如下所示:
unique_key_column
x_coordinate
y_coordinate
layer1_values
layer2_values
等等
library(raster)
r <- raster(nrows=10,ncols=10)
r[] <- rnorm(10)
stack <- stack(r,r,r,r,r)
#create function to convert coordinate to special format
# -34.9 will be 1034900000
# sxxxdddddd, where s= sign (-=1, +=2), x=degrees (34=034),
# and d = decimal (.9=900000)
formatCoordinate <- function(x){
first_part <- ifelse(x < 0 , "1","2")
second_part <- abs(as.integer(x))
#make sure 3 part has 6 decimal places, then convert it to string
third_part <- substr(gsub(".+\\.","",as.character(format(round(x, 2),
nsmall = 6))),1,6)
result <- sprintf("%s%03d%s",first_part,second_part,third_part)
result
}
#the actual processing
stack =readAll(stack)
names(stack) <-c("l1", "l2", "l3", "l4", "l5")
#convert rasterStack to dataframe
stackPoints <- as.data.frame(rasterToPoints(stack))
#format x and x coordinates
colX <- formatCoordinate(stackPoints$x)
colY <- formatCoordinate(stackPoints$y)
#combine formatted x and y coordinates to compose a unique key
pK <- paste0(colX, colY )
stackPoints["key"] <- pK
col_idx <- grep("key", names(stackPoints))
stackPoints <- stackPoints[, c(col_idx, (1:ncol(stackPoints))[-col_idx])]
#write results to a csv file
write.table(stackPoints, "r.csv", row.names=F, sep=";", dec=",", append=F)
上面的代码适用于小型栅格,但对于大型栅格,我无法将堆栈加载到 RAM。 有没有办法将我的代码转换为使用并行处理?即使用多核读取光栅并写入 csv,而无需将光栅加载到 RAM(Mac OSX 10.11 和 Ubuntu 14.04,每个 8 核)。 最好的,
【问题讨论】:
-
你的操作系统是什么?您需要使用的并行库取决于操作系统
-
感谢您的提示。我有 Mac El-Captain 和 Ubuntu(在两台不同的计算机上)。我在问题中添加了这个细节:D
-
见here开始。
-
如果您在使用单线程时内存不足,增加线程数不一定对您有帮助。
-
文档中的思路很清晰(不过应用比较难!希望有视频能解释更多应用的思路)。我在这里尝试了类似功能 [cran.r-project.org/web/packages/raster/vignettes/functions.pdf].不幸的是,我没有成功在我的函数的小插图中应用相同的函数
标签: r csv parallel-processing raster r-raster