了解pyresample以将不规则网格数据重新划分为常规网格

时间:2016-09-13 16:37:01

标签: python netcdf netcdf4

我需要将不规则网格(lambert圆锥形)上的数据重新划分为常规网格。我认为pyresample是我最好的选择。事实上我的原始lat,lon不是1D(使用basemap.interp或scipy.interpolate.griddata似乎需要它。)

我发现this SO's answer很有帮助。但是我得到空插值数据。我认为这与我的影响半径的选择以及我的数据被包装(??)的事实有关。

这是我的代码:

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)

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

来自pyresample.geometry的

导入SwathDefinition 来自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)

数据的分辨率大约是30km,所以我把70km,我放的fill_value是数据中的一个,但当然我可以把零或者纳。

然而我得到一个空数组。

我做错了什么?另外 - 如果有另一种方式,我有兴趣了解它。 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 个答案:

答案 0 :(得分:3)

问题是XI和XI是整数,而不是浮点数。您只需执行

即可解决此问题
XI = np.arange(148,360.)
YI = np.arange(0,87.)
XI, YI = np.meshgrid(XI,YI)

无法处理整数数据类型是pyresample中未记录的,不直观且可能有错误的行为。

关于编码风格的一些注释:

  • 没有必要覆盖XI和YI变量,你不会因此获得太多收益
  • 您应该只加载一次netCDF数据集并通过该对象访问变量