批量转换栅格数据为excel文件
- 2026-09-14 15:45:41
批量转换栅格数据为excel文件

无尽星空的领路者
栅格数据本质上是一个规则网格上的数值矩阵,每一个像元对应一个数值。然而,栅格数据通常以GeoTIFF等格式存在,不利于直接进行R语言或Python的统计分析、机器学习建模或显著性检验。因此,我们有时候需要将栅格数据批量转换为 Excel(或表格化数据)。
我们准备重采样后对齐分辨率的tif文件在一个文件夹内:

然后,在R内执行下面代码:
library(raster)library(data.table)in_dir <- "C:/Users/A/Desktop/预测因子"out_dir <- in_dirtif_files <- list.files(in_dir, pattern="\\.tif$", full.names=TRUE, ignore.case=TRUE)stopifnot(length(tif_files) > 0)ref <- raster(tif_files[1])align_report <- data.frame(file = basename(tif_files),res_x = NA_real_, res_y = NA_real_,nrow = NA_integer_, ncol = NA_integer_, ncell = NA_integer_,xmin = NA_real_, xmax = NA_real_, ymin = NA_real_, ymax = NA_real_,crs = NA_character_,same_as_ref = NA,stringsAsFactors = FALSE)for(i in seq_along(tif_files)) {r <- raster(tif_files[i])rr <- res(r)e <- extent(r)align_report$res_x[i] <- rr[1]align_report$res_y[i] <- rr[2]align_report$nrow[i] <- nrow(r)align_report$ncol[i] <- ncol(r)align_report$ncell[i] <- ncell(r)align_report$xmin[i] <- e@xminalign_report$xmax[i] <- e@xmaxalign_report$ymin[i] <- e@yminalign_report$ymax[i] <- e@ymaxalign_report$crs[i] <- as.character(crs(r))align_report$same_as_ref[i] <-isTRUE(all.equal(res(r), res(ref))) &&isTRUE(all.equal(extent(r), extent(ref))) &&(nrow(r) == nrow(ref)) &&(ncol(r) == ncol(ref)) &&isTRUE(compareCRS(r, ref))}align_reportwrite.csv(align_report, file.path(out_dir, "align_report.csv"), row.names = FALSE)#统一对齐aligned_dir <- file.path(out_dir, "aligned_to_ref")if(!dir.exists(aligned_dir)) dir.create(aligned_dir, recursive = TRUE)aligned_files <- character(length(tif_files))for(i in seq_along(tif_files)) {f <- tif_files[i]r <- raster(f)out_f <- file.path(aligned_dir, paste0(tools::file_path_sans_ext(basename(f)), "_aligned.tif"))aligned_files[i] <- out_fif(align_report$same_as_ref[i] && file.exists(out_f)) {cat("", basename(out_f), "\n")next}if(align_report$same_as_ref[i]) {cat("", basename(f), "->", basename(out_f), "\n")writeRaster(r, out_f, overwrite = TRUE)} else {cat("", basename(f), "->", basename(out_f), "\n")r2 <- resample(r, ref, method = "bilinear")writeRaster(r2, out_f, overwrite = TRUE)}}#生成s <- stack(aligned_files)nm <- tools::file_path_sans_ext(basename(aligned_files))nm <- sub("_aligned$", "", nm)nm <- make.names(nm, unique = TRUE)names(s) <- nmcoords <- xyFromCell(ref, 1:ncell(ref))vals_mat <- getValues(s)big <- data.frame(x = coords[,1], y = coords[,2], vals_mat, check.names = FALSE)#过滤:只保留“至少一个指标非 NA”的像元vars <- setdiff(names(big), c("x", "y"))keep <- rowSums(!is.na(big[, vars, drop = FALSE])) > 1 #这里的0不针对具体栅格数值,针对的是每个栅格像素点对应的指标有几个,所以如果我们想真正对齐,我们可以改成1、2...,来削减掉多出的像素点big_f <- big[keep, ]out_csv <- file.path(out_dir,"predictors.csv")fwrite(big_f,file = out_csv)
结果:逐像元提取数值且带坐标:

Over~

本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。