当前位置: 首页 > 知识库问答 >
问题:

从不规则间距x和y的ncdf创建光栅砖

穆嘉
2023-03-14

我是将R用于GIS目的的新手。我有一个netcdf文件,其中包含多个具有多个维度(x、y、z、value和time)的变量。我正在尝试将其变成光栅砖。数据相当大,因此我需要从指定的时间窗口和z(深度)中提取数据。这不是问题,并使用下面的代码提取具有适当维度的数组。

library(ncdf4)
library(raster)
t <- ncvar_get(nc, "model_time")
t1<-ncvar_get(nc,"model_time_step")
tIdx<-t[t> 20120512 & t < 20120728]
tIdx2<-which(t> 20120512 & t < 20120728)
# Depths profiles < 6 meters
dIdx<-which(nc$dim$depthu$vals <6)
# ncdf dimension lengths
T3      <- nc$var[[7]]
varsize <- T3$varsize
# Define the data (depths,time,etc.) you wish to extract from the ncdf
start <- c(x = 1, y= 1,depthu=1, time_counter = min(tIdx2))
count <- c(x = max(varsize[1]), y = max(varsize[2]),depthu=1, time_counter = 
max(tIdx2)-min(tIdx2)+1)
# order of the dimensions
dim.order <- sapply(nc$var$votemper$dim, function(x) x$name)
temp<-ncvar_get(nc,"votemper",start=start[dim.order],count=count[dim.order])
nc$var$votemper

我的数据示例(删除深度/z和时间维度)

   temp<-structure(c(0,0,0,0,0,0,0,15.7088003158569,15.3642873764038,14.9720048904419,,15.9209365844727,14.9940872192383,15.0184164047241,15.0260219573975, 0,15.7754755020142, 15.424690246582, 15.6697931289673,15.6437339782715, 0,15.6151847839355, 15.5979156494141, 15.6487197875977,15.432520866394), .Dim = c(x = 5L, y = 5L))

从ncdf中提取的纬度和经度是不规则间隔的,每个都有两个维度(即每个单元的lat和lon间隔不规则)

lon<-structure(c(-71.2870483398438,-71.2038040161133,-71.1205596923828,-71.0373153686523, -70.9540710449219, -71.2887954711914, -71.2055587768555,-71.122314453125, -71.0390701293945,-70.9558258056641,-71.2905654907227,-71.2073211669922,-71.1240844726562,-71.0408401489258,-70.9576034545898,-71.292350769043,-71.209114074707, -71.1258773803711, -71.0426330566406,-70.9593963623047, -71.2941513061523, -71.2109222412109, -71.127685546875,-71.0444488525391, -70.9612045288086), .Dim = c(5L, 5L))

lat<-structure(c(38.5276718139648, 38.529125213623, 38.5305824279785,38.532039642334, 38.5334968566895, 38.5886116027832, 38.5900802612305,38.591552734375, 38.5930252075195, 38.5944976806641, 38.6494789123535,38.6509628295898, 38.6524467468262, 38.6539344787598, 38.6554222106934,38.7102699279785, 38.7117652893066, 38.713264465332, 38.7147674560547,38.7162704467773, 38.7709808349609, 38.7724952697754, 38.7740097045898,38.7755241394043, 38.777042388916), .Dim = c(5L, 5L))

通常,我会使用

Temp_brick <- brick(temp, xmn=min(lat), xmx=max(lat), ymn=min(lon), ymx=max(lon),transpose=T)
Temp_brick<-t(flip(Temp_brick,1))

这,然而并不能说明不规则的行间距和光栅单元格值位于错误的位置(lon, lat).我已经搜索了整个堆栈溢出和其他gis帮助源,我找不到类似的问题与解决方案或我没有问正确的问题.我不是特别确定如何去做这件事.不确定是否应该在从netcdf提取数据时处理这件事或者是否应该在光栅砖已经创建后处理没有定义的范围.我已经试图找到一种方法来定义光栅的lon lats没有任何运气。尝试将lon,lat和value转换为3列数据帧,然后使用光栅::rasterFromXYZ函数。这对于我正在处理的数据大小来说不够快,实际上是197(x)*234(y)*2(z)*900(时间)*5(变量)*12(年(单独的netcdf文件)。

非常感谢您的帮助

共有1个答案

耿俊
2023-03-14

一个带有akima的选项,首先将数据插入常规网格,然后将其转换为栅格:

    # define the regular lon lat or just pass the nx, ny param to interp functions
    lonlat_reg <- expand.grid(lon = seq(min(lon), max(lon), length.out = 5), 
        lat = seq(min(lat), max(lat), length.out = 5))

    # interp irregular data to a regular grid
    # both solution return the same results because 
    # i've define the regular grid as akima default
    test <- interp(x = as.vector(lon), y = as.vector(lat), z = as.vector(temp), 
        xo = unique(lonlat_reg[,"lon"]), yo = unique(lonlat_reg[,"lat"]), 
        duplicate = "error", linear = FALSE, extrap = FALSE)

    test <- interp(x = as.vector(lon), y = as.vector(lat), z = as.vector(temp), 
        nx = 5, ny = 5, linear = FALSE, extrap = FALSE)

    # turn into a raster
    test_ras <- raster(test)

检查函数的参数以选择执行的插值等,如果使用外推,请小心!

我也见过这种方法

干杯

 类似资料:
  • 这个问题与Java表达式中子表达式的求值顺序不同,因为在这里肯定不是“子表达式”。需要加载它进行比较,而不是“求值”。这个问题是特定于Java的,表达式来自一个真实的项目,而不是通常为棘手的面试问题而设计的牵强附会的不切实际的构造。它应该是比较和替换习语的一行替换 它比x86 CMPXCHG指令还要简单,因此在Java中应该使用更短的表达式。

  • 我有几个目录,里面都是每日的气候数据。我需要将每日栅格合并为每周栅格,一些是通过值的总和,一些是通过值的平均值。到目前为止,我已经在目录(其中包含每日光栅文件)中创建了一个文件名向量,并为编写了一个

  • 我把我的问题简化了一点,希望它有意义。 我有三个栅格,我正在使用。 栅格是一个栅格,其土地覆盖属性值1为本地土地覆盖,0为非本地土地覆盖。 本地蒸散量和非本地蒸散量分别是本地物种和非本地物种的蒸散量。两个光栅的属性都在[015000]之间 id要做的是将1的所有值替换为nativeet值,将0的所有值替换为nonnativeet值。 我的想法是将土地覆盖光栅(值为1或0)转换为AET光栅(值介于0

  • 我画了一个正方形,它的宽度和长度是20x,或者20y,然后我在正方形里面画了一个圆,它的半径是10x。现在,一条来自圆心的射线以45度角穿过圆圈的边界(可以是38度或其他任何角度)。现在我如何从正方形中得到射线与圆的连接地的x&y距离? 我试过以下代码: 我没有用这段代码得到确切的距离,用什么方法得到x&y距离?

  • 问题内容: 考虑以下示例: 我不确定Java语言规范中是否有一项规定要加载变量的先前值以便与右侧()进行比较,该变量应按照方括号内的顺序进行计算。 为什么第一个表达式求值,而第二个表达式求值?我本来希望先被评估,然后再与自身()比较并返回。 这个问题与Java表达式中子表达式的求值顺序不同,因为这里绝对不是“子表达式”。需要 加载 它以进行比较,而不是对其进行“评估”。这个问题是特定于Java的,

  • 本文向大家介绍winform创建不规则窗体的方法,包括了winform创建不规则窗体的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了winform创建不规则窗体的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的C#程序设计有所帮助。