R语言projectRaster栅格投影时值全部丢失为NA的问题
问题根因
操作里有三个核心错误,直接导致投影结果全为NA:
- 混淆了投影坐标系和地理坐标系的坐标单位与取值范围:原始栅格
rb是北极立体投影,坐标单位是千米,你直接把该投影下的平面坐标数值(比如y方向-4658这类数值)原封不动设为WGS84经纬度坐标系的范围。要知道WGS84经纬度的纬度合法取值仅为-9090、经度为-180180,你设置的范围完全超出地理坐标系的有效取值边界,坐标转换时自然会出现大量非有限值的报错。 - 目标坐标系定义错误:
+proj=longlat代表地理坐标系,不存在zone(分带)参数,分带是UTM等投影坐标系才有的参数,你写的+zone=34属于无效参数,最终生成的目标栅格根本没有正确识别你写的坐标系参数。 - 投影函数参数传递冲突:调用
projectRaster时你已经传入了提前创建的dest_raster对象(该对象本身已包含分辨率、坐标系、范围信息),又重复传入res、crs参数,容易触发参数优先级混乱,导致投影计算异常。
修复步骤
按如下流程操作即可得到正确投影结果:
- 清理目标坐标系的无效参数,定义合法的WGS84经纬度坐标系
- 不要手动硬编码目标栅格范围,先提取原始栅格的四个角点,将角点坐标从原始投影转换到目标经纬度坐标系,用转换后得到的合法经纬度范围作为目标栅格的范围
- 设置匹配原始精度的经纬度分辨率:原始栅格分辨率为1km,对应经纬度下约0.009~0.01度的分辨率,不要直接沿用1度的分辨率设置
- 调用投影函数时不要重复传参,根据栅格数据类型选择重采样方法:连续值用双线性插值
bilinear,分类值用最邻近插值ngb
对应可运行代码如下:
library(raster) # 定义正确的目标WGS84经纬度坐标系,移除无效的zone参数 dest_crs <- "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0" # 提取原始栅格四个角点坐标 rb_ext <- extent(rb) rb_corners <- matrix(c( xmin(rb_ext), ymin(rb_ext), xmin(rb_ext), ymax(rb_ext), xmax(rb_ext), ymin(rb_ext), xmax(rb_ext), ymax(rb_ext) ), ncol=2, byrow=TRUE) # 将角点从原始立体投影转换到目标经纬度坐标系,得到合法的经纬度范围 corners_trans <- project(rb_corners, from = crs(rb), to = dest_crs) dest_ext <- extent( min(corners_trans[,1]), max(corners_trans[,1]), min(corners_trans[,2]), max(corners_trans[,2]) ) # 创建合法的目标栅格,分辨率设为0.01度(约1km精度,匹配原始数据) dest_raster <- raster(ext = dest_ext, res = 0.01, crs = dest_crs) # 执行投影,连续数据用bilinear,分类数据替换为method = "ngb" new_raster <- projectRaster(rb, dest_raster, method = "bilinear")
之前出现
29700 projected point(s) not finite警告的直接原因,就是你给经纬度栅格设置了超出合法取值范围的坐标值,所有待转换的点都无法映射到有效经纬度位置,最终计算结果全为NA。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

