如何将MODIS LAI栅格的CRS转换为匹配sf点对象的CRS?
解决MODIS LAI栅格与sf点对象的CRS匹配问题
问题分析
你尝试的几种方案里,Trial 2是错误操作:直接给栅格赋值CRS而不执行投影变换,只是修改了元数据标签,栅格的实际坐标并没有转换,自然和点对象无法对齐。另外完全没必要把sf对象转成Spatial格式,terra和sf生态已经可以直接兼容。
正确处理步骤
1. 先确认原始数据的CRS是否被正确识别
首先要确保栅格的正弦投影CRS被terra正确读取,避免后续投影出错:
library(terra) library(sf) # 加载数据 lai <- rast("lai.tif") plots <- readRDS("plots.rds") # 打印CRS信息确认 cat("栅格当前CRS:\n") print(crs(lai)) cat("\nsf点对象CRS:\n") print(st_crs(plots))
2. 正确投影栅格到sf的CRS
直接用sf对象的CRS作为投影目标,不用手动写PROJ字符串或EPSG码,避免拼写错误:
# 提取sf的CRS作为投影目标(自动适配WKT格式) target_crs <- st_crs(plots)$wkt # 执行栅格投影,可自定义分辨率(这里沿用原栅格分辨率) lai_proj <- project(lai, target_crs, res = res(lai)) # 可视化验证 plot(lai_proj) plot(st_geometry(plots), add = TRUE, pch = 19, col = "black", cex = 0.1)
3. 备选测试:转换sf点到栅格CRS(用于排查问题)
如果想验证是不是栅格投影的问题,可以反过来转换点对象,看是否能和原始栅格对齐:
plots_proj <- st_transform(plots, crs(lai)) plot(lai) plot(st_geometry(plots_proj), add = TRUE, pch = 19, col = "black", cex = 0.1)
常见排查点
- 若栅格CRS未被正确识别:手动指定MODIS正弦投影的CRS,执行
crs(lai) <- "+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +R=6371007.181 +units=m +no_defs"后再投影。 - 投影后仍不对齐:检查sf点的CRS是否确实是EPSG:25831,同时确认点的坐标范围是否符合UTM31N的特征(x约400000-600000,y约5000000-6000000)。
- 不用纠结
spTransform():sf对象用st_transform(),terra栅格用project()即可,无需转成sp对象。
内容的提问来源于stack exchange,提问作者Fran
相关产品推荐
相关产品推荐

