我有一个全球海洋学(OmegaA)数据的NetCDF文件,其空间分辨率相对较粗,有33个深度级别。我还有一个更精细分辨率的全球测深光栅。我的目标是使用从NetCDF文件中获取海底OmegaA数据,使用测深数据确定所需的深度。我的代码到目前为止;
library(raster)
library(rgdal)
library(ncdf4)
# Aragonite data. Defaults to CRS WGS84
ncin <- nc_open("C:/..../GLODAPv2.2016b.OmegaA.nc")
ncin.depth <- ncvar_get(ncin, "Depth")# 33 depth levels
omegaA.brk <- brick("C:/.../GLODAPv2.2016b.OmegaA.nc")
omegaA.brk <-rotate(omegaA.bkr)# because netCDF is in Lon 0-360.
# depth raster. CRS WGS84
r<-raster("C:/....GEBCO.tif")
# resample the raster brick to the resolution that matches the bathymetry raster
omegaA.brk <-resample(omegaA.brk, r, method="bilinear")
# create blank final raster
omegaA.rast <- raster(ncol = r@ncols, nrow = r@nrows)
extent(omegaA.rast) <- extent(r)
omegaA.rast[] <- NA_real_
# create vector of indices of desired depth values
depth.values<-getValues(r)
depth.values.index<-which(!is.na(depth.values))
# loop to find appropriate raster brick layer, and extract the value at the desired index, and insert into blank raster
for (p in depth.values.index) {
dep.index <-which(abs(ncin.depth+depth.values[p]) == min(abs(ncin.depth+depth.values[p]))) ## this sometimes results in multiple levels being selected
brk.level <-omegaA.brk[[dep.index]] # can be more than on level if multiple layers selected above.
omegaA.rast[p] <-omegaA.brk[[1]][p] ## here I choose the first level if multiple levels have been selected above
print(paste(p, "of", length(depth.values.index))) # counter to look at progress.
}
问题:结果是一个带有大量间隙(NAs)的栅格,其中应该有数据。间隙通常具有独特的形状 - 例如,遵循轮廓或沿着长直线。我贴了一个裁剪的例子。
我认为这可能是因为1)由于某种原因,&#39;哪个&#39;循环中的语句未找到匹配项或2)创建了投影的未对齐,我使用&#39;旋转&#39;时可能会发生这种错误。
我试图确保所有范围,分辨率,单元格数和CRS都是相同的,它们似乎就是这样。
为了加快这个过程,我将全球砖和光浴光栅裁剪到我感兴趣的区域,再次检查所有空间分辨率等是否匹配 - 我为此还没有包括这些步骤。
不知所措。欢迎任何帮助!
答案 0 :(得分:0)
如果没有可重复的例子,这种问题很难解决。我不能告诉你问题在哪里,但我会告诉你我会尝试的方法。也许它很好,也许它很糟糕,我不知道,但它可能会激励你找到解决问题的方法。
根据我的理解,你有一块OmegaA(33层/深度)和一个测深光栅。您想要在海底获得OmegaA值。我将这样做:
r_1 <- r
values(r_1) <- values(r)==10 # where 10 is the depth (it could be a range with < or >)
r_2 <- r
values(r_2) <- values(r)==20
...
r_33 <- r
values(r_33) <- values(r)==250
r_brick <- brick(r_1, r_2, ..., r_33)
这应该有效。如果处理栅格砖有问题,可以将数据转换为基本R阵列,它可以更简单。
祝你好运。