概括
如何将 Rraster::plot
的显示限制在 Raster* 对象的范围内?为什么我问:
我是 R 初学者,必须
- 将非投影(经纬度)全球空间数据从 ASCII 转换为netCDF(已解决)
- “重新网格化”它:即,将数据限制在一个区域,对其进行投影,然后缩小(减小网格单元的大小)它(大部分已解决)
不幸的是,在科学工作中,主要是通过视觉检查来进行诸如此类的 QAs 数据转换。上面的第 1 步看起来不错。但是尽管第 2 步现在看起来好多了,但我真的只想绘制regridded的边界(或extents
)RasterLayer
。我在公共 git 存储库(此处)中有由 bash 脚本驱动的 R 代码,它执行转换步骤,并绘制转换后的输出,显然是正确的。但是,我尝试绘制 regridding 的输出raster::plot
并不完全正确(请参阅此处的前 3 页输出)。
怎么修?
细节
背景
我需要获取一些数据(全球海洋排放清单 (EI)),将其与其他数据(主要是其他 EI)结合起来,并将其输入到模型中。该模型想要使用 netCDF,并且它希望该 netCDF 在比连续美国 (CONUS) 稍大的空间域上。该图像的边界是域的边界。(请注意,域的一部分,但只有一部分是海洋的。)该模型还希望 netCDF 以某种方式投影(LCC分辨率为 12 公里)。我将此视为两个独立的问题:
- 将全局 EI 从其本机 ASCII 格式转换为 netCDF
- 将 netCDF 从全局/未投影到缩小(更精细)的投影子域“重新网格化”。
我正在尝试使用我在这个公共 git 存储库中存档的代码来解决这些问题。如果您克隆该 git 存储库,然后按照 READMEGEIA_to_netCDF.sh
中“第一个示例”的描述配置/运行 bash 驱动程序(并假设您的 R 已正确配置,特别是使用 packages= , ),它将输出 netCDF 并绘图(使用)输出到PDF,应该如下所示:输出数据的分布似乎是正确的,因此问题 1 似乎已解决。raster
ncdf4
fields::image.plot
问题
解决问题 2(又名README 中的“第二个示例” )似乎需要 R package= raster
。我的 bash 驱动程序regrid_GEIA_netCDF.sh
调用regrid.global.to.AQMEII.r
(都在存储库中),它运行没有错误,并显示其输出的 PDF。GEIA_N2O_oceanic_regrid.pdf
包含 4 页,对应 . 末尾的 4 个代码块regrid.global.to.AQMEII.r
。这里只有前3页相关(第4页尝试使用fields::image.plot
并且有更大的问题)。
Page=1/4 来自简单raster::plot
的重新网格化输出,加上来自 CONUS 地图的投影版本wrld_simpl
:
plot(out.raster)
plot(map.us.proj, add=TRUE)
不幸的是,输出看起来是全局的,或者几乎是全局的:但是输出重新网格化到的所需域要小得多:. 所以我有 3 个问题(1 个主要问题,2 个后续问题):
raster::plot
默认情况下显示的图像是否仅显示其参数中给定的范围RasterLayer
?- 如果是这样,我的 regrid 有什么问题?(更多下文)
- 如果不是(即,如果
raster::plot
默认显示超过其范围RasterLayer
),如何使raster::plot
仅显示范围RasterLayer
?
regrid.global.to.AQMEII.r
(此处)中进行重新网格化的代码似乎得到了正确的输出:
out.crs <- '+proj=lcc +lat_1=33 +lat_2=45 +lat_0=40 +lon_0=-97 +x_0=-2556000 +y_0=-1728000'
请注意,CRS 似乎与此处给出的输出域的定义相匹配。(一旦在链接页面,滚动过去的地图。)
out.raster <-
projectRaster(
from=in.raster, to=template.raster, method='bilinear', crs=out.crs,
overwrite=TRUE, progress='window', format='CDF',
# args from writeRaster
NAflag=-999.0, # match emi_n2o:missing_value,_FillValue (TODO: copy)
varname=data.var.name,
varunit='ton N2O-N/yr',
longname='N2O emissions',
xname='COL',
yname='ROW',
filename=out.fp)
out.raster
# made with CRS
#> class : RasterLayer
#> dimensions : 299, 459, 137241 (nrow, ncol, ncell)
#> resolution : 53369.55, 56883.69 (x, y)
#> extent : -14802449, 9694173, -6258782, 10749443 (xmin, xmax, ymin, ymax)
# ??? why still proj=longlat ???
#> coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0
#> data source : /home/rtd/code/R/GEIA_to_netCDF/GEIA_N2O_oceanic_regrid.nc
#> names : N2O.emissions
#> zvar : emi_n2o
但是,如前所述,regridout.raster
输出out.raster
(
我还尝试通过两种方式限制情节本身:
首先,我尝试extents
在情节中添加一个,即
plot(out.raster, ext=template.raster)
plot(map.us.proj, add=TRUE)
生成PDF的 page=2/4 。不幸的是,这根本不会改变输出:AFAICS,它与 page=1/4(上图)完全相同。
其次,在绘制之前,我尝试使用raster::crop
绑定重新网格化的 netCDF 本身,使用与绑定重新网格相同的RasterLayer
对象 ( template.raster
):
template.raster.extent <- extent(template.raster)
out.raster.crop <-
# overwrite the uncropped file
crop(out.raster, template.raster.extent, filename=out.fp, overwrite=TRUE)
...
plot(out.raster.crop)
plot(map.us.proj, add=TRUE)
生成PDF的 page=3/4 。不幸的是,它显然也与 page=1/4(上图)完全相同。
(如果您想知道,PDF 的第 4 页是使用 生成的fields::image.plot
,它有一个不同的问题,在此处描述,除非 StackOverflow 破坏了该链接。)
感谢您对这个 R 新手的帮助!