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

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

燕涵容
2023-03-14

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

下面是我的netCDF文件的摘要。它有两个维度(纬度和经度)和一个变量(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˚,长:352˚,右上角:纬:44.5˚

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

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

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

共有3个答案

丁均
2023-03-14

如果您使用的是 Linux,则可以使用 nctoolkit (https://nctoolkit.readthedocs.io/en/latest/) 轻松实现:

import nctoolkit as nc
data = nc.open_data("example.nc")    
data.subset(lon = [-12, -5], lat = [35.4, 44.5])
谢正初
2023-03-14

您还可以使用 CDO 先从 bash 命令行中提取区域,然后在 R 中读取文件:

cdo sellonlatbox,-5,12,34.5,44.5 in.nc out.nc 

我在上面的讨论中注意到有一个关于纬度顺序的问题。您也可以使用数位长命令“invertlat”来为您解决这个问题。

袁恩
2023-03-14

原则上,你已经完成了三分之二的路程。当然,您可以使用如下方式创建起始索引:

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或使用哪个创建索引并在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)

备注:我更喜欢< code>ncdf4,我发现它的语法更容易记忆(还有一个比旧的netcdf R-package更好的优点,我已经忘记了...)

好的,评论不能像我需要的那么长,所以我更新了答案不用担心。让我们一步一步地浏览这些问题。

>

  • 哪种功能方式将起作用。我自己使用它。
  • 数据将采用与 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]
    

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

    cbind( rep(lat, each=length(lon)), rep(lon,length(lat)), c(myVariable) )
    

    坐标当然与netcdf文件中的坐标相同。。。

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

  •  类似资料:
    • 问题内容: 在Python中使用GDAL,如何获取GeoTIFF文件的纬度和经度? GeoTIFF似乎没有存储任何坐标信息。而是存储XY原点坐标。但是,XY坐标不提供左上角和左下角的纬度和经度。 看来我需要做一些数学运算才能解决这个问题,但是我不知道从哪里开始。 执行此操作需要什么程序? 我知道该方法对此很重要,但是,我不知道该怎么做。 问题答案: 要获取您的Geotiff角的坐标,请执行以下操作

    • 我正在下载netcdf格式的气候数据。对于每个变量(例如“降水量”),我需要合并9个netcdf,每个都属于一个独特的气候模型。每个netcdf具有相同的大小(time、lat、lon)。如何将9个3D netcdf合并为一个4D netcdf?最后,我想计算每月的累积降水量。这是我的当前代码: 上面的代码有效,但我正在创建一个大的3D netcdf,而不是一个仍然包含气候模型名称的4D。以下代码

    • 问题内容: 我想使用Swift获取位置的当前经度和纬度,并通过标签显示它们。我尝试执行此操作,但标签上没有任何显示。 问题答案: 恕我直言,当您寻找的解决方案非常简单时,您就使代码复杂化了。 我已经通过使用以下代码来做到这一点: 首先创建和请求授权的实例 然后检查用户是否允许授权。 用它来做到这一点 您将它们设置为的想法是正确的,但是我能想到的唯一原因是用户未给予您许可,这就是为什么您当前的位置数

    • 我有一个onCreate的活动,它计算您的位置和附近的事件之间的距离,我使用lastNotnloceto获取当前设备位置并在谷歌地图上标记它,但我需要它来写经度和纬度它的方法之外用于计算距离。 我已经使用LocationManager来获取粗略的坐标,但这些坐标不够准确,对于距离不到半英里的东西来说,距离为50英里。我目前拥有它,因此将覆盖从LocationManager获得的经度和纬度,但它没有

    • 问题内容: 如何使用定位工具获取android中移动设备的当前纬度和经度? 问题答案: 使用。 对的调用不会阻塞-这意味着null如果当前没有可用的位置,它将返回-因此,你可能希望查看将传递给该方法,这将为你提供位置的异步更新。 如果要使用GPS,则需要向你的应用程序授予权限。 你可能还想添加GPS不可用时的权限,然后使用方法选择位置提供商。

    • 问题内容: 我有一个类型为(com.vividsolutions.jts.geom.Geometry)的几何对象。它目前是经度,纬度形式,我想翻转坐标,使其经度为纬度,这样我就可以将其以GeoJSON格式用于mongodb。 我看到的约束是:a)我想翻转坐标的输入是Geometry对象。b)几何对象将是多边形类型或多多边形。c)我想在将类型强制转换为Polygon / multipolygon之前