根据R中的另一个栅格查询栅格砖图层

时间:2018-01-04 11:52:26

标签: r raster netcdf4

我有一个全球海洋学(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)的栅格,其中应该有数据。间隙通常具有独特的形状 - 例如,遵循轮廓或沿着长直线。我贴了一个裁剪的例子。

enter image description here

我认为这可能是因为1)由于某种原因,&#39;哪个&#39;循环中的语句未找到匹配项或2)创建了投影的未对齐,我使用&#39;旋转&#39;时可能会发生这种错误。

我试图确保所有范围,分辨率,单元格数和CRS都是相同的,它们似乎就是这样。

为了加快这个过程,我将全球砖和光浴光栅裁剪到我感兴趣的区域,再次检查所有空间分辨率等是否匹配 - 我为此还没有包括这些步骤。

不知所措。欢迎任何帮助!

1 个答案:

答案 0 :(得分:0)

如果没有可重复的例子,这种问题很难解决。我不能告诉你问题在哪里,但我会告诉你我会尝试的方法。也许它很好,也许它很糟糕,我不知道,但它可能会激励你找到解决问题的方法。

根据我的理解,你有一块OmegaA(33层/深度)和一个测深光栅。您想要在海底获得OmegaA值。我将这样做:

  1. 使OmegaA光栅达到与水深测量相同的分辨率和程度
  2. 将水深测量光栅变成33层三层0-1的光栅砖。例如如果海底对于一个特定像素是200m,那么除了200之外的所有深度层上的这个像素都是0而对于200而言是1。对于编程这个,我会走很远的路,比如
  3. 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)
    
    1. 然后你多个你的栅格砖。它们具有相同的尺寸,应该很容易。输出应该是一个33层的光栅砖,到处都是0,它不是海底,而是其他地方的OmegaA值。
    2. 将之前获得的砖块的所有图层合并为一个带总和的简单栅格。
    3. 这应该有效。如果处理栅格砖有问题,可以将数据转换为基本R阵列,它可以更简单。

      祝你好运。