使用terra包裁剪栅格未得到预期范围的技术求助
问题描述
我有一个栅格,范围为-180.049996946546, 179.949996948242, -90.05, 90.05(xmin, xmax, ymin, ymax),需要将其与另一CRS相同、范围为-180, 180, -90, 90的栅格对齐。尝试用terra包的crop()函数裁剪,但未得到预期范围。
执行代码与结果
myraster |> ext() # SpatExtent : -180.049996946546, 179.949996948242, -90.05, 90.05 (xmin, xmax, ymin, ymax) new_extent # SpatExtent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax) myraster_cropped=crop(myraster,new_extent ,extend=TRUE) myraster_cropped |> ext() # SpatExtent : -180.049996946546, 180.049996946546, -89.95, 90.05 (xmin, xmax, ymin, ymax)
原栅格详情
> myraster class : SpatRaster dimensions : 1801, 3600, 1 (nrow, ncol, nlyr) resolution : 0.1, 0.1 (x, y) extent : -180.05, 179.95, -90.05, 90.05 (xmin, xmax, ymin, ymax) coord. ref. : +proj=longlat +datum=WGS84 +no_defs source(s) : memory varname : t2m (2 metre temperature) name : t2m_1 min value : 229.8191 max value : 306.1671 unit : K time : 2000-01-01 UTC
解决建议
问题出在crop()的extend=TRUE参数上:该参数会让结果栅格的范围贴合原栅格的分辨率整数倍边界,而非严格匹配你指定的new_extent。以下是两种可靠的对齐方案:
方案1:先裁剪再扩展填充
先通过crop()保留原栅格中完全落在目标范围内的像素,再用extend()将栅格范围强制扩展到new_extent,空区域自动填充NA:
# 裁剪出目标范围内的有效像素 myraster_cropped <- crop(myraster, new_extent) # 扩展到目标范围,补全空白区域 myraster_aligned <- extend(myraster_cropped, new_extent) # 验证最终范围 ext(myraster_aligned)
方案2:直接匹配目标栅格(若已存在)
如果已有目标对齐的栅格(例如命名为target_raster),使用resample()可一次性让你的栅格匹配目标的范围、分辨率和行列数:
myraster_aligned <- resample(myraster, target_raster)
原方法失效原因
原栅格分辨率为0.1,计算边界可知:
- x方向:从
-180.05到179.95共3600列,(179.95 - (-180.05))/0.1 = 3600 - 启用
extend=TRUE时,terra会自动调整范围到最近的分辨率整数倍边界,因此xmax被扩展为-180.05 + 3601*0.1 = 180.05,ymin被调整为-90.05 + 1*0.1 = -89.95,导致结果不符合预期。
内容的提问来源于stack exchange,提问作者Anjeline
相关产品推荐
相关产品推荐

