理解pyresample将不规则网格数据重新网格化为规则网格

问题描述 投票:0回答:1

我需要将不规则网格(兰伯特圆锥形)上的数据重新网格化为规则网格。我认为 Pyresample 是我最好的选择。事实上我原来的纬度,经度不是一维的(这似乎需要使用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

所以现在如果我把它们画出来,它们看起来就很好看:

然后我创建一组新的常规坐标:

XI = np.arange(148,360)
YI = np.arange(0,87)
XI, YI = np.meshgrid(XI,YI)

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

从pyresample.geometry导入SwathDefinition 从pyresample.kd_tree导入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)

数据的分辨率约为30km,所以我输入70km,我输入的fill_value是数据中的值,但当然我可以只输入0或nan。

但是我得到一个空数组。

我做错了什么?另外 - 如果还有另一种方法可以做到这一点,我有兴趣了解它。 Pyresample 文档有点薄,我需要更多帮助。

我确实找到了这个答案建议使用另一个griddata函数:

import matplotlib.mlab as ml
resampled_data = ml.griddata(lon_n.ravel(), lat_n.ravel(),SRHtemp.ravel(),XI,YI,interp = "linear")

看起来还可以:

但是我想了解更多关于pyresample,因为它看起来很强大。

python netcdf netcdf4 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 数据集,然后通过该对象访问变量
© www.soinside.com 2019 - 2024. All rights reserved.