【发布时间】:2017-01-21 08:22:03
【问题描述】:
我需要将不规则网格(朗伯圆锥形)上的数据重新网格化为规则网格。我认为 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
所以现在如果我将它们绘制出来,它们看起来不错:
然后我创建一组新的常规坐标:
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 文档有点薄,我需要更多帮助。
我确实发现 this answer 建议使用另一个 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