1

我已经使用 grads 中的basemap.gs脚本屏蔽了 NetCDF 文件。这是我使用面具得到的结果:

例子

所以,我想获得一个只包含大陆数据的 NetCDF 文件,有人可以帮我吗?

4

2 回答 2

3

如果我正确理解了这个问题,那么希望有一个 netcdf 文件,其中所有值都设置为在海点上缺失(即 _Fillvalue)。如果是这样,命令行有两种解决方案:

解决方案 1:

一种方法是使用 CDO 创建海陆掩码,然后将所有海点设置为缺失:

cdo -f nc2 setctomiss,0 -gtc,0 -remapcon,your_data_.nc -topo seamask.nc
  • 其中remapcon将地形重新映射到数据文件的域和分辨率。
  • 当内置地形高于海平面时,gtc 产生 1。
  • 然后 setctomiss 将所有“零”点设置为缺失。

您现在可以使用它来屏蔽您的数据文件:

cdo mul datafile.nc seamask.nc masked_datafile.nc

但是,在某些情况下,我发现重新映射过程会在边缘留下“海洋”数据的痕迹,在这种情况下,为了更安全,您可以使用第二种方法:

解决方案 2

从这个 thredds 服务器以 1 公里的分辨率下载“到海洋的距离”的 netcdf 数据文件:https ://pae-paha.pacioos.hawaii.edu/thredds/ncss/dist2coast_1deg_land/dataset.html

然后,您可以屏蔽海洋一定距离内的任何点以确保安全,但可能会屏蔽少量陆地数据。

我首先将距离文件重新映射到目标分辨率:

cdo remapbil,your_data.nc distance.nc remap_dist.nc

然后掩码(例如,在这种情况下,海岸 5 公里范围内的所有点,海点在此文件中已经“缺失”)并相乘

cdo mul your_data.nc -gtc,5 remap_dist.nc masked_data.nc

如前所述,这更安全,更冗长,但可能会掩盖一些土地数据。

编辑 2021:我刚刚上传了有关此主题的 youtube 视频指南,以提供更多详细信息。

于 2017-08-17T08:23:17.693 回答
1

由于您已经屏蔽了非大陆值,因此该过程实际上相当简单。有一个名为“sdfwrite”的命令可以将grads中定义的变量写入文件。代码会是这样的:

define data = <insert expression for masked out data here>
set sdfwrite out.nc
sdfwrite data

*确保删除尖括号;那些只是为了展示

将这些输入到 grads 将 1)分配内存以将显示的数据保存在变量“data”中 2)将输出文件的名称设置为“out.nc”(您当然可以将其更改为您喜欢的任何内容),以及 3 ) 将变量“data”中的信息写入 out.nc 文件。

现在据我所知,没有办法简单地将屏蔽的值不写入文件,但是这样,它们都将被写入为零/未定义的值。

sdfwrite 文档

希望这可以帮助!!

于 2017-07-28T05:33:17.207 回答