You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言projectRaster栅格投影时值全部丢失为NA的问题

问题根因

操作里有三个核心错误,直接导致投影结果全为NA:

  • 混淆了投影坐标系和地理坐标系的坐标单位与取值范围:原始栅格rb是北极立体投影,坐标单位是千米,你直接把该投影下的平面坐标数值(比如y方向-4658这类数值)原封不动设为WGS84经纬度坐标系的范围。要知道WGS84经纬度的纬度合法取值仅为-9090、经度为-180180,你设置的范围完全超出地理坐标系的有效取值边界,坐标转换时自然会出现大量非有限值的报错。
  • 目标坐标系定义错误:+proj=longlat代表地理坐标系,不存在zone(分带)参数,分带是UTM等投影坐标系才有的参数,你写的+zone=34属于无效参数,最终生成的目标栅格根本没有正确识别你写的坐标系参数。
  • 投影函数参数传递冲突:调用projectRaster时你已经传入了提前创建的dest_raster对象(该对象本身已包含分辨率、坐标系、范围信息),又重复传入res、crs参数,容易触发参数优先级混乱,导致投影计算异常。
修复步骤

按如下流程操作即可得到正确投影结果:

  1. 清理目标坐标系的无效参数,定义合法的WGS84经纬度坐标系
  2. 不要手动硬编码目标栅格范围,先提取原始栅格的四个角点,将角点坐标从原始投影转换到目标经纬度坐标系,用转换后得到的合法经纬度范围作为目标栅格的范围
  3. 设置匹配原始精度的经纬度分辨率:原始栅格分辨率为1km,对应经纬度下约0.009~0.01度的分辨率,不要直接沿用1度的分辨率设置
  4. 调用投影函数时不要重复传参,根据栅格数据类型选择重采样方法:连续值用双线性插值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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 02:54:21