在R Terra中将SpatRaster转为BNG米制并解决重采样NaN问题
问题:WorldClim数据裁剪至英格兰范围并转换为BNG米制栅格时出现全NaN值
我正在使用WorldClim数据(例如BIO6),希望将其裁剪至英格兰矢量范围,并得到以BNG(英国国家格网,EPSG:27700)米制单位表示的栅格。但操作顺序不确定,执行重采样或投影后得到全NaN值。
现有数据与操作过程
已投影为BNG的WorldClim原始数据
BIO6.WORLD #class : SpatRaster #dimensions : 21600, 43200, 1 (nrow, ncol, nlyr) #resolution : 0.008333333, 0.008333333 (x, y) #extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax) #coord. ref. : OSGB36 / British National Grid (EPSG:27700) #source : wc2.0_bio_30s_06.tif #name : wc2.0_bio_30s_06 #min value : -71.9 #max value : 26.5
第一步:裁剪至英国范围
我先创建了英国范围的裁剪框并裁剪数据:
UK.CROP.EXTENT <- rast(xmin=-9, xmax=3, ymin=48, ymax=60, res=1, crs="EPSG:27700") # 裁剪至该范围 BIO6.UK <- crop(BIO6.WORLD, UK.CROP.EXTENT) # 查看裁剪后的数据 BIO6.UK #class : SpatRaster #dimensions : 1440, 1440, 1 (nrow, ncol, nlyr) #resolution : 0.008333333, 0.008333333 (x, y) #extent : -9, 3, 48, 60 (xmin, xmax, ymin, ymax) #coord. ref. : OSGB36 / British National Grid (EPSG:27700) #source(s) : memory #varname : wc2.0_bio_30s_06 #name : wc2.0_bio_30s_06 #min value : -4.8 #max value : 7.4 # 可视化结果 plot(BIO6.UK)

目标英格兰栅格(米制单位)
我想要将数据匹配到这个英格兰栅格的分辨率和范围:
ENGLAND.SPATRASTER #class : SpatRaster #dimensions : 6506, 5698, 1 (nrow, ncol, nlyr) #resolution : 100, 100 (x, y) #extent : 85720, 655520, 7020, 657620 (xmin, xmax, ymin, ymax) #coord. ref. : OSGB36 / British National Grid (EPSG:27700) #source : ENGLAND.tif #name : ENGLAND #min value : 0 #max value : 49

错误操作及结果
执行以下重采样和投影操作后,得到全NaN值:
# 重采样操作 BIO6.RESAMPLE<-terra::resample(BIO6.ENGLAND, ENGLAND.SPATRASTER, method = "near") BIO6.RESAMPLE #class : SpatRaster #dimensions : 6506, 5698, 1 (nrow, ncol, nlyr) #resolution : 100, 100 (x, y) #extent : 85720, 655520, 7020, 657620 (xmin, xmax, ymin, ymax) #coord. ref. : OSGB36 / British National Grid (EPSG:27700) #source(s) : memory #varname : ENGLAND #name : wc2.0_bio_30s_06 #min value : NaN #max value : NaN # 投影操作 BIO6.REPROJECT <- terra::project(BIO6.ENGLAND, (ENGLAND.SPATRASTER)) BIO6.REPROJECT #class : SpatRaster #dimensions : 6506, 5698, 1 (nrow, ncol, nlyr) #resolution : 100, 100 (x, y) #extent : 85720, 655520, 7020, 657620 (xmin, xmax, ymin, ymax) #coord. ref. : OSGB36 / British National Grid (EPSG:27700) #source(s) : memory #varname : ENGLAND #name : wc2.0_bio_30s_06 #min value : NaN #max value : NaN
问题原因及解决方案
核心问题
- 变量名错误:重采样和投影时使用了未定义的
BIO6.ENGLAND变量,实际只有裁剪后的BIO6.UK。 - 坐标系统不匹配:
BIO6.UK的坐标数值是经纬度格式,但被错误赋予了BNG的CRS,导致与目标栅格的米制坐标范围完全脱节。
正确操作步骤
步骤1:重新导入原生数据并确认CRS
WorldClim原生数据的CRS是WGS84(EPSG:4326),不要直接在ArcGIS中错误投影:
# 重新导入原生数据 BIO6.WORLD <- rast("wc2.0_bio_30s_06.tif") # 确认原生CRS为EPSG:4326 crs(BIO6.WORLD)
步骤2:裁剪至英国经纬度范围
# 创建WGS84坐标系的英国裁剪框 UK.CROP.EXTENT <- rast(xmin=-9, xmax=3, ymin=48, ymax=60, res=0.008333333, crs="EPSG:4326") # 裁剪数据 BIO6.UK <- crop(BIO6.WORLD, UK.CROP.EXTENT)
步骤3:投影到BNG米制坐标并匹配目标栅格
直接用project函数将经纬度数据转换为BNG,同时对齐目标栅格的分辨率和范围:
# 投影并匹配目标栅格参数,采用双线性插值更适合气候数据 BIO6.ENGLAND <- terra::project(BIO6.UK, ENGLAND.SPATRASTER, method = "bilinear")
步骤4:用英格兰矢量边界裁剪(可选)
如果有英格兰矢量边界,可进一步裁剪出精确范围:
# 导入英格兰矢量边界 england_boundary <- vect("england_boundary.shp") # 裁剪到矢量范围 BIO6.ENGLAND_FINAL <- mask(BIO6.ENGLAND, england_boundary)
验证结果
执行后查看结果:
BIO6.ENGLAND_FINAL plot(BIO6.ENGLAND_FINAL)
此时应得到非NaN的有效数据,且范围、分辨率与目标栅格一致。
内容的提问来源于stack exchange,提问作者CARLOS_BEDSON
相关产品推荐
相关产品推荐

