理解PyResample如何将非规则网格数据重新网格化为规则网格

3
我需要将不规则网格(兰伯特圆锥)的数据重新网格化到规则网格上。我认为pyresample是最好的选择。实际上,我的原始纬度和经度不是1D(似乎需要使用basemap.interp或scipy.interpolate.griddata)。
我发现这个SO的答案很有帮助。然而,我得到了空的插值数据。我认为这与我的影响半径的选择以及我的数据被包裹(??)有关。
这是我的代码:
import numpy as np
from matplotlib import pyplot as plt
import netCDF4
%matplotlib inline
url = "http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/NARR/Dailies/monolevel/hlcy.2009.nc"
SRHtemp = netCDF4.Dataset(url).variables['hlcy'][0,::]
Y_n     = netCDF4.Dataset(url).variables['y'][:]
X_n     = netCDF4.Dataset(url).variables['x'][:]
T_n     = netCDF4.Dataset(url).variables['time'][:]

lat_n     = netCDF4.Dataset(url).variables['lat'][:]
lon_n     = netCDF4.Dataset(url).variables['lon'][:]

lat_n和lon_n是不规则的,它们对应于投影坐标x,y的纬度和经度。

由于lon_n的特殊性质,我添加了:

lon_n[lon_n<0] = lon_n[lon_n<0]+360

现在,如果我绘制它们,它们看起来很好:

enter image description here

然后我创建了我的新的普通坐标系:
XI = np.arange(148,360)
YI = np.arange(0,87)
XI, YI = np.meshgrid(XI,YI)

根据上面的回答,我编写了以下代码:

from pyresample.geometry import SwathDefinition from pyresample.kd_tree import resample_nearest

def_a = SwathDefinition(lons=XI, lats=YI)
def_b = SwathDefinition(lons=lon_n, lats=lat_n)
interp_dat = resample_nearest(def_b,SRHtemp,def_a,radius_of_influence = 70000,fill_value = -9.96921e+36)

数据分辨率约为30公里,因此我放置了70公里。我放置的fill_value是来自数据的,但当然我也可以只放置零或nan。
然而,我得到了一个空数组。
我做错了什么?另外 - 如果有其他方法可以做到这一点,我很想知道。Pyresample文档有点薄弱,我需要更多帮助。
我发现this answer提出使用另一个griddata函数:
import matplotlib.mlab as ml
resampled_data = ml.griddata(lon_n.ravel(), lat_n.ravel(),SRHtemp.ravel(),XI,YI,interp = "linear")

看起来没问题:

enter image description here

但我想更了解pyresample,因为它看起来非常强大。

1个回答

3
问题在于XI和XI是整数,而不是浮点数。你可以通过简单地执行以下操作来解决这个问题:
XI = np.arange(148,360.)
YI = np.arange(0,87.)
XI, YI = np.meshgrid(XI,YI)

无法处理整数数据类型是pyresample中未记录的、不直观的、可能存在缺陷的行为。

关于您的编码风格,还有以下几点需要注意:

  • 没有必要重写XI和YI变量,这样做并没有什么好处
  • 只需加载一次netCDF数据集,然后通过该对象访问变量即可

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接