R语言中列表转raster栅格以实现指定坐标数据提取的方法及报错解决
操作错误排查
- 空间参数匹配错误:你构建栅格时设置的
nrows=108, ncols=21和实际数据维度完全不匹配。你的空间坐标里x方向共420个格点(对应列数),y方向共189个格点(对应行数),和填写的行列数差了一个量级,本身参数逻辑就不成立。 - 输入值维度不匹配:你传入的
vals=All$Data是维度为30×189×420的三维数组(30个时间层的多维度数据),单层raster()函数仅接受一维向量、单幅二维矩阵作为栅格值输入,直接传三维数组必然触发values must be a vector的报错。 - unlist操作方向错误:直接unlist整个
All列表会把变量名字符串、日期对象、数值数组全拆成混合类型的一维向量,栅格的读取函数无法解析非数值的混合输入,才会抛出无提示的内部运行错误。
栅格转换实现
你手里的列表是典型的气候模式三维数据结构(空间二维+时间维度),不需要做unlist这类破坏结构的操作,直接按维度拆分即可构建多层栅格栈:
- 先计算空间范围参数:
根据已有的xy坐标序列推算格点分辨率与实际边界,避免直接用坐标端点当边界导致的格点错位:library(raster) # 计算两个方向的格点分辨率 res_x <- diff(range(All$xyCoords$x)) / (length(All$xyCoords$x) - 1) res_y <- diff(range(All$xyCoords$y)) / (length(All$xyCoords$y) - 1) # 推算栅格的实际边界(格点中心向外扩半个分辨率) xmn <- min(All$xyCoords$x) - res_x/2 xmx <- max(All$xyCoords$x) + res_x/2 ymn <- min(All$xyCoords$y) - res_y/2 ymx <- max(All$xyCoords$y) + res_y/2 - 逐时间层构建栅格栈:
注意栅格的行序是从北到南排列,和你现有y坐标从南到北的排序相反,需要对纬度方向的矩阵做翻转匹配:# 初始化空栅格栈 r_stack <- stack() # 循环遍历每个时间层 for (t in seq_along(All$Dates$start)) { # 提取当前时间层的二维数据块,翻转纬度方向匹配栅格行序 mat <- All$Data[t, , ] mat <- mat[nrow(mat):1, ] # 构建单幅栅格 r_layer <- raster(mat, xmn = xmn, xmx = xmx, ymn = ymn, ymx = ymx, crs = "+proj=longlat +datum=WGS84") # 叠加到栈中,用对应日期做层名 r_stack <- addLayer(r_stack, r_layer) names(r_stack)[t] <- as.character(All$Dates$start[t]) }
指定坐标数据提取
栅格栈构建完成后,可直接用内置提取函数获取任意坐标点的全时间序列值:
# 定义需要提取的目标点(x为经度,y为纬度) target <- data.frame(x = 10, y = 40) # 提取对应位置所有时间层的数值 extract(r_stack, target)
如果不需要做栅格的空间运算,仅要取固定位置的数值,完全可以跳过栅格转换步骤:通过匹配x/y坐标在xyCoords里的索引位置,直接从All$Data三维数组中索引取值,效率远高于栅格转换流程
内容的提问来源于stack exchange,提问作者matlabcat
相关产品推荐
相关产品推荐

