如何使用python对常规纬度数据进行面积加权网格化



我希望能够在python中对规则间隔的2D经纬度数据进行面积加权重新网格化,例如从0.5x0.5网格到2.5x3.75网格。这个数据是以kg/m^2/s为单位的排放量,所以我需要守恒质量和空间分布。

我知道有许多 scipy 插值例程,我不确定在这种情况下使用哪个(如果有的话(是最好的。如果可能的话,我宁愿不必安装太多额外的 python 包,除非绝对需要(即我安装了 scipy+numpy,但宁愿不必安装专业的 python 包,它将做我需要的,也要求我将数据存储在特定类结构等。但是,如果需要,我会这样做!

对我来说,这也是一个学习练习,让我了解如何在 python 中做这些事情,以及能够做到这一点。

这是一个相当复杂的问题,答案相当复杂,有很多出错的机会。正如您在评论中所说,您有这样的经度、纬度向量:

'0.5x0.5'
np.arange(-89.75,90.25,0.5)      #[-89.75,-89.25,...,89.25,89.75],  latitudes 
np.arange(0.25,360.25,0.5)       #[0.25,0.75,...,359.25,359.75],    longitudes

或者这个:

'1x1'
np.arange(-90.0,91.0,1.0)         #[-90.0,-89.0,...,89.0,90.0],     latitudes 
np.arange(-180.0,180.0,1.0)       #[-180.0,-179.0,...178.0,179.0],  longitudes

并且您需要将关联的数据集转换为以下格式:

'73x96 (or N48)'
np.arange(-90.0,92.5,2.5)         #[-90.0,-87.5,...,87.5,90.0]      latitudes 
np.arange(0.0,360.00,3.75)        #[0.0,3.75,...,352.5,356.25]      longitudes

或者这个:

'1.25x1.875 (or N96)'
np.array(-90.0,91.25,1.25)        #[-90.0,-88.75,...,90.00]         latitudes 
np.array(0.0,360.00,1.875)        #[0.0,1.875,...,358.125]          longitudes

所有条目均针对网格单元中心。

部分好消息是你不需要做任何插值。我们可以通过重复输入来upsample(纵向和纬度(,即如果我们有一个1*1间隔的数据集,我们可以将其更改为0.5*0.5间隔的数据集,通过重复每一列和每一行,即使我们使用球形网格数据,这对您的数据也是有效的!考虑将一个初始单元格划分为较小的单元格 - 每个新单元格中的密度与原始单元格中的密度相同。我们可以这样做:

data_up = np.repeat(data, 2, axis=0)
data_up = np.repeat(data_up, 2, axis=1)

这是一个很好的方法,因为我们不做任何假设,也不会丢失任何数据。我们稍后将需要这个。

我们可以downsample何时纵向增加单元格的宽度,方法是将单元格相加并平均单元格数量。这是由于纵向相邻(水平(像元中的面积相等。如果我们downsampling网格间距不是原始间距的整数倍,那么首先我们必须 upsample ,如上所述(这是您的要求......

最棘手的事情是向下采样纬度。这是因为这里的密度不同,与这些密度相关的实际面积也不同。处理此问题的方法是:

  1. 上采样到一个新的纬度网格间距,该间距是我们初始纬度网格和所需纬度网格的倍数(如上所述(。
  2. 计算每个单元格的单元格表面积(这是我们需要的公式(。
  3. 将这两个数组相乘,得到上采样数据数组中每个数据单元的总排放量。
  4. 构成新单元的所有总排放单元相加(对整个阵列执行此操作(
  5. 除以该新单元格的总面积(子单元格的所有区域的总和(,对所有新单元格执行此操作。
  6. 就是这样。

需要注意的坏事:

  1. 您的某些数据集之间存在纵向相位差,这可以很繁琐,以确保您正确重新定位数据以允许这样做。

  2. 极细胞,其中latitude = 90 or -90.这些细胞是有问题的,因为它们的纬度高度是所有其他细胞的一半。这必须小心地允许:确保为这些像元计算的面积是正确的,并且当/如果上采样时,pole条目应该只重复一半的次数来反映这一点。

最新更新