【问题标题】:How to use a binary netcdf mask in python?如何在 python 中使用二进制 netcdf 掩码?
【发布时间】:2021-09-15 11:36:25
【问题描述】:

我对使用 cartopy 包还很陌生。我想使用来自 netcdf 格式的给定二进制地图的陆海掩码。这里 lsm_set 是我的 netcdf 文件,其中包含该二进制映射,而 t2m_set 是我想要映射的数据。我还在玩一些 cartopy 来掌握它,但我似乎无法弄清楚如何使用陆海面具。我在这里阅读了几个相关问题,但它们不适用于我的代码,因为我的 t2m 变量没有属性掩码。

我的老师说我可以用它来将海值标记为“NaN”,但我不知道一种有效的方法。我尝试了一个 while 循环,但是当你处理这么多数据时,速度非常慢:')

我使用了在以下链接上从哥白尼研究所找到的数据:https://cds.climate.copernicus.eu/cdsapp#!/dataset/reanalysis-uerra-europe-single-levels?tab=form

import os
import numpy as np
import matplotlib.pyplot as plt
import netCDF4 as nc
from netCDF4 import Dataset
import xarray as xr
from cartopy import config
import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader


filepath1 = '... file path... '
lsm_set = xr.open_dataset(filepath1)

filepath2 = '... file path...'
t2m_set= xr.open_dataset(filepath2) 

lons = lsm_set.variables['longitude']#[:]
lats = lsm_set.variables['latitude']#[:]
lsm = lsm_set.variables['lsm']
t2m = t2m_set.variables['t2m']

plt.figure(figsize=(8, 8))
ax = plt.axes(projection = ccrs.Mercator())
ax.contourf(lons[200:400,100:300], lats[100:300,200:400], t2m[100:300,100:300],transform=ccrs.Mercator())
lsm_set.close()
t2m_set.close()
plt.show()

感谢您向正确方向轻推,谢谢!


解决了!

事实证明解决方案比我想象的要容易得多。

lons = t2m_set.variables['longitude']#[:]
lats = t2m_set.variables['latitude']#[:]
lsm = lsm_set.variables['lsm']
t2m = t2m_set.variables['t2m'] 
lsm_masked = lsm.where(lsm!=0.)
mapdata = t2m+lsm_masked

并且比绘制 mapdata 而不仅仅是 t2m

【问题讨论】:

    标签: python mask cartopy


    【解决方案1】:

    您可以使用xarraywhere 方法:

    t2m_set.where(lsm_set)
    

    它应该给你一个很好的掩码xarray.Dataset

    【讨论】:

      【解决方案2】:

      让我假设您的陆地/海洋数据为 1 和 0,并且与您的数据大小相同...然后您可以轻松地制作这样的图:

      #!/usr/bin/env ipython
      # --------------------
      import matplotlib as mpl
      mpl.rcParams['font.size'] = 18
      import matplotlib.pylab as plt
      import numpy as np
      # -----------------------------
      xx = np.linspace(9.,30,100);
      yy = np.linspace(54.0,66.0,100);
      xm,ym = np.meshgrid(xx,yy);
      zz = 50.0 + 10.0*np.random.random((np.size(yy),np.size(xx)));
      # -----------------------------
      # let me have some random landmask/seamask data:
      smask = np.zeros(np.shape(zz));smask[0:10,0:10]=1.0;smask[60:90,60:90]=1.0;
      # -----------------------------
      # let us set 0.0 to NaNs in seamask:
      smask[smask==0]=np.nan;
      smask=np.ma.array(smask,mask=np.isnan(smask))
      # -----------------------------
      # let us make a plot:
      fig = plt.figure();ax=fig.add_subplot(111);
      ax.pcolormesh(xx,yy,zz);
      ax.pcolormesh(xx,yy,smask,vmin=0.0,vmax=8.0,cmap='Greys');
      plt.show()
      # ------------------------------------------------------------
      

      【讨论】:

        猜你喜欢
        • 2020-04-13
        • 2018-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-19
        • 1970-01-01
        • 2017-05-26
        相关资源
        最近更新 更多