匹配CRS后用Shapefile掩蔽栅格仍全为NaN问题排查
我用R的terra包尝试用Shapefile掩蔽栅格数据,但掩蔽结果全是NaN。已经匹配了栅格和Shapefile的CRS,问题依然存在。查看绘图后发现,问题根源应该是栅格的经度范围不对——当前栅格经度是0-360,而目标区域(厄瓜多尔)的经度在-92到-75之间,两者没有空间重叠,导致掩蔽后全为NaN。
1. NOAA全球温度数据加载代码
# 加载terra包 if (!require(terra)) install.packages('terra', repos='https://rspatial.r-universe.dev') # 加载NOAA全球温度数据 tmax_2018 <- rast("data/temperature/tmax.2018.nc") tmax_2018_Jan1 <- tmax_2018[[1]]
栅格数据信息:
class : SpatRaster
dimensions : 360, 720, 1 (nrow, ncol, nlyr)
resolution : 0.5, 0.5 (x, y)
extent : 0, 360, -90, 90 (xmin, xmax, ymin, ymax)
coord. ref. : lon/lat WGS 84
source : tmax.2018.nc
varname : tmax (Daily Maximum Temperature)
name : tmax_1
unit : degC
time : 2018-01-01 UTC
2. 厄瓜多尔Shapefile加载代码
# 加载sf包 if (!require("sf")) install.packages("sf") # 加载厄瓜多尔Shapefile ecuador_shp <- st_read('data/ecu_shapefiles/ECU_adm1.shp') ecuador_shp <- st_simplify(ecuador_shp, preserveTopology = TRUE, dTolerance = 100) # 转换CRS以匹配SpatRaster的CRS ecuador_shp <- st_transform(ecuador_shp, crs(tmax_2018_Jan1)) # 将sf类转换为terra的SpatVector类 ecuador_shp <- vect(ecuador_shp)
矢量数据信息:
class : SpatVector
geometry : polygons
dimensions : 24, 9 (geometries, attributes)
extent : -92.00854, -75.20007, -5.017001, 1.681093 (xmin, xmax, ymin, ymax)
coord. ref. : lon/lat WGS 84
names : ID_0 ISO NAME_0 ID_1 NAME_1 TYPE_1 ENGTYPE_1 NL_NAME_1 VARNAME_1
type :
values : 68 ECU Ecuador 1 Azuay Provincia Province NA NA
68 ECU Ecuador 2 Bolivar Provincia Province NA NA
68 ECU Ecuador 3 Cañar Provincia Province NA NA
3. 原始掩蔽操作代码
tmax_2018_Jan1_ecu <- terra::mask(tmax_2018_Jan1, ecuador_shp) plot(tmax_2018_Jan1) # 显示空白绘图
解决方法
核心问题是栅格的经度范围(0-360)与矢量数据的经度范围(-92到-75)没有重叠,需要将栅格的经度转换为-180到180的格式。使用terra包的rotate()函数即可完成转换:
# 转换栅格经度从0-360到-180-180 tmax_2018_Jan1_rotated <- rotate(tmax_2018_Jan1) # 再次执行掩蔽操作 tmax_2018_Jan1_ecu <- terra::mask(tmax_2018_Jan1_rotated, ecuador_shp) # 查看结果 plot(tmax_2018_Jan1_ecu)
rotate()函数会自动调整栅格的经度范围,并重新排列栅格数据,确保地理坐标与矢量数据的范围匹配,这样掩蔽操作就能正确提取目标区域的栅格值。
内容的提问来源于stack exchange,提问作者Alonso Quijano

