gpt4 book ai didi

r - 如何使用 R 中的纬度/经度边界从 netCDF 文件中获取子集

转载 作者:行者123 更新时间:2023-12-02 10:29:30 28 4
gpt4 key购买 nike

我有一个 netCDF 文件,我希望使用 R 中的“ncdf”包从由纬度/经度边界(即纬度/经度定义的框)定义的子集中提取子集。

下面是我的 netCDF 文件的摘要。它有两个维度(纬度和经度)和 1 个变量 (10U_GDS4_SFC)。它本质上是一个包含风值的纬度/经度网格:

[1] "file example.nc has 2 dimensions:"
[1] "lat_0 Size: 1280"
[1] "lon_1 Size: 2560"
[1] "------------------------"
[1] "file example.nc has 1 variables:"
[1] "float 10U_GDS4_SFC[lon_1,lat_0] Longname:10 metre U wind component Missval:1e+30"

纬度变量的范围是 +90 到 -90,经度变量的范围是 0 到 360。

我希望使用以下地理角边界提取整个网格的子集:

左下角:纬度:34.5°,经度:355°,左上角:纬度:44.5°,经度:355°,右上角:纬度:44.5°,经度:12°,右下角:纬度:34.5°,长:12°

我知道可以使用 get.var.ncdf() 命令提取变量的部分内容(示例如下):

z1 = get.var.ncdf(example.nc, "10U_GDS4_SFC", start=c(11,26), count=c(5,5))

但是,我无法弄清楚如何合并纬度/经度,以便最终得到包含变量值的子集空间网格。我是 R 中使用 netCDF 值的新手,任何建议将不胜感激。非常感谢!

最佳答案

原则上你已经完成了 2/3。您当然可以使用如下方式创建起始索引:

require(ncdf4)

ncFile <- nc_open( MyNetCDF )
LonStartIdx <- which( ncFile$dim$lon$vals == 355)
LatStartIdx <- which( ncFile$dim$lat$vals == 34.5)

对计数执行相同的操作。然后,读取你想要的变量

MyVariable <- ncvar_get( ncFile, varName, start=c( LonStartIdx, LatStartIdx), count=...)

但是就你的情况而言,据我所知,你运气不好。读/写 netcdf 例程按顺序执行其操作。您的网格会环绕,因为您的坐标经度为 0 - 360,并且您对包含零子午线的框感兴趣。

对于您来说(假设您没有太多数据),将整个网格读入 R 中,然后使用 subset 会更有意义。或使用 which 创建索引然后在 R 中剪出你的“盒子”。

ncFile <- nc_open( MyNetCDF )
LonIdx <- which( ncFile$dim$lon$vals > 355 | ncFile$dim$lon$vals < 10)
LatIdx <- which( ncFile$dim$lat$vals > 34.5 & ncFile$dim$lat$vals < 44.5)
MyVariable <- ncvar_get( ncFile, varName)[ LonIdx, LatIdx]
nc_close(ncFile)

备注:我更喜欢ncdf4 ,我发现语法更容易记住(而且与我已经忘记的旧 netcdf R 包相比,还有另一个优点......)

好的。评论不能像我需要的那样长,所以我更新了答案不用担心。让我们逐步解决问题。

  • which函数方式将起作用。我自己用的。
  • 数据的格式与 netcf 文件中的格式类似,但我不太确定 0 子午线是否存在问题(我猜是的)。您可能必须通过执行类似的操作来交换两半(替换第二个示例中的相应行)

    LonIdx <- c(which( ncFile$dim$lon$vals > 355) , which( ncFile$dim$lon$vals < 10) )

    这会更改坐标索引的顺序,使西部部分先出现,然后东部部分出现。

  • 可以将所有内容重新格式化为 2x3 数据框。获取我的第二个代码示例返回的数据(将是一个矩阵,[lon x lat]。还可以从中获取坐标值

    lon <- ncFile$dim$lon$val[LonIdx]

    (或者在您的示例中如何调用经度,与 lat 相同)。然后使用组装矩阵

    cbind( rep(lat, each=length(lon)), rep(lon,length(lat)), c(myVariable) )
  • 坐标当然与 netcdf 文件中的相同......

你需要检查最后的 cbind,因为我只有大约 98% 的信心我没有弄乱坐标。在我在桌面上找到的 R 脚本中,我使用循环,这是……邪恶的……这应该(有点?)更快,也更明智。

关于r - 如何使用 R 中的纬度/经度边界从 netCDF 文件中获取子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21280104/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com