将数据从一个经纬度网格插值到另一个网格?

3

我有两个数据数组,它们都是基于纬度和经度的网格。第一个数组A的形状为(89, 180),第二个数组B的形状为(94, 192)。A的纬度从88到-88降序排列,经度从0到358升序排列。B的纬度从88.54199982到-88.54199982降序排列,经度从0到358.125升序排列。

我想将B的数据重新插值到A的坐标系统中,以便使两个数组大小相同并计算它们之间的空间相关性。(如果更容易的话,我也可以将A的数据重新插值到B的坐标系统中。)我尝试了mpl_toolkits.basemap.interp(datain, xin, yin, xout, yout),但这需要xout和yout具有相同的大小。我还尝试了scipy.interpolate.griddata,但我不知道它是如何工作的,而且我甚至不确定它是否能得到我想要的结果...


如何使用简单的线性插值?分别对x坐标和y坐标进行插值,这样就可以工作了。基本上通过网格差异来缩放任何坐标。例如,x_new = x_old *(B_width / A_width)。例如,如果B_width是A_width的2倍,则x_new = x_old * 2。显然,如果B_width = A_width,则没有缩放,因为它们的大小完全相同。 - AbstractDissonance
现在,一旦你有了中间值(因为它可能不是整数),你需要创建一个“混合”数据点的数据以获得新的数据值。实际上,最好反向操作。例如,对于B中的每个点(i,j),数据值为B [i,j]。要获取此值,我们需要在A中查找它。但是我们必须将我们的i,j“缩放”到A上,这些点不会是整数点,因此我们不能直接使用它们来访问数组。我们可以简单地四舍五入/向下取整/向上取整,或使用加权和或其他方法(立方差值)在A周围的值之间插值。 - AbstractDissonance
抱歉,我不太理解你的第二条评论... 你能用代码回答吗? - Cebbie
B[i,j] = A[floor(iA_width/B_width), floor(jA_height/B_height)] 是一个简单的映射。但是它不准确,因为一些点可能会落在A中的“网格点”之间,但我们总是将这些点夹在网格点上(例如,如果i = 3.9,我们使用i = 3,这可能无法很好地表示该值。四舍五入可能是最好的选择,但在3(0.1)和4(0.9)之间进行线性插值可能更好。因此,根据您的需求,加权方法更好。 - AbstractDissonance
2个回答

2
您可能需要查看 pyresample 来解决此类地理插值问题以及其他类似的问题。该工具提供了多种插值方法,能够很好地处理经纬度数据,并且支持 basemap。我推荐使用这个工具包,因为您可以创建 AreaDefinition 对象,使用 Proj4 定义来定义域,然后将数据注册到该 AreaDefinition
针对您的特定问题,我建议执行以下步骤(注意,插值步骤尚未完成,请参见下文):
from pyresample.geometry import SwathDefinition
from pyresample.kd_tree import resample_nearest

def interp_b_to_a(a, b):
    '''Take in two dictionaries of arrays and interpolate the second to the first.
    The dictionaries must contain the following keys: "data", "lats", "lons"
    whose values must be numpy arrays.
    '''
    def_a = SwathDefinition(lons=a['lons'], lats=a['lats'])
    def_b = SwathDefinition(lons=b['lons'], lats=b['lats'])

    interp_dat = resample_nearest(def_b, b['data'], def_a, ...)
    new_b = {'data':interp_dat,
             'lats':copy(a['lats']),
             'lons':copy(a['lons'])
            }
    return new_b

请注意,调用resample_nearest的插值步骤尚未完成。您还需要指定radius_of_influence,它是以米为单位的每个点周围要使用的搜索半径。这取决于您数据的分辨率。您可能还希望指定nprocs以加快速度,并且如果使用掩码数据,则需指定fill_value

def_a和def_b的定义是否相同? - Cebbie
不,def_a将是您想要插值的目标经纬度。def_b将是您想要从中进行插值的经纬度。现在正在编辑答案。 - Vorticity
1
我开始测试它,但不知道在...部分添加什么。最终,我没有使用此页面上的任何解决方案,因为我意识到我不需要将纬度-经度网格相互插值来解决我正在尝试解决的问题。不过还是感谢你的回答。 - Cebbie
只是提供一下信息,上一段讨论过的关键词是大小写特定的,所以如果将来需要,只需查看pyresample的文档并查看额外的关键词即可。 - Vorticity

0

根据 @Vorticity 的建议,我进行了编辑并解决了问题:

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

def interp_b_to_a(a, b):
    def_a = SwathDefinition(lons=a['lons'], lats=a['lats'])
    def_b = SwathDefinition(lons=b['lons'], lats=b['lats'])

    interp_dat = resample_nearest(def_a, a['data'], def_b,radius_of_influence = 5000)
    new_b = {'data':interp_dat,
             'lats':b['lats'],
             'lons':b['lons']
            }
    return new_b

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