Regrid 3D Cartesian到极地NetCDF数据与Python

时间:2017-01-17 23:10:44

标签: python numpy scipy netcdf

我有一个NetCDF变量,其大小为时间x,y。它目前处于笛卡尔坐标,但我需要极坐标中的数据。我已经尝试创建一个函数来做到这一点,但我似乎无法做到正确。有谁知道是否有更简单的方法可以做到这一点?

def regrid(x,y,xcent,ycent,vardat):
    x=np.subtract(x,xcent)
    y=np.subtract(y,ycent)
    threshmin = np.min(vardat)
    threshmax = np.max(vardat)
    rmax = np.ceil(np.sqrt(((x[-1]-x[0])/2.)**2 + ((y[-1]-y[0])/2.)**2))
    r = np.arange(0,rmax,(x[1]-x[0]))
    theta_inc = np.floor(np.arctan2(y[1]-y[0],(x[-1]-x[0])/2.)/np.pi*180.)
    if theta_inc <1.0:
        theta_inc = 1
    theta = np.arange(0,(360-theta_inc),theta_inc)
    r2d, theta2d = np.meshgrid(r,theta)
    x_polar = r2d*np.cos(np.pi/180.*theta2d)
    y_polar = r2d*np.sin(np.pi/180.*theta2d)
    x_range = np.arange(x[0],x[-1]+1,(x[1]-x[0]))
    y_range = np.arange(y[0],y[-1]+1,(y[1]-y[0]))
    field_rt = np.zeros((len(r),len(theta)))


    field_interp = interp2d(x_range,y_range,vardat,kind='linear')
    for i in np.arange(0,len(r)):
        for j in np.arange(0,len(theta)):

    *       field_rt[i,j] = field_interp(x_polar[i,j],y_polar[i,j])

    return r, theta, field_rt

r1,theta1, field = regrid(we_ea,no_so,124,124,olr[0,:,:])

此刻,我收到一条错误说&#34;索引176超出了轴1的大小为176&#34;在*。

的行

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

这是一种(未优化的)最近邻居方法,用于将数据从常规笛卡尔网格重新映射到常规极坐标网格。坐标间距BarChartdr应根据您的需要进行调整。您也可以搜索N个最近邻居并应用一些统计度量,例如:距离加权平均值左右。对于大型数据集,我建议使用a line chart with three red limit lines labelled max, average, and min来加速最近邻搜索。对于重新映射地理空间数据,有一个很好的快速包,名为pykdtree

dphi

pyresample enter image description here