如何使用R将大光栅写入表或数据库?

如何使用R将大光栅写入表或数据库?,r,maps,raster,geotiff,bigdata,R,Maps,Raster,Geotiff,Bigdata,我有几个GeoTIFF格式的大光栅 尺寸分别为34565、116908、4040、925、020(nrow、ncol、ncell)的每一个(完全重叠),值的类型不同:整数、浮点 如何使用R(或其他软件)将这些光栅值写入表或数据库,以便稍后使用Spark、python或R进行分析 我需要处理几个光栅,因此理想情况下输出表如下所示: row column raster1.value raster2.value raster3.value 1 1 56

我有几个GeoTIFF格式的大光栅

尺寸分别为34565、116908、4040、925、020(nrow、ncol、ncell)的每一个(完全重叠),值的类型不同:整数、浮点

如何使用R(或其他软件)将这些光栅值写入表或数据库,以便稍后使用Spark、python或R进行分析

我需要处理几个光栅,因此理想情况下输出表如下所示:

row     column     raster1.value  raster2.value  raster3.value
1       1          56             76             100
1       2          18             45             89
...     ...        ...            ...            ...

34656   116908     23             39             43
我对32核和128GB内存的计算设备进行了评估。因此,并行计算也是可能的

我将非常感谢你的帮助

#Load libs
library(doParallel)
library(parallel)
library(foreach)
library(data.table)
假设您有n个光栅,位于
myras/

#List of paths to rasters
raspaths <- list.files('myras', pattern='.tif$', full.names=T)

#Register cluster for parallel processing: Cores to use: all except 1
cl <- makeCluster(detectCores() - 1)
registerDoParallel(cl, cores=detectCores() - 1)

#Raster to datatable in parallel: one raster per thread
dtlist <- foreach (ras_id=raspaths, .packages=c('raster', 'data.table'), .combine='c') %dopar% {

          #Read all rasters into one big stack
          ras <- raster(ras_id)

          #get column and row indices
          ridx <- rowFromCell(object=ras, cell=1:ncell(ras))
          cidx <- colFromCell(object=ras, cell=1:ncell(ras))

          #Convert to data.frame then to data.table (slowest part, perhaps someone here knows a better way?)
          dt <- data.table(as.data.frame(ras))

          #Set key
          setkey(dt)

          #Add row and column info
          dt[, c('row', 'column'):=list(ridx, cidx)]

          #Some column ordering
          setcolorder(x=dt, c("row", "column", names(dt)[1]))
          list(dt)
}
stopCluster(cl)

#Bind all per-raster datatables into one big table
big_dt <- rbindlist(dtlist, fill=T, use.names=T)

#Write to disk as comma separated text file which can then be read into any Database e.g. Postgresql
write.csv(x=dt, file='mybigtable.csv', row.names=F)
#光栅路径列表

谢谢你的回答!有人删除了他的评论“我需要数据采用表格格式,因为(1)我想使用R中的data.table包及其“通过引用传递”属性(或者,甚至可能是Spark);(2) 如果数据是光栅格式的,我需要根据键(索引)对记录进行子集,这是我无法有效完成的;(3) 使用表、矩阵和数据库比使用光栅快得多。关于长宽格式。我更喜欢宽格式,因为我想使用所有光栅的值(例如,raster1.value+raster2.value/raster3.value)对每个单元格进行计算。在重新阅读您的问题后,我删除了注释:我认为这很清楚。只有一个问题,您的光栅是单波段还是多波段?还有,它们的命名方式是否可以仅从名称确定其顺序?Cheers如果在光栅包中完成,您的操作将更加高效。我理解您的索引需求,但在光栅中也有这样做的能力(例如,x[I,j],其中I=行,j=列)。您对数据的思考方式非常低效,并且会产生一个荒谬的大数组。当您进入这么大的数据时,使用data.table之类的东西的优势就消失了。此外,您可能有大量的RAM,但您仍然需要考虑对数据的操作,而不仅仅是持久化数据。@JeffreyEvans光栅与数据表的考虑是否取决于操作的性质??。还有,你说“当你进入这么大的数据时,使用data.table之类的东西的优势就消失了”,我被钩住了,你能再解释一下吗,或者至少给出一个参考吗?干杯。@Shekeine,这些数据稍后将用于构建机器学习模型,因此使用光栅不是一个选项,您的猜测是对的。为了更灵活地使用我想要使用的工具,我真的需要将这些数据放在一个大表中。对于您的第一个评论,所有光栅都是单波段的。因此,实际上,任务是将光栅矩阵重写为一个数据表的列。谢谢您的评论。data.table(as.data.frame(big_stack))转换是任务的瓶颈,我正在努力解决。应该有一种方法可以一块一块地读取数据并将其写入某个地方(可能,写入数据库?)。我可以开始并行读取光栅的各个部分,但我需要找到一种方法,在表结构中的某个地方高效地写入这些数据,当将数据读入R时,
光栅
堆栈
函数已经将读取过程分块,因此U也可以在多个光栅上并行读取和转换为data.table。您将得到一个大的data.tables列表,其中每个表都来自一个光栅。然后你可以写入一个大的文本文件,导入到你已经设置好的Postgres服务器实例中,或者直接导出到数据库中。我不认为最后一位是可并行的(写入文件/将结果导出到DB)。。